<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>granth's blog : Performance</title><link>http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx</link><description>Tags: Performance</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>VSTS Pioneer TFS2010 Dogfood Server: Statistics October 2009</title><link>http://blogs.msdn.com/granth/archive/2009/11/06/vsts-pioneer-tfs2010-dogfood-server-statistics-october-2009.aspx</link><pubDate>Fri, 06 Nov 2009 09:21:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9918469</guid><dc:creator>grantholliday</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/granth/comments/9918469.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9918469</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9918469</wfw:comment><description>&lt;p&gt;&lt;i&gt;(&lt;a href="http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server.aspx"&gt;See this summary on the VSTS Pioneer dogfood server&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/granth/archive/tags/Pioneer+Dogfood/default.aspx"&gt;all the other posts&lt;/a&gt;.)&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;As with the last few months, October was another busy month for dogfooding TFS. Since the Pioneer server has been such a success for Work Item Tracking and Source Control, we’ve really ramped up our efforts to dogfood every single feature as much as we can. The benefits of having everything online really lets us make sure our end-to-end integration is working as well as feel the pain before we share it with our customers. The most notable changes this month are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Each of the different business units within VSTS have setup their own SharePoint MOSS Dashboards with bug trends, etc. &lt;/li&gt;    &lt;li&gt;We’re now using Team Build 2010 with Gated Checkin on our part of the tree (we still have to follow the divisional processes of custom nightly build scripts at this stage) &lt;/li&gt;    &lt;li&gt;We enabled Test Case Management features and are now dogfooding the Test Case Management (TCM) features for our major test passes &lt;/li&gt;    &lt;li&gt;We setup and enabled the Lab Management functionality on our server and we’re starting to dogfood that across the organization as well &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here’s the latest stats:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Recent Users: 915 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Version Control Users: 622 &lt;/li&gt;    &lt;li&gt;Files: 11,053,314 &lt;/li&gt;    &lt;li&gt;Compressed File Sizes: 284,480 &lt;/li&gt;    &lt;li&gt;Uncompressed File Sizes: 870,228 &lt;/li&gt;    &lt;li&gt;Checkins: 29,275 &lt;/li&gt;    &lt;li&gt;Shelvesets: 7,249 &lt;/li&gt;    &lt;li&gt;Merge History: 10,897,164 &lt;/li&gt;    &lt;li&gt;Pending Changes: 13,344 &lt;/li&gt;    &lt;li&gt;Workspaces: 1,607 &lt;/li&gt;    &lt;li&gt;Local Copies: 382,464,960 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Work Item Tracking&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Users with Assigned Work Items: 2,607 &lt;/li&gt;    &lt;li&gt;Total Work Items: 284,813 &lt;/li&gt;    &lt;li&gt;Areas and Iterations: 2,910 &lt;/li&gt;    &lt;li&gt;Work Item Versions: 2,892,664 &lt;/li&gt;    &lt;li&gt;Work Item Attachments: 115,501 &lt;/li&gt;    &lt;li&gt;Work Item Queries: 5,728 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Commands (last 2 weeks in October)&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Work Item opens:&amp;#160; 154,788 &lt;/li&gt;    &lt;li&gt;Work Item queries: 120,537 &lt;/li&gt;    &lt;li&gt;Work Item updates: 40,242 &lt;/li&gt;    &lt;li&gt;Checkins: 2,630 &lt;/li&gt;    &lt;li&gt;Uploads: 10,440 &lt;/li&gt;    &lt;li&gt;Shelves: 4,553 &lt;/li&gt;    &lt;li&gt;Downloads: 251,032 &lt;/li&gt;    &lt;li&gt;Gets: 41,615 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;DevDiv TFS Server&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;On top of enabling all these new scenarios on the Pioneer server, we also managed to get the main DevDiv TFS server upgraded from SQL 2005 to SQL 2008. This was the first step to getting the server to TFS2010. I can’t say it was all smooth sailing, but it looks like we’re through the worst of it now (man, what a fortnight…).&amp;#160; The good news is that all of the extra performance optimizations we had to make to cope with our dataset sizes also made it into TFS2010 product.&lt;/p&gt;  &lt;p&gt;Although no install guide will tell you, I highly recommend you put on &lt;a href="http://support.microsoft.com/kb/973602"&gt;SQL 2008 SP1 CU4&lt;/a&gt; if you’re running a large, busy TFS2008 or TFS2010 server – in the processes of testing the upgrade and after the actual upgrade to SQL 2008, we hit these bugs which the SQL team quickly reacted and fixed for us:&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/967178/"&gt;KB967178&lt;/a&gt; - When you restore a SQL Server 2005 backup file in SQL Server 2008, the operation takes much longer than when you restore the same backup file in SQL Server 2005&amp;#160; (fixed in SQL08 SP1 CU1) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/970823/"&gt;KB970823&lt;/a&gt; - CPU cost increases suspiciously when the number of threads working on the same index increases (fixed in &lt;a href="http://support.microsoft.com/kb/971491/"&gt;SQL08 SP1 CU3&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/970133/"&gt;KB970133&lt;/a&gt; - Backup Log hangs when using compressed backups and the destination drive runs out of disk space. SQL Restart is required (fixed in &lt;a href="http://support.microsoft.com/kb/973602/"&gt;SQL2008 SP1 CU4&lt;/a&gt;)&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now, onto the next Pioneer upgrade.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918469" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/granth/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Administering/default.aspx">VSTS Administering</category><category domain="http://blogs.msdn.com/granth/archive/tags/Pioneer+Dogfood/default.aspx">Pioneer Dogfood</category></item><item><title>TFS2010: SQL Queries for TFS Statistics</title><link>http://blogs.msdn.com/granth/archive/2009/10/23/tfs2010-sql-queries-for-tfs-statistics.aspx</link><pubDate>Fri, 23 Oct 2009 08:27:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9911938</guid><dc:creator>grantholliday</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/granth/comments/9911938.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9911938</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9911938</wfw:comment><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/bharry/archive/tags/TFS+Dogfood+statistics/default.aspx"&gt;Brian has been posting TFS statistics&lt;/a&gt; from the Developer Division dogfood TFS server for many years.&amp;#160; I’ve updated &lt;a href="http://blogs.msdn.com/bharry/archive/2007/12/02/tfs-statistics-update.aspx"&gt;the queries from TFS2008&lt;/a&gt; to work with Team Foundation Server 2010 Beta 2. Here are the statistics for the &lt;a href="http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server.aspx"&gt;TFS2010 Beta 2 server&lt;/a&gt; that we have been using internally since August 2009.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server-statistics-august-2009.aspx"&gt;VSTS Pioneer TFS2010 Dogfood Server: Statistics August 2009&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/granth/archive/2009/10/19/vsts-pioneer-tfs2010-dogfood-server-statistics-september-2009.aspx"&gt;VSTS Pioneer TFS2010 Dogfood Server: Statistics September 2009&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/granth/archive/tags/Pioneer+Dogfood/default.aspx"&gt;Other Pioneer TFS2010 blog posts&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;The queries&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;With the default permissions in SQL, mere mortals will not have enough access to run these queries. In fact, only TFS administrators should be able to even connect to SQL at all.&amp;#160; To run these queries, you essentially need db_datareader rights on the Tfs_Configration and any Tfs_Collection* databases that you want statistics on.&lt;/p&gt;  &lt;p&gt;In general, you do NOT want to query the TFS operational databases. The only supported API is the Microsoft.TeamFoundation.* Object Model. If you build applications that read the SQL store directly, you are likely to impact TFS performance and it is likely to break in the next version if the database schema changes.&amp;#160; &lt;strong&gt;You’ve been warned!&amp;#160; &lt;/strong&gt;(Running these queries are OK periodically though :)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;-- Change this to the name of your collection DB. You’ll need to run these queries for each of your collection DBs.     &lt;br /&gt;USE Tfs_DefaultCollection       &lt;br /&gt;GO &lt;/p&gt;    &lt;p&gt;-- Recent Users      &lt;br /&gt;select count(distinct IdentityName) as [Recent Users] from tbl_Command with (nolock) &lt;/p&gt;    &lt;p&gt;-- Users with Assigned Work Items      &lt;br /&gt;select count(distinct [System.AssignedTo]) AS [Users with Assigned Work Items] from WorkItemsAreUsed with (nolock) &lt;/p&gt;    &lt;p&gt;-- Version Control Users      &lt;br /&gt;select COUNT(*) AS [Version Control Users] from [Tfs_Configuration].[dbo].tbl_security_identity_cache as ic JOIN tbl_Identity as i ON i.TeamFoundationId=ic.tf_id where ic.is_group = 0 &lt;/p&gt;    &lt;p&gt;-- Total Work Items      &lt;br /&gt;select count(*) AS [Total Work Items] from WorkItemsAreUsed with (nolock) &lt;/p&gt;    &lt;p&gt;-- Areas and Iterations      &lt;br /&gt;select count(*) AS [Areas and Iterations] from tbl_nodes with (nolock) &lt;/p&gt;    &lt;p&gt;-- Work Item Versions      &lt;br /&gt;select count(*) AS [Work Item Versions] from (select [System.Id] from WorkItemsAreUsed with (nolock) union all select [System.Id] from WorkItemsWereUsed with (nolock)) x       &lt;br /&gt;-- Work Item Attachments       &lt;br /&gt;select count(*) AS [Work Item Attachments] from WorkItemFiles with (nolock) where FldID = 50       &lt;br /&gt;-- Work Item Queries       &lt;br /&gt;select count(*) AS [Work Item Queries] from QueryItems with (nolock) &lt;/p&gt;    &lt;p&gt;-- Files      &lt;br /&gt;select count(*) as [Files] from tbl_VersionedItem vi with (nolock) join tbl_Version v with (nolock) on v.ItemId = vi.ItemId where VersionTo = 2147483647 &lt;/p&gt;    &lt;p&gt;-- Compressed File Sizes      &lt;br /&gt;select (sum(convert(bigint,OffsetTo - OffsetFrom + 1)) / (1024 * 1024)) AS [Compressed File Sizes] from tbl_Content with (nolock) &lt;/p&gt;    &lt;p&gt;-- Uncompressed File Sizes      &lt;br /&gt;select (sum(FileLength) / (1024 * 1024)) AS [Uncompressed File Sizes] from tbl_File with (nolock) &lt;/p&gt;    &lt;p&gt;-- Checkins      &lt;br /&gt;select max(ChangeSetId) AS [Checkins] from tbl_ChangeSet with (nolock) &lt;/p&gt;    &lt;p&gt;-- Shelvesets      &lt;br /&gt;select COUNT(*) AS [Shelvesets] from tbl_Workspace with (nolock) where type='1' &lt;/p&gt;    &lt;p&gt;-- Merge History      &lt;br /&gt;select SUM(st.row_count) AS [Merge History] from sys.dm_db_partition_stats st WHERE object_name(object_id) = 'tbl_MergeHistory' AND (index_id &amp;lt; 2) &lt;/p&gt;    &lt;p&gt;-- Pending Changes      &lt;br /&gt;select count(*) AS [Pending Changes] from tbl_PendingChange pc with (nolock) join tbl_Workspace w with (nolock) on pc.WorkspaceId = w.WorkspaceId where w.Type = 0       &lt;br /&gt;-- Workspaces       &lt;br /&gt;select COUNT(*) AS [Workspaces] from tbl_Workspace with (nolock) where type='0'       &lt;br /&gt;-- Local Copies       &lt;br /&gt;select SUM(st.row_count) AS [Local Copies] from sys.dm_db_partition_stats st WHERE object_name(object_id) = 'tbl_LocalVersion' AND (index_id &amp;lt; 2) &lt;/p&gt;    &lt;p&gt;-- Command Counts      &lt;br /&gt;select Command, count(*) as [Execution Count] from tbl_Command with (nolock) WHERE Command IN ('QueryWorkitems', 'Update', 'GetWorkItem', 'Get', 'VCDownloadHandler', 'Checkin', 'Upload', 'Shelve') GROUP BY Command, Application ORDER BY [Application],[Command] &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;These are the core statistics to get you started. I need to add in some more on Team Build, Web Access, Excel &amp;amp; Project usage, etc. Let me know what other statistics you think would be useful.&lt;/p&gt;  &lt;p&gt;If you’d like to share your statistics with me and/or the TFS team, send me a link or &lt;a href="http://blogs.msdn.com/granth/contact.aspx"&gt;email them privately&lt;/a&gt;.&amp;#160; We’d love to know what sort of usage patterns people are using the product in.&lt;/p&gt;  &lt;p&gt;I’m also working on a plugin for the forthcoming TFS Best Practices Analyzer that will allow you to run these queries on a schedule and publish your own TFS statistics. By running it on a schedule, you will be able to track growth in size and usage over time and help you do some capacity planning. Stay tuned for that.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9911938" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/granth/archive/tags/Pioneer+Dogfood/default.aspx">Pioneer Dogfood</category></item><item><title>VSTS Pioneer TFS2010 Dogfood Server: Statistics August 2009</title><link>http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server-statistics-august-2009.aspx</link><pubDate>Thu, 27 Aug 2009 21:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9887468</guid><dc:creator>grantholliday</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/granth/comments/9887468.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9887468</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9887468</wfw:comment><description>&lt;P&gt;&lt;I&gt;(This blog post is part of a series of posts on the new &lt;A href="http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server.aspx" mce_href="http://blogs.msdn.com/granth/archive/2009/08/27/vsts-pioneer-tfs2010-dogfood-server.aspx"&gt;VSTS Pioneer TFS dogfood server&lt;/A&gt;.)&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;Everybody loves statistics, so here are the statistics for the first month on the VSTS Pioneer server.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Recent Users: 415&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Work Item Tracking&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Users with Assigned Work Items: 2,454&lt;/LI&gt;
&lt;LI&gt;Work Items: 111,319&lt;/LI&gt;
&lt;LI&gt;Areas &amp;amp; Iterations: 2,811&lt;/LI&gt;
&lt;LI&gt;Work Item Versions: 1,056,416&lt;/LI&gt;
&lt;LI&gt;Work Item Attachments: 50,833&lt;/LI&gt;
&lt;LI&gt;Work Item Queries: 2,965&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Version Control&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Files &amp;amp; Folders: 8,561,565&lt;/LI&gt;
&lt;LI&gt;Compressed File Sizes (MB): 325,080&lt;/LI&gt;
&lt;LI&gt;Uncompressed File Sizes (MB): 856,859&lt;/LI&gt;
&lt;LI&gt;Checkins: 18,867&lt;/LI&gt;
&lt;LI&gt;Shelvesets: 1,982&lt;/LI&gt;
&lt;LI&gt;Merge History: 1,789,333&lt;/LI&gt;
&lt;LI&gt;Pending Changes: 48,155&lt;/LI&gt;
&lt;LI&gt;Workspaces: 727&lt;/LI&gt;
&lt;LI&gt;Local Copies: 184,231,208&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;These statistics are captured by using the TFS Best Practices Analyzer and a custom configuration file. The configuration tells the BPA tool to run a series of &lt;A href="http://blogs.msdn.com/bharry/archive/2007/12/02/tfs-statistics-update.aspx" mce_href="http://blogs.msdn.com/bharry/archive/2007/12/02/tfs-statistics-update.aspx"&gt;SQL queries&lt;/A&gt; and dump the results to an XML file. I have then created an XSLT that transforms the results into a more user-friendly HTML file. The BPA tool is then scheduled to run every night and generate a fresh set of statistics. I’m working with the TFS BPA team to get this configuration built into the next version of the BPA tool – I don’t have an ETA on when that will ship, but stay tuned.&lt;/P&gt;
&lt;P&gt;This month I’ve also pulled the last 30 days of PerfMon counters to see how our hardware choices are holding up. If you’d like to setup something like this for yourself, have a look at my &lt;A href="http://blogs.msdn.com/granth/archive/2008/09/23/relogging-perfmon-binary-log-files-to-sql.aspx" mce_href="http://blogs.msdn.com/granth/archive/2008/09/23/relogging-perfmon-binary-log-files-to-sql.aspx"&gt;previous&lt;/A&gt; &lt;A href="http://blogs.msdn.com/granth/archive/2008/11/07/querying-perfmon-data-from-sql.aspx" mce_href="http://blogs.msdn.com/granth/archive/2008/11/07/querying-perfmon-data-from-sql.aspx"&gt;posts&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Disk Performance&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Things are looking OK on the IO front. 95% of the time we’re pushing 45MB/sec (Read) and 33MB/sec (Write) or less to and from our storage. The response time is &amp;lt;40ms which is nothing to worry about for the configuration we have.&lt;/P&gt;
&lt;P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=0 width=549&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;&lt;STRONG&gt;LogicalDisk(_Total)&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P&gt;&lt;B&gt;50th Percentile &lt;/B&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P&gt;&lt;B&gt;95th Percentile &lt;/B&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P&gt;&lt;B&gt;99th Percentile &lt;/B&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;Avg. Disk sec/Read&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P align=right&gt;0.004 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P align=right&gt;0.039 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P align=right&gt;0.371 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;Avg. Disk sec/Write&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P align=right&gt;0.003 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P align=right&gt;0.023 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P align=right&gt;0.063 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;Disk Read Bytes/sec&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P align=right&gt;2,142,548 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P align=right&gt;44,926,021 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P align=right&gt;94,273,782 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;Disk Write Bytes/sec&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P align=right&gt;1,908,518 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P align=right&gt;33,029,252 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P align=right&gt;70,802,346 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=bottom width=167&gt;
&lt;P&gt;Avg. Disk Bytes/Transfer&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=118&gt;
&lt;P align=right&gt;42,867 &lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=135&gt;
&lt;P align=right&gt;133,887&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=bottom width=128&gt;
&lt;P align=right&gt;436,920 &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Memory&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;The memory usage on our SQL server has remained completely constant. This is because SQL is set to use a fixed amount and Analysis Services &amp;amp; Reporting Services share the rest.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;CPU Performance&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;(Avg: 32%). &lt;/EM&gt;The majority of this usage is SQL Server, with a small portion going to Analysis Services &amp;amp; Reporting Services. It’s nice to see that we still have plenty of capacity left for the usage to grow.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/VSTSPioneerTFS2010DogfoodServerStatistic_CEFF/clip_image001_2.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/VSTSPioneerTFS2010DogfoodServerStatistic_CEFF/clip_image001_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/VSTSPioneerTFS2010DogfoodServerStatistic_CEFF/clip_image001_thumb.png" width=550 height=336 mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/VSTSPioneerTFS2010DogfoodServerStatistic_CEFF/clip_image001_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;That’s all for statistics, stay tuned for more next month.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9887468" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/granth/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Version+Control/default.aspx">VSTS Version Control</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Developing/default.aspx">VSTS Developing</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Administering/default.aspx">VSTS Administering</category><category domain="http://blogs.msdn.com/granth/archive/tags/Pioneer+Dogfood/default.aspx">Pioneer Dogfood</category></item><item><title>TFS Performance Report Pack now works with SSRS2005</title><link>http://blogs.msdn.com/granth/archive/2009/06/23/tfs-performance-report-pack-now-works-with-ssrs2005.aspx</link><pubDate>Wed, 24 Jun 2009 06:40:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9800777</guid><dc:creator>grantholliday</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/granth/comments/9800777.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9800777</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9800777</wfw:comment><description>&lt;p&gt;Back in February, I released some of the reports that were created for our internal TFS servers on my blog as the &lt;a href="http://blogs.msdn.com/granth/archive/2009/02/03/announcing-tfs-performance-report-pack.aspx"&gt;TFS Performance Report Pack&lt;/a&gt;. I got countless emails and comments on the fact that some of them didn’t work with SQL Reporting Services 2005. &lt;/p&gt;  &lt;p&gt;Fortunately, Jim Saunders from the &lt;a href="http://blogs.msdn.com/dstfs/"&gt;Developer Support team&lt;/a&gt; at Microsoft (who have a great blog!) has re-created the three reports in the pack that required SQL2008 Reporting Services. Just download a different version of the reports from &lt;a href="http://blogs.msdn.com/dstfs/attachment/9792042.ashx"&gt;here&lt;/a&gt; and replace the ones in the original zip file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/dstfs/archive/2009/06/19/the-tfs-performance-report-pack-and-sql-server-2005-reporting-services.aspx"&gt;From the support team blog&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;...He lists SQL Server 2008 Reporting Services as a requirement, with a note that they &lt;em&gt;should&lt;/em&gt; work in SSRS 2005. It turns out some of the reports function under both SSRS 2008 and 2005, some do not. Several posters have mentioned incompatibilities with some reports and SSRS 2005.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;These reports are compatible with either SSRS version:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Server Status - Historical Performance Trends.rdl &lt;/li&gt;      &lt;li&gt;Server Status - Recent Performance Trends.rdl &lt;/li&gt;      &lt;li&gt;Server Status - Top Users Bypassing Proxies.rdl&lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;These reports require SSRS 2008:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Execution Time Summary.rdl &lt;/li&gt;      &lt;li&gt;Execution Time for User.rdl &lt;/li&gt;      &lt;li&gt;Server Status - Source Control Request Queue.rdl&lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;I have created versions of the three reports above that are functionally similar to Grant's reports, but also work with SSRS 2005. You can download my updated reports &lt;a href="http://blogs.msdn.com/dstfs/attachment/9792042.ashx"&gt;here&lt;/a&gt;. To use my reports, install Grant's TFS Performance Report Pack, and replace the three reports with the versions in the zip file I provided. &lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9800777" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Planning+_2600_amp_3B00_+Tracking/default.aspx">VSTS Planning &amp;amp; Tracking</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Large Team Foundation Server Performance Characteristics</title><link>http://blogs.msdn.com/granth/archive/2009/05/21/large-team-foundation-server-performance-characteristics.aspx</link><pubDate>Thu, 21 May 2009 20:27:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9634046</guid><dc:creator>grantholliday</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/granth/comments/9634046.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9634046</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9634046</wfw:comment><description>&lt;p&gt;Since joining Microsoft, I’ve become intimately familiar with running a TFS server for ~3,500 users in Developer Division and the performance characteristics of it.&lt;/p&gt;  &lt;p&gt;One thing I’ve learnt is that Performance Counters rule. You might observe the server being “slow” and you might notice that it “takes a while” to do certain operations – but you need evidence to back up your claims before anybody will take you seriously.&amp;#160; The evidence that everybody has access to, is reliable and people take seriously are the perf counters built into windows.&lt;/p&gt;  &lt;p&gt;See my previous posts on &lt;a href="http://blogs.msdn.com/granth/archive/2008/09/23/relogging-perfmon-binary-log-files-to-sql.aspx"&gt;Relogging Perfmon binary log files to SQL&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/granth/archive/2008/11/07/querying-perfmon-data-from-sql.aspx"&gt;Querying Perfmon data from SQL&lt;/a&gt; for more details on setting up performance counter logs.&lt;/p&gt;  &lt;p&gt;If I think about the problems we’ve overcome in the last 12 months, the issues come down to these:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;IO&lt;/strong&gt; – If the “LogicalDisk\Avg. Disk sec/Transfer” perf counter for any of your disk drives is more than &lt;font color="#ff0000"&gt;0.030 (30ms)&lt;/font&gt; – then you’re hosed. This counter is a primary indicator of disk latency. Get that fixed before doing anything. (see below for more details) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Workspace Mappings&lt;/strong&gt; – If you have unnecessary paths in your workspace mappings, then Get() will be much slower than it needs to be. E.g. DON’T map $/ to C:\Code and think that everything will be good. A root mapping isn’t truly a bad thing but if you aren’t careful it can lead to unexpected and potentially slower results. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Latency/Download requests&lt;/strong&gt; – Proxy servers help here by offloading Download() requests from the main server.&amp;#160; Doesn’t help Work Item tracking. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt; – Processor performance isn’t linear. If you’re running higher than ~70% CPU for periods of time, then you need to increase your processing capacity. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SQL indexes/fragmentation&lt;/strong&gt; – Sometimes the TFS SQL Jobs that update statistics &amp;amp; rebuild/reorganize indexes stop running, or don’t run for whatever reason. Check that the SQL jobs are running successfully and check for index fragmentation. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The tools you can use to diagnose performance issues are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;PerfMon&lt;/strong&gt;. Setup a perfmon counter log for the important counters. Track them and work out what’s “normal” for your load/environment &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TfsActivityLogging database&lt;/strong&gt;.&amp;#160; Dive into this database and look for trends, heavy users, heavy tools, etc.&amp;#160; Understand where your load is coming from.       &lt;ul&gt;       &lt;li&gt;Download &amp;amp; install my &lt;a href="http://blogs.msdn.com/granth/archive/2009/02/03/announcing-tfs-performance-report-pack.aspx"&gt;TFS Performance Report Pack&lt;/a&gt; and look at the Execution Time Summary report. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TfsServerManager.exe&lt;/strong&gt; (Comes with the &lt;a title="Team Foundation Server Power Tools" href="http://msdn.microsoft.com/en-us/teamsystem/bb980963.aspx"&gt;Team Foundation Server Power Tools&lt;/a&gt;, see &lt;a href="http://blogs.msdn.com/bharry/archive/2007/01/22/tfsservermanager-powertool.aspx"&gt;Brian’s blog for more details&lt;/a&gt;)&amp;#160; &lt;ul&gt;       &lt;li&gt;No shortcut gets created. Run it from &amp;quot;C:\Program Files\Microsoft Team Foundation Server 2008 Power Tools\TfsServerManager.exe&amp;quot; &lt;/li&gt;        &lt;li&gt;If users are reporting a problem, try and catch it while it’s currently executing. Look at the “Source Control Request Queue” report. Is their request on top? &lt;/li&gt;        &lt;li&gt;Run the following query a few times in SQL to see if any blocking is occurring. If the same spid hangs around for a while, run DBCC INPUTBUFFER(spid_here) to see what stored procedure it is and try and match that to a TFS command. e.g. prc_Get = Get() &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT&amp;#160; a.status, a.*      &lt;br /&gt;FROM&amp;#160;&amp;#160;&amp;#160; sys.sysprocesses a       &lt;br /&gt;WHERE&amp;#160;&amp;#160; spid &amp;gt; 50       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; and spid &amp;lt;&amp;gt; @@spid       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; and blocked = 0       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; and EXISTS ( SELECT *       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FROM&amp;#160;&amp;#160; sys.sysprocesses b       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WHERE&amp;#160; b.blocked = a.spid)&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Disk Latency&lt;/h3&gt;  &lt;p&gt;To determine if you are having significant issue with disk latency you should use the following performance counters:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;Object:&lt;/u&gt; [Physical Disk] or [Logical Disk] &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Counter&lt;/u&gt;: [Avg. Disk Sec/Transfer] &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Instance:&lt;/u&gt; Ideally you collect this for individual disks however you may also use [_Total] to identify general issues.&amp;#160; If [_Total] is high then further collections can be taken to isolate the specific disks affected. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Collection Interval&lt;/u&gt;: Ideally you should collect at least every 1 minutes.&amp;#160; The collection should be run for a significant period of time to show it is an ongoing issue and not just a transient spike.&amp;#160; 15 minutes is minimum suggested interval. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Issue Thresholds (seconds)&lt;/u&gt;:       &lt;ul&gt;       &lt;li&gt;&lt;b&gt;&amp;lt; 0.020&lt;/b&gt;: Normal time and no I/O latency issues are apparent &lt;/li&gt;        &lt;li&gt;&lt;b&gt;&amp;gt; 0.00 – 0.050:&lt;/b&gt; You &lt;u&gt;may&lt;/u&gt; somewhat concerned.&amp;#160; Continue to collect and analyze data.&amp;#160; Try to correlate application performance issues to these spikes &lt;/li&gt;        &lt;li&gt;&lt;b&gt;&amp;gt; 0.050 – 0.100:&lt;/b&gt; You are concerned and should escalate to SAN administrators with your data and analysis. Correlate spikes to application performance concerns. &lt;/li&gt;        &lt;li&gt;&lt;b&gt;&amp;gt; 0.100:&lt;/b&gt; You are very concerned and should escalate to SAN administrators.&amp;#160; Correlate spikes to application performance concerns. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Further Reading&lt;/h3&gt;  &lt;p&gt;&lt;img style="margin: 10px; display: inline" title="Microsoft® Windows Server™ 2003 Performance Guide" alt="Microsoft® Windows Server™ 2003 Performance Guide" align="left" src="http://proquestcombo.safaribooksonline.com/images/10002LTI0704/10002LTI0704_xs.jpg" width="76" height="98" /&gt;If you want to understand more about Windows server fundamentals, take a look at the Microsoft Windows Server 2003 Performance Guide. It was published in 2005, but it is a valuable resource on PerfMon, Relog, Performance troubleshooting and performance monitoring. Most of the counters and tools are still valid for Windows 2008 and beyond.&lt;/p&gt;  &lt;p&gt;You can &lt;a href="http://proquestcombo.safaribooksonline.com/10002LTI0704"&gt;read it online&lt;/a&gt; or buy the print version from your &lt;a href="http://www.microsoft.com/learning/en/us/books/8856.aspx"&gt;favorite online book store&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9634046" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+Proxy/default.aspx">TFS Proxy</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Announcing TFS Performance Report Pack</title><link>http://blogs.msdn.com/granth/archive/2009/02/03/announcing-tfs-performance-report-pack.aspx</link><pubDate>Wed, 04 Feb 2009 03:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9391592</guid><dc:creator>grantholliday</dc:creator><slash:comments>30</slash:comments><comments>http://blogs.msdn.com/granth/comments/9391592.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9391592</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9391592</wfw:comment><description>&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Update 6/23/2009&lt;/strong&gt;: Due to popular demand, Jim from the Developer Support team at Microsoft has re-created the three reports that required SQL2008 Reporting Services. See the &lt;/font&gt;&lt;a href="http://blogs.msdn.com/dstfs/archive/2009/06/19/the-tfs-performance-report-pack-and-sql-server-2005-reporting-services.aspx"&gt;&lt;font color="#ff0000"&gt;support team blog for more details&lt;/font&gt;&lt;/a&gt;&lt;font color="#ff0000"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I’m on the team that runs the busiest Team Foundation Server at Microsoft. The Developer Division instance has over 3,500 active users and processes over 10,000,000 source control and work item tracking requests per day (not including the requests that our 5 proxy servers handle).&lt;/p&gt;  &lt;p&gt;We have a responsibility to ensure that the server is performing as expected and to identify any efficiencies that can be made in the server or the tools.&amp;#160; To do this, we have created a number of reports that we use ourselves and make available to our own users.&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;h3&gt;Download&lt;/h3&gt;  &lt;p&gt;We’re now making these reports available to you to install on your own server and monitor your TFS server’s performance. The plan is to eventually roll these into a power tool release or a subsequent release of VSTS but I’ll let you know more about that when it happens.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download from here &lt;a href="http://blogs.msdn.com/granth/attachment/9391592.ashx" mce_href="http://blogs.msdn.com/granth/attachment/9391592.ashx"&gt;TFS Performance Report Pack.zip&lt;/a&gt; (~250Kb)&lt;/li&gt;    &lt;li&gt;&lt;font color="#ff0000"&gt;Download the SQL Server 2005 compatible reports from here &lt;/font&gt;&lt;a href="http://blogs.msdn.com/dstfs/attachment/9792042.ashx"&gt;&lt;font color="#ff0000"&gt;SRS2005CompatibleReports.zip&lt;/font&gt;&lt;/a&gt;&lt;font color="#ff0000"&gt;&amp;#160; (~13Kb)&lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Requirements&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;SQL Server Reporting Services&lt;/li&gt;    &lt;li&gt;A user with read-only access to the TfsActivityLogging database &lt;/li&gt;    &lt;li&gt;A shared datasource to connect the report to (see below) &lt;/li&gt;    &lt;li&gt;Command Logging enabled - This logging is enabled by default in TFS 2008. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;In TFS 2005 you will have to &lt;a href="http://msdn.microsoft.com/en-us/library/ms400784(VS.80).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms400784(VS.80).aspx"&gt;enable the commandLogging flag in the Global Web.Config file&lt;/a&gt; (and the query for the report will be a little different). &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt;Installing&lt;/h3&gt;  &lt;p&gt;The report pack consists of a ZIP file with a number of Report Definition (*.rdl) files.&amp;#160; These files are designed to be deployed onto your existing TFS reporting server, e.g. &lt;a href="http://your-tfsserver/Reports/" mce_href="http://your-tfsserver/Reports/"&gt;http://your-tfsserver/Reports/&lt;/a&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;As a TFS administrator, extract the files to your PC &lt;/li&gt;    &lt;li&gt;Open &lt;a href="http://your-tfsserver/Reports/" mce_href="http://your-tfsserver/Reports/"&gt;http://your-tfsserver/Reports/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Create a new folder in Reporting Services called “Server Status” &lt;/li&gt;    &lt;li&gt;Create a new shared data source called “TfsActivityReportDS” and set the connection string to:      &lt;ol&gt;       &lt;li&gt;&lt;strong&gt;Data Source=localhost;Initial Catalog=TfsActivityLogging&lt;/strong&gt; &lt;/li&gt;        &lt;li&gt;Credentials: domain\user that has access to the TfsActivityLogging database &lt;/li&gt;        &lt;li&gt;Use as windows credentials when connecting to the data source &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here’s an overview of what the reports look like and what questions you can answer with them.&lt;/p&gt;  &lt;h3&gt;Execution Time Summary&lt;/h3&gt;  &lt;p&gt;This report visualizes the load, in this case reflected by total execution time, on the server from two axis: users and commands.&lt;/p&gt;  &lt;p&gt;Use this report when you want to know:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Which commands account for the largest load on the server? &lt;/li&gt;    &lt;li&gt;Which tools / or users are putting the biggest load on the server? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb.png" width="240" height="189" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb.png" /&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_1.png" width="244" height="230" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_2.png" width="244" height="176" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Server Status - Source Control Request Queue&lt;/h3&gt;  &lt;p&gt;Source Control is undoubtedly the application that consumes the most resources on an Application Lifecycle Management (ALM) Server. Across the day, a series of requests get queued to be processed as transactions are committed to the database. This report provides a view into that queue.&lt;/p&gt;  &lt;p&gt;Use this report when you want to know:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If a request is blocking source control operations and for how long &lt;/li&gt;    &lt;li&gt;How healthy is the performance of version control on this hardware? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Lots of red means that you have some long running operations and you may have some problems.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_3.png" width="152" height="244" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_3.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Server Status - Top Users Bypassing Proxies&lt;/h3&gt;  &lt;p&gt;In the past, I’ve blogged a query to get this information – &lt;a href="http://blogs.msdn.com/granth/archive/2008/09/16/how-many-users-are-not-using-a-tfs-proxy-server.aspx" mce_href="http://blogs.msdn.com/granth/archive/2008/09/16/how-many-users-are-not-using-a-tfs-proxy-server.aspx"&gt;How many user’s are not using a TFS Proxy server?&lt;/a&gt; Internally, we have setup a scheduled subscription that emails this report twice a week.&lt;/p&gt;  &lt;p&gt;IT departments strive to provide the best level of service to their users. Hardware requirements planning and setting up proxies are activities that ensure optimal performance for their internal teams when interacting with team Foundation Server. This report allows administrators a view into which users are not complying with internal guidelines and hence decreasing overall server performance.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_4.png" width="222" height="244" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_4.png" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Server Status - Historical Performance Trends&lt;/h3&gt;  &lt;p&gt;This report serves as a summary of the average response time for two of the Team Foundation Server subsystems: Work Item Tracking and Version Control&lt;/p&gt;  &lt;p&gt;Use this report when you want to know:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;How long are users, on average, waiting for a subsystem to process their request &lt;/li&gt;    &lt;li&gt;Which days of the week are the most critical when it comes to performance &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002_thumb.jpg" width="244" height="171" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002_thumb.jpg" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004_thumb.jpg" width="244" height="165" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004_thumb.jpg" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_5.png" width="244" height="155" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_5.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Server Status - Recent Performance Trends&lt;/h3&gt;  &lt;p&gt;This report provides more data granularity about the performance of the server. We start with a view into the server average response time, now looking at the entire picture instead of broken down by subsystem. We then follow with charts relating information about version control downloads and average response time distributions for the same time period.&lt;/p&gt;  &lt;p&gt;Use this report when you want to know:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The correlation between degraded server performance and average response times by the subsystems &lt;/li&gt;    &lt;li&gt;How does a large number of downloads affect overall server performance &lt;/li&gt;    &lt;li&gt;Overall health indicator of the server &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002%5B4%5D.jpg" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002%5B4%5D_thumb.jpg" width="244" height="148" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image002%5B4%5D_thumb.jpg" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004%5B4%5D.jpg" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004[4]" border="0" alt="clip_image004[4]" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004%5B4%5D_thumb.jpg" width="244" height="117" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/clip_image004%5B4%5D_thumb.jpg" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_6.png" width="244" height="198" mce_src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnnouncingTFSPerformanceReportPack_AFF5/image_thumb_6.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I hope that you find these reports useful. Please send any questions or feedback as comments to this post, or &lt;a href="http://blogs.msdn.com/granth/contact.aspx" mce_href="http://blogs.msdn.com/granth/contact.aspx"&gt;contact me via email&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9391592" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/granth/attachment/9391592.ashx" length="259047" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/VSTS+Planning+_2600_amp_3B00_+Tracking/default.aspx">VSTS Planning &amp;amp; Tracking</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Analyzing TFS performance with TfsActivityLogging and custom User Agents</title><link>http://blogs.msdn.com/granth/archive/2009/01/23/analyzing-tfs-performance-with-tfsactivitylogging-and-custom-user-agents.aspx</link><pubDate>Sat, 24 Jan 2009 10:13:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9373765</guid><dc:creator>grantholliday</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/granth/comments/9373765.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9373765</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9373765</wfw:comment><description>&lt;p&gt;Within Developer Division at Microsoft, we run a &lt;a href="http://blogs.msdn.com/bharry/archive/2009/01/13/jan-09-devdiv-dogfood-statistics.aspx"&gt;very busy server&lt;/a&gt;. We’re up to almost ~3,600 active users.&lt;/p&gt;  &lt;p&gt;Just over 6 months ago, the custom tools that our build labs were using were putting an extraordinary strain on the server. More than 40% of the load on the server was just from these tools. After some fairly deep analysis into what the tools were doing and how they were using TFS, we identified some inefficiencies and were able to address them in the tools.&lt;/p&gt;  &lt;p&gt;The two most useful resources for tracking down these issues and addressing them were:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TfsActivityLogging database&lt;/li&gt;    &lt;li&gt;Setting a custom User Agent string&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These are examples of the reports that we came up with to track our progress at making the efficiencies. They show total execution time from the TfsActivityLogging database split up by user and by command. You can also select a particular user and drill down and see just their commands. This showed us where our efforts were best spent.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Execution Time Summary Report - By User" border="0" alt="Execution Time Summary Report - By User" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_thumb_1.png" width="244" height="192" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Execution Summary Time Report - By Command" border="0" alt="Execution Summary Time Report - By Command" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_thumb_2.png" width="244" height="176" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then the report also shows the details with actual Execution Time, Execution Count and Average Response Time (Time divided by Count) for each command.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Execution Time Summary Report - Details" border="0" alt="Execution Time Summary Report - Details" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/AnalyzingTFSperformancewithTfsActivityLo_14696/image_thumb.png" width="404" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here’s a sample SQL query you can use to start looking at this data yourself:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Application,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Command,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SUM(ExecutionTime/1000) as TotalTime_ms,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SUM(ExecutionCount)      &lt;br /&gt;FROM TfsActivityLogging.dbo.tbl_Command with (nolock)      &lt;br /&gt;GROUP BY Application, Command&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now I know that as soon as I post this, I’m going to get flooded with comments/emails asking “Can you send me the report file?”. Don’t worry, I’m working with &lt;a href="http://blogs.msdn.com/mrod/"&gt;Mario&lt;/a&gt; and we should be able to get some goodness posted up on Codeplex.&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;Setting a custom user agent for the TFS Object Model&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;Once we had identified which users were contributing the most load, we needed to map their scripts and tools to TFS commands.&lt;/p&gt;  &lt;p&gt;One of the columns within the TfsActivityLogging database that gets logged with every request to TFS is the “UserAgent” column. It turns out that you can set this to an arbitrary value using the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.adminconstants.applicationname.aspx"&gt;TeamFoundationServer.ApplicationName property&lt;/a&gt; in the TFS object model.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;using System;     &lt;br /&gt;using System.Text;      &lt;br /&gt;using Microsoft.TeamFoundation.Client;      &lt;br /&gt;using Microsoft.TeamFoundation.VersionControl.Client;      &lt;br /&gt;namespace ConsoleApplication1      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; class Program      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static void Main(string[] args)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(&amp;quot;&lt;a href="http://tfs-server:8080%22"&gt;http://tfs-server:8080&amp;quot;&lt;/a&gt;, new UICredentialsProvider());      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;font color="#ff0000"&gt; TeamFoundationServer.ApplicationName = &amp;quot;MyApplication v1.1 - Phase1&amp;quot;; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Changeset cs = vcs.GetChangeset(1);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;By setting this value dynamically throughout the custom scripts, we were able to map stages in the build process to groups of actual TFS commands. Then we were able to refactor the build scripts and optimize them for better TFS performance.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9373765" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>TFS Management Pack for System Center Operations Manager 2007 shipped</title><link>http://blogs.msdn.com/granth/archive/2008/11/26/tfs-management-pack-for-system-center-operations-manager-2007-shipped.aspx</link><pubDate>Thu, 27 Nov 2008 05:01:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9145652</guid><dc:creator>grantholliday</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/granth/comments/9145652.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9145652</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9145652</wfw:comment><description>&lt;p&gt;The VSTS Rangers have shipped the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28c745b5-28cc-474a-a5fd-944c246d7727&amp;amp;amp;displaylang=en&amp;amp;displaylang=en"&gt;TFS 2008 Management Pack for SCOM2007&lt;/a&gt;. It is also published in &lt;a href="http://technet.microsoft.com/en-us/opsmgr/cc462785.aspx"&gt;the official System Center Operations Manager 2007 Catalog on TechNet&lt;/a&gt; (choose “System Center Operations Manager 2007” from the dropdown list and enter “TFS” as keyword).&lt;/p&gt;  &lt;p&gt;It takes out a new record for the longest name of a Microsoft download: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28c745b5-28cc-474a-a5fd-944c246d7727&amp;amp;amp;displaylang=en&amp;amp;displaylang=en"&gt;Visual Studio Team System 2008 Team Foundation Server Management Pack for System Center Operations Management 2007 – English&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The VSTS Rangers are a community of Microsoft field staff that are experts in VSTS. Their mission is to create re-usable solutions to aid adoption problems and influence future versions of VSTS based on lessons learned.&lt;/p&gt;  &lt;p&gt;In the past, they’ve shipped other solutions such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.codeplex.com/pstfsconnector"&gt;Project Server 2007 and VSTS Connector&lt;/a&gt;,&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/BranchingGuidance"&gt;VSTS Branching and Merging Best Practices&lt;/a&gt;, &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/WCFLoadTest"&gt;WCF Load Test Tool,&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/tfstotfsmigration"&gt;TFS to TFS migration tool&lt;/a&gt;, and the&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb663036(VS.80).aspx"&gt;TFS Operations Guide&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This product is a significant improvement for monitoring and management of TFS 2008.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Overview&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="Description"&gt;&lt;/a&gt;The Team Foundation Server (TFS) 2008 Management Pack monitors exposed services of TFS. This management pack includes event rules and monitors. It is designed to proactively monitor quality and availability of TFS services and even automate recovery in some scenarios. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Feature Summary &lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Auto discovery of TFS components &lt;/li&gt;    &lt;li&gt;Leverages ASP.NET MP and SQL MP &lt;/li&gt;    &lt;li&gt;Implements containment hierarchy reflecting logical architecture of the Product &lt;/li&gt;    &lt;li&gt;Implements a proper health model using Monitors &lt;/li&gt;    &lt;li&gt;Contains tasks, diagnostic and recovery for certain failures &lt;/li&gt;    &lt;li&gt;Events indicating service outages &lt;/li&gt;    &lt;li&gt;Alerts indicating configuration issues and connected data source changes &lt;/li&gt;    &lt;li&gt;Verification that all dependant services are running &lt;/li&gt;    &lt;li&gt;Targeted running of BPA against TFS Servers from Operator Console &lt;/li&gt;    &lt;li&gt;New monitoring capabilities can be easily added&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’m looking forward to hearing what people are doing with it. Please &lt;a href="http://blogs.msdn.com/granth/contact.aspx"&gt;contact me&lt;/a&gt; with any feedback you have of this in your environment.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9145652" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Querying Perfmon data from SQL</title><link>http://blogs.msdn.com/granth/archive/2008/11/07/querying-perfmon-data-from-sql.aspx</link><pubDate>Sat, 08 Nov 2008 03:41:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9053391</guid><dc:creator>grantholliday</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/granth/comments/9053391.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9053391</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9053391</wfw:comment><description>&lt;p&gt;In a previous post I talked about &lt;a href="http://blogs.msdn.com/granth/archive/2008/09/23/relogging-perfmon-binary-log-files-to-sql.aspx"&gt;Relogging Perfmon binary log files to SQL&lt;/a&gt;. The next obvious step is to query the data from the database.&lt;/p&gt;  &lt;p&gt;There are two ways to do this:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Use Perfmon itself to connect to the SQL data source&lt;/li&gt;    &lt;li&gt;Use another tool to query the SQL data source directly&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;1. Using Performance Monitor&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Once you open Performance Monitor, press the &lt;strong&gt;View Log Data&lt;/strong&gt; button (Ctrl-L):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_4.png"&gt;&lt;img style="display: inline" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_thumb_1.png" width="551" height="223" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then on the &lt;strong&gt;Source&lt;/strong&gt; tab, if you have the ODBC System DSN configured to connect to your performance database, it will show up.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_2.png"&gt;&lt;img style="display: inline" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_thumb.png" width="396" height="427" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This allows you to view the log files directly from SQL, just as if you had loaded the binary log files.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. Querying SQL directly&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;At first glance, the schema doesn’t seem very intuitive. But with a little digging, it’s not too bad.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_6.png"&gt;&lt;img style="display: inline" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_thumb_2.png" width="570" height="234" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Whenever you use PerfMon or relog to log to a database, it automatically sets up this schema for you. There are three tables:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;DisplayToID – This lists all the log sets that are in the database&lt;/li&gt;    &lt;li&gt;CounterData – This is where the actual counter values are stored&lt;/li&gt;    &lt;li&gt;CounterDetails – This is where the metadata about each counter / object / instance is stored&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here are some queries that I’ve found useful:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Get all computers that have counter data logged:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT DISTINCT MachineName     &lt;br /&gt;FROM CounterDetails      &lt;br /&gt;ORDER BY MachineName&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Get available object names for a particular computer:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT DISTINCT ObjectName     &lt;br /&gt;FROM CounterDetails      &lt;br /&gt;WHERE MachineName = ‘\\MYSERVER’      &lt;br /&gt;ORDER BY ObjectName&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Get counter names for a particular computer and object:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT DISTINCT CounterName     &lt;br /&gt;FROM CounterDetails      &lt;br /&gt;WHERE MachineName = ‘\\MYSERVER’      &lt;br /&gt;AND ObjectName = ‘Processor’      &lt;br /&gt;ORDER BY CounterName&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Get instance names for a particular computer, object and counter:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT DISTINCT InstanceName     &lt;br /&gt;FROM CounterDetails      &lt;br /&gt;WHERE MachineName = ‘\\MYSERVER’      &lt;br /&gt;AND ObjectName = ‘Processor’      &lt;br /&gt;AND CounterName = ‘% Processor Time’      &lt;br /&gt;ORDER BY InstanceName&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Get counter values for a particular computer, object, counter and instance. Name the column appropriately:&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; CAST(LEFT(CounterDateTime, 16) as smalldatetime) AS CounterDateTime,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; REPLACE(CounterDetails.MachineName,'\\','') AS ComputerName,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; CounterDetails.ObjectName + ISNULL('(' + CounterDetails.InstanceName + ')','') + '\' + CounterDetails.CounterName AS [Counter],      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; CounterData.CounterValue      &lt;br /&gt;FROM CounterData      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; INNER JOIN CounterDetails ON CounterData.CounterID = CounterDetails.CounterID      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; INNER JOIN DisplayToID ON CounterData.GUID = DisplayToID.GUID      &lt;br /&gt;WHERE CounterDetails.ObjectName = 'Processor'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; AND&amp;#160;&amp;#160;&amp;#160; CounterDetails.CounterName = '% Processor Time'      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; AND&amp;#160;&amp;#160;&amp;#160; CounterDetails.MachineName = '\\MYSERVER’      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; AND CounterDetails.InstanceName = '_Total'      &lt;br /&gt;ORDER BY CounterData.CounterDateTime&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There’s a few nuances in the schema which creates complexity in this query. Let me try and explain:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CounterDateTime is a char(24) instead of a datetime. By trimming it to 16 characters, this allows it to be converted to a smalldatetime at the ‘minutes’ resolution – not seconds.&lt;/li&gt;    &lt;li&gt;MachineName includes ‘\\’, we want to trim it to make it look pretty.&lt;/li&gt;    &lt;li&gt;InstanceName can be null. An example is the Memory\Pages/sec object &amp;amp; counter. The instance value for this combination is null. So we only show the instance name if it’s not null.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course now that you have the data being collected, post-processed and queryable in SQL – the next logical step is to make it reportable. Here is a report that I’ve built to display this data. I’ll talk about it more in a future blog post.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_8.png"&gt;&lt;img style="display: inline" title="PerfMon SQL Report" border="0" alt="PerfMon SQL Report" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/QueryingPerfmondatafromSQL_E7AF/image_thumb_3.png" width="570" height="386" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9053391" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/granth/archive/tags/TFS+at+Microsoft/default.aspx">TFS at Microsoft</category><category domain="http://blogs.msdn.com/granth/archive/tags/Other/default.aspx">Other</category><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item><item><title>PerfMon is not collecting LogicalDisk or PhysicalDisk statistics</title><link>http://blogs.msdn.com/granth/archive/2008/11/07/perfmon-is-not-collecting-logicaldisk-or-physicaldisk-statistics.aspx</link><pubDate>Sat, 08 Nov 2008 01:46:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9053213</guid><dc:creator>grantholliday</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/granth/comments/9053213.aspx</comments><wfw:commentRss>http://blogs.msdn.com/granth/commentrss.aspx?PostID=9053213</wfw:commentRss><wfw:comment>http://blogs.msdn.com/granth/rsscomments.aspx?PostID=9053213</wfw:comment><description>&lt;p&gt;If the LogicalDisk or PhysicalDisk objects don’t appear in PerfMon for you, then they may have been disabled automatically by the performance monitoring API.&lt;/p&gt;  &lt;p&gt;This is what Mark Friedman has to say about it in &lt;a title="Microsoft Windows Server 2003 Performance Guide" href="http://www.amazon.com/Microsoft-Windows-Server-Performance-Guide/dp/B000JCJJU6/"&gt;Microsoft Windows Server 2003 Performance Guide&lt;/a&gt; from the &lt;a href="http://www.amazon.com/Microsoft-Windows-Server-2003-Resource/dp/0735614717"&gt;Windows 2003 Resource Kit&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a name="integrity of"&gt;&lt;/a&gt;To maintain the integrity of the performance data and to improve reliability, the performance monitoring API disables any performance DLL that returns data in the incorrect format, causes an unhandled program fault, or takes too long to return the performance data. As a result of an error condition of this magnitude, a field is added to the registry in the &lt;font color="#ff0000"&gt;&lt;strong&gt;HKLM\System\CurrentControlSet\Services\&amp;lt;Service-name&amp;gt;\Performance&lt;/strong&gt;&lt;/font&gt; key named &lt;strong&gt;&lt;font color="#ff0000"&gt;Disable Performance Counters&lt;/font&gt;&lt;/strong&gt;. When Disable Performance Counters is set to 1, no performance monitoring application will be able to gather the counters that the disabled Perflib is responsible for gathering. Perflib&lt;a name="messages are"&gt;&lt;/a&gt; Event ID 1017 and 1018 messages are written to the Application event log at the time the Disable Performance Counters flag is set.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In the case of disk counters, the service name is ‘PerfDisk’. Here’s what it looks like in the registry:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/PerfMonisnotcollectingLogicalDiskorPhysi_CFCF/image_4.png"&gt;&lt;img style="display: inline" title="Registry Editor Screenshot" border="0" alt="Registry Editor Screenshot" src="http://blogs.msdn.com/blogfiles/granth/WindowsLiveWriter/PerfMonisnotcollectingLogicalDiskorPhysi_CFCF/image_thumb_1.png" width="570" height="230" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As well as re-enabling the collection, you can increase the &lt;strong&gt;Collect Timeout&lt;/strong&gt; so that it doesn’t happen as often.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9053213" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/granth/archive/tags/Performance/default.aspx">Performance</category></item></channel></rss>