<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Web Performance Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/web_performance_blog/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/feed.xml</link>
    <description>Understanding the performance of Microsoft&amp;#039;s Web Stack: IIS, ASP.NET, WCF, and more.</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:37:25 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>ASP.NET Performance Counters on Windows Client + IIS Express</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/asp-net-performance-counters-on-windows-client-iis-express</link>
      <pubDate>Wed, 12 Sep 2012 15:05:22 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/09/12/asp-net-performance-counters-on-windows-client-iis-express/</guid>
      <description><![CDATA[I learned recently that ASP.NET performance counters are not available on Windows 7 or 8 (client)...]]></description>
      <content:encoded><![CDATA[<p>I learned recently that ASP.NET performance counters are not available on Windows 7 or 8 (client) when running with IIS Express (or the Dev10 default of Cassini).&#160; Fortunately, the fix is easy: run Visual Studio as Administrator.</p>  <p>If you’re using IIS Express without Visual Studio installed (for example, WebMatrix), then you’ll first need to install ASP.NET 4.5 features:</p>  <p><em>dism /online /enable-feature /featureName:NetFx4Extended-ASPNET45 /all</em></p>  <p><strong>UPDATE: </strong>The above dism command is specific to Win8.&#160; Basically, you need to make sure ASP.NET features are enabled on the machine in order for performance counters to get registered.&#160; This happens automatically when you install VS.&#160; For Win7 client, you can enable ASP.NET 3.5 features with a command like the following (note that /all isn’t available for automatically enabling parent features):</p>  <p><em>dism /online /enable-feature /featurename:IIS-WebServerRole /featurename:WAS-WindowsActivationService /featurename:WAS-ProcessModel /featurename:WAS-NetFxEnvironment /featurename:WAS-ConfigurationAPI /featurename:IIS-ApplicationDevelopment /featurename:IIS-ASPNET /featurename:IIS-DefaultDocument /featurename:IIS-NetFxExtensibility /featurename:IIS-ISAPIExtensions /featurename:IIS-ISAPIFilter /featurename:IIS-RequestFiltering /featurename:IIS-Metabase /featurename:IIS-WMICompatibility /featurename:IIS-LegacyScripts /featurename:IIS-IIS6ManagementCompatibility /featurename:IIS-WebServerManagementTools /featurename:IIS-HttpTracing</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Receive-Side Scaling: Maximizing Web Server CPU</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/receive-side-scaling-maximizing-web-server-cpu</link>
      <pubDate>Mon, 26 Mar 2012 13:57:00 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/03/26/receive-side-scaling-maximizing-web-server-cpu/</guid>
      <description><![CDATA[UPDATE 1/7/2013: I recently re-ran the scenario on the original hardware and could not reproduce the...]]></description>
      <content:encoded><![CDATA[<p><span style="color: #ff0000;">UPDATE 1/7/2013: <span style="color: #ff0000;">I recently re-ran the scenario on the original hardware and could not reproduce the RSS issue below.&nbsp; I found that by setting 'Number of RSS Queues' to 4 for each of the Broadcom NICs, I could get an even distribution of load across all 16 server cores.&nbsp; There was likely an RSS configuration issue, but I can't confirm what that was.</span></span>&nbsp;</p>
<p>Re-running on the original hardware after setting 'Number of RSS Queues' to 4 for each NIC:</p>
<ul>
<li>4 Intel Xeon Quad-Core processors (16 cores total)</li>
<li>4 Broadcom BCM5708C NetXtreme II GigE NICs</li>
</ul>
<p><span style="color: #ff0000;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/1440.ASP_RSS-2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72/1440.ASP_5F00_RSS_2D00_2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/1440.ASP_RSS-2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72/1440.ASP_5F00_RSS_2D00_2.png" alt="" border="0" /></a></span>&nbsp;</p>
<hr style="width: 1px;" width="1" />
<p>&nbsp;</p>
<p><strong>ORIGINAL POST:</strong></p>
<p>In the <a href="https://blogs.msdn.com/b/web_performance_blog/archive/2012/03/14/load-balancing-your-web-server.aspx">previous post</a>, I stated that when adding multiple NICs to a web server you should ensure that the network load is balanced across those NICs.&nbsp; In order to maximize CPU on your multi-processor server you will still need to ensure that those NICs support <a href="https://technet.microsoft.com/en-us/network/dd277646">Receive Side Scaling (RSS)</a>, a technology that distributes network processing across multiple CPUs.&nbsp; In this post I will demonstrate how to verify that RSS is working.</p>
<p>Recall our webserver specs:</p>
<ul>
<li>4 Intel Xeon Quad-Core processors (16 cores total)</li>
<li>4 Broadcom BCM5708C NetXtreme II GigE NICs</li>
</ul>
<p>After load-balancing our server and clients, we now have the following <a href="https://www.iis.net/community/default.aspx?tabid=34&amp;g=6&amp;i=1467">wcat</a> node configuration:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/3542.ASP_LoadBalancing_0D5283E8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/3542.ASP_5F00_LoadBalancing_5F00_0D5283E8.png"><img style="border: 0px currentcolor; float: left; display: inline; background-image: none;" title="ASP_LoadBalancing" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/1488.ASP_LoadBalancing_thumb_34209A28.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/1488.ASP_5F00_LoadBalancing_5F00_thumb_5F00_34209A28.png" alt="ASP_LoadBalancing" width="225" height="101" align="left" border="0" />&nbsp;</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>After collecting data on the server NICs, enabling processor counters for all processors and running my wcat scenario, I was able to see what happened to incoming network traffic.&nbsp; In the the table below, notice that only 8 of the 16 CPUs processed the Deferred Procedure Calls (DPCs).&nbsp; Meanwhile, the other 8 CPUs spent more time Idle.&nbsp; Something in my server configuration was preventing RSS from utilizing all 16 cores.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/5773.ASP_RSS_41F2E023.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/5773.ASP_5F00_RSS_5F00_41F2E023.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="ASP_RSS" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/7652.ASP_RSS_thumb_3AD3A3AB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/7652.ASP_5F00_RSS_5F00_thumb_5F00_3AD3A3AB.png" alt="ASP_RSS" width="571" height="285" border="0" /></a></p>
<p>To compare, we borrowed some hardware from the IIS performance lab which had previously gone through this RSS exercise.</p>
<p>The new webserver has a total of 20 processors and 10 NICs:</p>
<ul>
<li>20 Intel Xeon CPU E7 &ndash; 4860 processors</li>
<li>6 Intel Gigabit ET Dual Port Server Adapter NICs</li>
<li>4 Intel 82576NS Gigabit Ethernet Controller NICS</li>
</ul>
<p>The following is the new load-balanced wcat node configuration:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/1300.IIS_LoadBalancing_737E4DB8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/1300.IIS_5F00_LoadBalancing_5F00_737E4DB8.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="IIS_LoadBalancing" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/3036.IIS_LoadBalancing_thumb_6C5F1140.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/3036.IIS_5F00_LoadBalancing_5F00_thumb_5F00_6C5F1140.png" alt="IIS_LoadBalancing" width="233" height="228" border="0" /></a></p>
<p>And the following was the compilation of NIC and counter data for a wcat run.&nbsp; RSS was configured properly on this node &ndash; notice how the DPC processing was evenly distributed across all processors (taking into account that RSS CPUs 8-9 and e-f had increased load).</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/3058.IIS_RSS_132D2781.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/3058.IIS_5F00_RSS_5F00_132D2781.png"><img style="border: 0px currentcolor; display: inline; background-image: none;" title="IIS_RSS" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/0410.IIS_RSS_thumb_0C0DEB09.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/0410.IIS_5F00_RSS_5F00_thumb_5F00_0C0DEB09.png" alt="IIS_RSS" width="574" height="349" border="0" /></a></p>
<p>To compile this data, I did the following:</p>
<ol>
<li>Noted which client(s) pointed to which IP(s), based on my load balancing</li>
<li>Found the # of requests sent in the per-client statistics section of the wcat log</li>
<li>Used <a href="https://technet.microsoft.com/en-us/library/bb490921.aspx">IPConfig</a> to find the physical address for each NIC</li>
<li>Used NICStats.exe (available from the <a href="https://www.microsoft.com/download/en/details.aspx?id=11800">Windows Driver Kit</a>) to map the NIC physical addresses to the RSS CPUs*</li>
<li>Collected Processor performance counters for all CPU instances:</li>
<ul>
<li>Processor(N)\% Processor Time</li>
<li>Processor(N)\% Idle Time</li>
<li>Processor(N)\% Interrupt Time</li>
<li>Processor(N)\% DPC Time</li>
</ul>
</ol>
<p><strong>Conclusion:</strong></p>
<p>When running a web server with multiple NICs, be sure to verify that RSS is working properly.&nbsp; If you have questions, check with the NIC vendor and do your own testing once the NICs are installed.</p>]]></content:encoded>
    </item>
    <item>
      <title>Debugging W3WP Startup</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/debugging-w3wp-startup</link>
      <pubDate>Mon, 19 Mar 2012 16:45:00 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/03/19/debugging-w3wp-startup/</guid>
      <description><![CDATA[On a few occasions, I have needed to debug the startup of the IIS worker process (w3wp).&nbsp; I...]]></description>
      <content:encoded><![CDATA[<p>On a few occasions, I have needed to debug the startup of the IIS worker process (w3wp).&nbsp; I finally decided to create a script so that I no longer need to search for <a href="https://blogs.technet.com/b/marcelofartura/archive/2007/08/09/how-to-attach-a-debugger-from-the-creation-time-of-the-worker-process-w3wp-exe.aspx">the answer</a>.&nbsp; The script starts w3wp by requesting a non-existent ASPX page.&nbsp; After windbg is closed, the script will kill the debug session and clean up the registry.</p>
<p><strong>Script requirements:</strong></p>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/windows/hardware/gg463009">Debugging Tools for Windows</a></li>
<li>TinyGet, from the <a href="https://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=17275">IIS Resource Kit Tools</a></li>
<li>PsKill from <a href="https://technet.microsoft.com/en-us/sysinternals/bb896649">PsTools</a></li>
</ul>
<p><strong>Debug Script:</strong></p>
<p><span style="font-family: Courier New;" face="Courier New">reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\w3wp.exe" /v Debugger /t REG_SZ /d "cdb.exe -c \".server tcp:port=9999\"" /f <br />iisreset /restart <br />start /b tinyget5 -srv:localhost -uri:/notfound.aspx -status:404 <br />sleep 3 <br />windbg -remote tcp:port=9999,server=localhost <br />pskill cdb <br />pskill w3wp <br />reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\w3wp.exe" /f</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;" face="Courier New"><strong>UPDATE:</strong></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;" face="Courier New">If you are setting managed breakpoints, you will want to break when the managed assembly loads using "sxe ld:Assembly".&nbsp; For instance, "sxe ld:clr" or "sxe ld:System.Web.dll".</span></p>
<p><span style="font-family: arial,helvetica,sans-serif;" face="Courier New">If you want to </span><span style="font-family: arial,helvetica,sans-serif;" face="Courier New">debug compilation, you should delete the "Temporary ASP.NET Files" under the framework installation folder for your website after the iisreset.</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Load Balancing Your Web Server</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/load-balancing-your-web-server</link>
      <pubDate>Wed, 14 Mar 2012 14:13:07 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/03/14/load-balancing-your-web-server/</guid>
      <description><![CDATA[A recent regression in the ASP.NET performance lab prompted us to make a change to our...]]></description>
      <content:encoded><![CDATA[<p>A recent regression in the ASP.NET performance lab prompted us to make a change to our infrastructure. Our <a href="https://blogs.msdn.com/b/web_performance_blog/archive/2012/02/06/asp-net-performance-lab-hello-world.aspx">“Hello, World”</a> scenario showed a 23% regression in throughput and 5% decrease in %CPU.&#160; I won’t go into the source change which triggered the regression, but I will demonstrate how tuning our web server performance made big impacts on throughput.&#160; The change: balancing and increasing the load on the web server.</p>  <p>For reference, the web server has the following specs:</p>  <ul>   <li>4 Intel Xeon Quad-Core processors (16 cores total)</li>    <li>4 Broadcom BCM5708C NetXtreme II GigE NICs</li> </ul>  <p>Each NIC on the web server has a separate IP address:</p>  <blockquote>   <pre class="csharpcode"><font color="#666666">&gt; nslookup webserver

Server:  dnsserver
Address:  192.168.0.1

Name:    webserver</font></pre>

  <pre class="csharpcode"><font color="#666666">Addresses:  192.168.0.2
          192.168.0.3
          192.168.0.4
          192.168.0.5</font></pre>
</blockquote>

<p>If you remember from my <a href="https://blogs.msdn.com/b/web_performance_blog/archive/2012/02/06/asp-net-performance-lab-hello-world.aspx">“Hello, World”</a> post, we use <a href="https://www.iis.net/community/default.aspx?tabid=34&amp;g=6&amp;i=1467">wcat</a> to apply load from 3 remote, physical clients. Each client uses the web server’s hostname when issuing requests, which should ideally use a round robin rotation across the web server IPs.</p>

<p>Before I proceed, let me describe what happens to incoming network traffic as I understand it:</p>

<ul>
  <li>tcpip.sys issues network interrupt when it receives data</li>

  <li>OS dispatches an ISR (interrupt service routine) to handle the interrupt</li>

  <li>tcpip.sys can’t issue another interrupt while the ISR is running</li>

  <li>ISR schedules a lower priority DPC (deferred procedure call) to handle the rest of the work</li>

  <li>ISR quickly returns so that tcpip.sys can issue more interrupts</li>
</ul>

<p>If the NICs are getting equal load and <a href="https://technet.microsoft.com/en-us/network/dd277646">RSS</a> (receive-side scaling) is enabled on the web server, then the network interrupts and their corresponding DPCs should be distributed across the multiple cores.&#160; We collected ETW profiles and found that while our interrupts were handled by all cores, DPCs were only handled by 8 of the 16 cores with cpu0 doing most of the work:</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/4428.LoadBalancing_XPerf_DPCs-2_1B81994E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/4428.LoadBalancing_5F00_XPerf_5F00_DPCs_2D00_2_5F00_1B81994E.png"><img style="display: inline; background-image: none;" title="LoadBalancing_XPerf_DPCs-2" border="0" alt="LoadBalancing_XPerf_DPCs-2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/35/72/metablogapi/6177.LoadBalancing_XPerf_DPCs-2_thumb_414799E4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-35-72-metablogapi/6177.LoadBalancing_5F00_XPerf_5F00_DPCs_2D00_2_5F00_thumb_5F00_414799E4.png" width="417" height="528" /></a></p>

<p>This led us to wonder if the NICs really were getting equal load from a round robin DNS lookup.&#160; The quickest and easiest way to ensure a balanced load was to manually edit the client etc\hosts files and force each client to use a separate NIC.&#160; Since there were 4 NICs we needed a 4th client, which also means an increase in load.</p>

<p>The following results are for Server R2 with .NET 4. Baseline is not load balanced, Result is.</p>

<table border="1" cellspacing="0" cellpadding="0" width="585"><tbody><font size="1"></font>

    <tr><font size="1"></font>

      <td width="129" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Test Name</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="89" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Metric</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="57" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Unit</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="59" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Baseline</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="57" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Result</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="48" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Diff</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="43" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Status</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="52" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Baseline StdDev %</strong></font></p>
      </td>
      <font size="1"></font>

      <td width="49" align="center"><font size="1"></font>

        <p><font color="#333333" size="1"><strong>Result StdDev %</strong></font></p>
      </td>
    </tr>
    <font size="1"></font>

    <tr><font size="1"></font>

      <td width="128" align="center"><font size="1"></font>

        <p><font size="1">Helloworld.Helloworld</font></p>
      </td>
      <font size="1"></font>

      <td width="89" align="center"><font size="1"></font>

        <p><font size="1">Processor Time</font></p>
      </td>
      <font size="1"></font>

      <td width="56" align="center"><font size="1"></font>

        <p><font size="1">%</font></p>
      </td>
      <font size="1"></font>

      <td width="59" align="center"><font size="1"></font>

        <p><font size="1">95.60</font></p>
      </td>
      <font size="1"></font>

      <td width="57" align="center"><font size="1"></font>

        <p><font size="1">99.16</font></p>
      </td>
      <font size="1"></font>

      <td width="48" align="center"><font size="1"></font>

        <p><font color="#008000" size="1">3.73%</font></p>
      </td>
      <font size="1"></font>

      <td width="43" align="center"><font size="1"></font>

        <p><font size="1">Pass</font></p>
      </td>
      <font size="1"></font>

      <td width="53" align="center"><font size="1"></font>

        <p><font size="1">0.68</font></p>
      </td>
      <font size="1"></font>

      <td width="49" align="center"><font size="1"></font>

        <p><font size="1">0.27</font></p>
      </td>
    </tr>
    <font size="1"></font>

    <tr><font size="1"></font>

      <td width="128" align="center"><font size="1"></font>

        <p><font size="1">Helloworld.Helloworld</font></p>
      </td>
      <font size="1"></font>

      <td width="89" align="center"><font size="1"></font>

        <p><font size="1">Throughput</font></p>
      </td>
      <font size="1"></font>

      <td width="57" align="center"><font size="1"></font>

        <p><font size="1">req/sec</font></p>
      </td>
      <font size="1"></font>

      <td width="59" align="center"><font size="1"></font>

        <p><font size="1">28403.67</font></p>
      </td>
      <font size="1"></font>

      <td width="57" align="center"><font size="1"></font>

        <p><font size="1">32125.67</font></p>
      </td>
      <font size="1"></font>

      <td width="48" align="center"><font size="1"></font>

        <p><font color="#008000" size="1">13.10%</font></p>
      </td>
      <font size="1"></font>

      <td width="44" align="center"><font size="1"></font>

        <p><font size="1">Pass</font></p>
      </td>
      <font size="1"></font>

      <td width="53" align="center"><font size="1"></font>

        <p><font size="1">0.85</font></p>
      </td>
      <font size="1"></font>

      <td width="49" align="center"><font size="1"></font>

        <p><font size="1">0.57</font></p>
      </td>
    </tr>
  </tbody></table>

<p>&#160;</p>

<p>Notice the improvements in %CPU and throughput?&#160; Using Result as our new load-balanced baseline, we re-ran HelloWorld on the same build where we saw the original regression.&#160; After maxing our CPU and increasing our load, throughput is now less than 5% off from the baseline.</p>

<p><strong>Conclusion:</strong> When adding multiple NICs, carefully <a href="https://msdn.microsoft.com/en-us/windows/hardware/gg463392">tune your web server</a> and infrastructure in order to maximize its performance.&#160; Profile to verify that your server is behaving as expected.&#160; I recognize that it is not this easy to load balance production servers, but there should be tools available to help you do this.&#160; I don’t work on production servers, so don’t ask me which tools – but I would love to hear about them from you!</p>

<p><strong>Update:</strong> To collect the ETW profiles above, I enabled INTERRUPT and DPC on the xperf command-line:</p>

<p><em>xperf –on PROC_THREAD+LOADER+INTERRUPT+DPC –f &lt;etwFile&gt;</em></p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET Internals – Managed runtime loader</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/asp-net-internals-managed-runtime-loader</link>
      <pubDate>Wed, 29 Feb 2012 13:14:00 GMT</pubDate>
      <dc:creator><![CDATA[Jose Reyes - ASP.NET]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/29/asp-net-internals-managed-runtime-loader/</guid>
      <description><![CDATA[Introduction
There is a file called aspnet.config in the .Net framework installation. This file...]]></description>
      <content:encoded><![CDATA[<div class="WordSection1">
<h2><span style="font-variant: normal !important;">Introduction</span></h2>
<p class="MsoNormal">There is a file called aspnet.config in the .Net framework installation. This file is used to specify startup flags for both ASP.NET and CLR for those settings that are needed very early in the worker process lifetime, when the config system is not yet present.</p>
<p class="MsoNormal">In IIS 7.5 we added an attribute to the &lt;applicationPools&gt; configuration collection&nbsp;called CLRConfigFile, on the applicationHost.config file,&nbsp;which allows you to specify your own aspnet.config, for a particular application pool.</p>
<p class="MsoNormal">There is another attribute on the &lt;applicationPools&gt; called managedRuntimeLoader, which specify the library in charge of loading CLR. By default, this task is executed by ASP.NET native layer, in the webengine4.dll. If no loader is specified, or if an error occurs, the loading falls back to IIS itself.</p>
<h2><span style="font-variant: normal !important;">IIS 7.5 issue.</span></h2>
<p class="MsoNormal">There was a problem in IIS 7.5, in which the managedRuntimeLoader was never provided with the path to this CLRConfigFile, so it was forced to use the one in the framework directory. So if you wanted to use the CLRConfigFile, to setup different CLR flags for an application pool, you will need to set the attribute AND explicitly clear the managedRuntimeLoader attribute on the application pool <a href="https://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add">definition</a> on applicationHost.config:</p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">system.applicationHost</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">applicationPools</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> Set the CLRConfigFile and clear managedRuntimeLoader </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">--&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">add</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: red; font-family: Consolas; font-size: 9.5pt;">name</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">=</span><span style="font-family: Consolas; font-size: 9.5pt;">"<span style="color: blue;">MyAppPool</span>"<span style="color: blue;"> </span><span style="color: red;">CLRConfigFile</span><span style="color: blue;">=</span>"<span style="color: blue;">c:\myconfigs\myapp1\aspnet.config</span>"<span style="color: blue;"> </span><span style="color: red;">managedRuntimeLoader</span><span style="color: blue;">=</span>""<span style="color: blue;"> /&gt;</span></span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">The second step shouldn&rsquo;t be necessary and is confusing. The clearing of the attributes basically forces the fall back to IIS runtime loader, which uses the correct CLRConfigFile.</p>
<p class="MsoNormal">This has been fixed on IIS 8, where you only need to set the CLRConfigFile attribute.</p>
<p class="MsoNormal">To verify this is working, you can change one parameter on the aspnet.config such as disabling the server garbage collector. <em>(Note: Disabling the server garbage collector is a good thing if you want to save memory, at the expense of throughput. Typical use of this is hosting scenarios, where web sites has low traffic and higher site density is desirable.)</em></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">configuration</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">runtime</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">gcServer</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: red; font-family: Consolas; font-size: 9.5pt;">enabled</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">=</span><span style="font-family: Consolas; font-size: 9.5pt;">"<span style="color: blue;">false</span>"<span style="color: blue;">/&gt;</span></span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Attaching a debugger to the worker process and using SOS command !eeversion will show the garbage collector mode being used:</p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">C:\&gt;cdb.exe -pn w3wp.exe</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">&nbsp;</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">Microsoft (R) Windows Debugger Version 6.13.0009.1140 X86</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">Copyright (c) Microsoft Corporation. All rights reserved.</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">&nbsp; &hellip;</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">0:044&gt; .loadby sos clr</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">0:044&gt; !eeversion</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">4.0.30319.239 retail</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="background: yellow; line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">Workstation mode</span></p>
<p style="margin-bottom: 0pt;" class="MsoNormal"><span style="line-height: 115%; font-family: 'Courier New'; font-size: 9pt;">SOS Version: 4.0.30319.239 retail build</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Make sure your box has more than one logical core; otherwise workstation mode will always be used.</p>
<h2><span style="font-variant: normal !important;">Implementing a loader</span></h2>
Implementing a loader is probably not needed, but if you want to do it, you will need a native DLL&nbsp;that exports a function named <span style="font-family: Consolas; font-size: 9.5pt;">LoadManagedRuntime</span>. In IIS 8 you can also export LoadManagedRuntimeEx. The function signature is shown below:
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">HRESULT <span style="color: blue;">__stdcall</span></span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">LoadManagedRuntime(</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _In_ PCWSTR pwszRuntimeVersion,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="es-code">__deref_out</span><span style="font-family: Consolas; font-size: 9.5pt;"> IUnknown ** ppManagedRuntimeHost)</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">{</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> LoadRuntimeInternal(pwszRuntimeVersion, ppManagedRuntimeHost);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">}</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">HRESULT <span style="color: blue;">__stdcall</span></span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">LoadManagedRuntimeEx(</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _In_ PCWSTR pwszRuntimeVersion,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _In_ PCWSTR pszClrConfigFile,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="es-code">__deref_out</span><span style="font-family: Consolas; font-size: 9.5pt;"> IUnknown ** ppManagedRuntimeHost)</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">{</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> LoadRuntimeInternal(pwszRuntimeVersion, ppManagedRuntimeHost, pszClrConfigFile);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">}</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">HRESULT LoadRuntimeInternal(_In_ PCWSTR pwszRuntimeVersion, __deref_out IUnknown** ppHost <span style="color: green;">/*= NULL*/</span>, _In_ PCWSTR pwszAspNetHostConfig <span style="color: green;">/*= NULL*/</span>) {</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; HMODULE hModule = NULL;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; HRESULT hr = S_OK;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; IUnknown *pHost = NULL;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; PFNCorBindToRuntimeHost pCorBindToRuntimeHost;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; TCHAR szPath[MAX_PATH + 1];</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; TCHAR szAspConfig[MAX_PATH + 1];</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; ExpandEnvironmentStrings(L<span style="color: #a31515;">"%windir%\\system32\\mscoree.dll"</span>, szPath, MAX_PATH);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span>(pwszAspNetHostConfig == NULL) {</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExpandEnvironmentStrings(ASPNET_CONFIG, szAspConfig, MAX_PATH);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pwszAspNetHostConfig = szAspConfig;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; hModule = LoadLibrary(szPath);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; ON_NULL_EXIT(hModule);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; pCorBindToRuntimeHost = (PFNCorBindToRuntimeHost)GetProcAddress(hModule, <span style="color: #a31515;">"CorBindToRuntimeHost"</span>);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; ON_NULL_EXIT(pCorBindToRuntimeHost);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; hr = pCorBindToRuntimeHost(</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L<span style="color: #a31515;">"v4.0.30319"</span>,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L<span style="color: #a31515;">"svr"</span>,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pwszAspNetHostConfig,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, <span style="color: green;">// reserved</span></span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STARTUP_CONCURRENT_GC|STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST|STARTUP_LOADER_SAFEMODE|STARTUP_DISABLE_COMMITTHREADSTACK|STARTUP_HOARD_GC_VM,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLSID_CLRRuntimeHost,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IID_IUnknown,</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (VOID**)&amp;pHost);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">Cleanup:</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (pHost != NULL &amp;&amp; ppHost != NULL) {</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pHost-&gt;AddRef();</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *ppHost = pHost;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span>(hModule != NULL) {</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(hModule);</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> hr;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">}</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
See the attached project for the full sample code. The sample can be compiled into a native DLL and the managedRuntimeLoader attribute can be set to point to that DLL.
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">system.applicationHost</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">applicationPools</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--</span><span style="color: green; font-family: Consolas; font-size: 9.5pt;"> Set the CLRConfigFile and managedRuntimeLoader </span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">--&gt;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515; font-family: Consolas; font-size: 9.5pt;">add</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;"> </span><span style="color: red; font-family: Consolas; font-size: 9.5pt;">name</span><span style="color: blue; font-family: Consolas; font-size: 9.5pt;">=</span><span style="font-family: Consolas; font-size: 9.5pt;">"<span style="color: blue;">MyAppPool</span>"<span style="color: blue;"> </span><span style="color: red;">CLRConfigFile</span><span style="color: blue;">=</span>"<span style="color: blue;">c:\myconfigs\myapp1\aspnet.config</span>"<span style="color: blue;"> </span><span style="color: red;">managedRuntimeLoader</span><span style="color: blue;">=</span>"<span style="color: blue;">c:\mynativedlls\myruntimeloader.dll</span>"<span style="color: blue;"> /&gt;</span></span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp; ...</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left"><span style="font-family: Consolas; font-size: 9.5pt;">&nbsp;</span></p>
<p style="text-align: left; line-height: normal; margin-bottom: 0pt;" class="MsoNormal" align="left">Note that debugging such a code on IIS will require the use of <a href="https://blogs.msdn.com/b/junfeng/archive/2004/04/28/121871.aspx">&ldquo;Image File Execution Options&rdquo;</a>, since the code is executed very early on the worker process lifecycle. An easier way to test might be to load the library yourself and call the functions, the way IIS would (see the test project).</p>
<h2><span style="font-variant: normal !important;">Conclusion</span></h2>
<p class="MsoNormal">IIS 7.5 required for you to clean the managedRuntimeLoader attribute, if you wanted to change CLR parameters on your own CLRConfigFile.</p>
<p class="MsoNormal">Implementation of a managed runtime loader requires a native DLL which exports a <span style="line-height: 115%; font-family: Consolas; font-size: 9.5pt;">LoadManagedRuntime() and/or LoadManagedRuntimeEx().</span></p>
<p class="MsoNormal">Thanks for reading.</p>
</div>
<p>Originally posted at <a href="https://blogs.msdn.com/b/josere/">https://blogs.msdn.com/b/josere/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET Internals – Prefetch and Multi-Core Jitting.</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/asp-net-internals-prefetch-and-multi-core-jitting</link>
      <pubDate>Wed, 29 Feb 2012 13:07:00 GMT</pubDate>
      <dc:creator><![CDATA[Jose Reyes - ASP.NET]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/29/asp-net-internals-prefetch-and-multi-core-jitting/</guid>
      <description><![CDATA[Introduction.
A couple of new features are introduced in ASP.NET 4.5 to improve startup time of...]]></description>
      <content:encoded><![CDATA[<div class="WordSection1">
<h2><span style="font-variant: normal !important;">Introduction.</span></h2>
<p class="MsoNormal">A couple of new features are introduced in ASP.NET 4.5 to improve startup time of web apps. Both features use a flag on the web.config to enable them. The features don&rsquo;t do any magic by themself. They just enable features available on the operating system underneath or in the CLR APIs.</p>
<h2><span style="font-variant: normal !important;">Prefetch feature</span></h2>
<p class="MsoNormal">The prefetch feature only works on Windows 8 Server or newer OS. It requires the Os to be configured and the enablePrefetchOptimization flag on the &lt;system.web/compilation&gt; section of web.config to be set. The flag only has effect at the app level. No subdirectory config or location tag makes sense here. The setting is set to false by default, so users must explicitly set it to true in order for it to work.</p>
<p class="MsoNormal">To enable the feature, run the Enable-MMAgent power shell command:</p>
<p class="MsoNormal"><span style="font-family: Consolas; color: #595959;">&nbsp;&nbsp;&nbsp; powershell Enable-MMAgent -OperationAPI</span></p>
<p class="MsoNormal">The SuperFetch service might need to be started. Verify is running:</p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">C:\&gt;sc query sysmain</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">SERVICE_NAME: sysmain</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: 20&nbsp; WIN32_SHARE_PROCESS</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 4&nbsp; <span style="background: yellow;">RUNNING</span></span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WIN32_EXIT_CODE&nbsp;&nbsp;&nbsp; : 0&nbsp; (0x0)</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SERVICE_EXIT_CODE&nbsp; : 0&nbsp; (0x0)</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHECKPOINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0x0</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WAIT_HINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0x0</span></p>
<h2><span style="font-variant: normal !important;">Prefetch Implementation.</span></h2>
<p class="MsoNormal">The features simple uses the operation recorder API. See <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/hh437562(v=vs.85).aspx">OperationStart</a> and <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/hh437558(v=vs.85).aspx">OperationEnd</a> APIs on msdn. This APIs require an integer used as an Id of the operation. We use a hash code of the app domain app id, which is a string.</p>
<p style="margin-bottom: .0001pt; text-align: left; line-height: normal; text-autospace: none;" class="MsoNormal" align="left"><span style="font-size: 9.5pt; font-family: Consolas; color: blue;">string</span><span style="font-size: 9.5pt; font-family: Consolas;"> domainId = <span style="color: #2b91af;">HttpRuntime</span>.AppDomainAppId;</span></p>
<p style="margin-bottom: .0001pt; text-align: left; line-height: normal; text-autospace: none;" class="MsoNormal" align="left"><span style="font-size: 9.5pt; font-family: Consolas; color: blue;">int</span><span style="font-size: 9.5pt; font-family: Consolas;"> operationId = domainId.GetHashCode(); </span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">The OperationStart call is made the first time the app domain is created. The OperationEnd API is called at the end of the request in which we called OperationStart. A .pf file should be created on the prefetch directory:</p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">C:\&gt;dir %windir%\Prefetch</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Volume in drive C has no label.</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Volume Serial Number is CC5B-113C</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Directory of C:\Windows\Prefetch</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">02/16/2012&nbsp; 04:17 PM&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">02/16/2012&nbsp; 04:17 PM&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ..</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">02/16/2012&nbsp; 04:17 PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 164,832 <span style="background: yellow;">Op-W3WP.EXE-90E54C33-765F360E.pf</span></span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 File(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 164,832 bytes</span></p>
<p style="margin-bottom: .0001pt;" class="MsoNormal"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 Dir(s)&nbsp; 30,203,154,432 bytes free</span></p>
<h2><span style="font-variant: normal !important;">Multi-Core Jitting feature.</span></h2>
<p class="MsoNormal">The multi-core jitting feature is enabled by default, and work on all OS where ASP.NET 4.5 is available. You can disable it by setting the profileGuidedOptimizations enumerated value on the &lt;system.web/compilation&gt; section on the web.config, to <i><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">None</span></i>.</p>
<h2><span style="font-variant: normal !important;">Multi-Core Jitting Implementation.</span></h2>
<p class="MsoNormal">The feature uses the new class <a href="https://msdn.microsoft.com/en-us/library/system.runtime.profileoptimization(v=VS.110).aspx">ProfileOptimization</a> class of the System.Runtime namespace. The class is called the first time the app domain is created. First, we set the <a href="https://msdn.microsoft.com/en-us/library/system.runtime.profileoptimization.setprofileroot(v=vs.110).aspx">profile</a> root to the codegen directory, which by default is something like:</p>
<p class="MsoNormal">"%windir%\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\<b>myapp</b>\weirdhash1\weirdhash2"</p>
<p class="MsoNormal">Remember that the temporary files folder value can be changed on tempDirectory attribute of the &lt;system.web/compilation&gt; section of the web.config.</p>
<p class="MsoNormal">After setting the profile root, we call <a href="https://msdn.microsoft.com/en-us/library/system.runtime.profileoptimization.startprofile(v=vs.110).aspx">StartProfile</a>() with the filename "profileoptimization.prof". The CLR code underneath handles all the magic. If you examine the contents of the temporary ASP.NET file folder, you will see the file there:</p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\dotnetnuke\59a60e53\a2ac2624&gt;dir *.prof</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Volume in drive C has no label.</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Volume Serial Number is CC5B-113C</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;Directory of C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\dotnetnuke\59a60e53\a2ac2624</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">02/16/2012&nbsp; 04:38 PM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9,828 <span style="background: yellow;">profileoptimization.prof</span></span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 File(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9,828 bytes</span></p>
<p style="margin-bottom: .0001pt; text-align: left;" class="MsoNormal" align="left"><span style="font-size: 9.0pt; line-height: 115%; font-family: 'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 Dir(s)&nbsp; 30,203,035,648 bytes free&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<h2><span style="font-variant: normal !important;">Conclusion.</span></h2>
<p class="MsoNormal">The ASP.NET Prefetch feature uses the operation recording APIs to improve startup time of web applications. The feature is enabled when a Windows Server 8 machine is configured for the operation API and enabledPrefetchOptimization flag is set on the web.config.</p>
<p class="MsoNormal">The multi-core jitting feature is available&nbsp;in more&nbsp;operating systems&nbsp;and is on by default. It uses a new CLR feature for profile base optimization.</p>
<p class="MsoNormal">Thanks for reading.</p>
</div>
<p>Originally posted at <a href="https://blogs.msdn.com/b/josere/">https://blogs.msdn.com/b/josere/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>A Look Inside the IE Performance Lab</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/a-look-inside-the-ie-performance-lab</link>
      <pubDate>Fri, 17 Feb 2012 14:22:04 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/17/a-look-inside-the-ie-performance-lab/</guid>
      <description><![CDATA[The Windows 8 blog details the Internet Explorer Performance Lab.&#160; It’s always fun to see how...]]></description>
      <content:encoded><![CDATA[<p>The Windows 8 blog details the <a title="https://blogs.msdn.com/b/b8/archive/2012/02/16/internet-explorer-performance-lab-reliably-measuring-browser-performance.aspx" href="https://blogs.msdn.com/b/b8/archive/2012/02/16/internet-explorer-performance-lab-reliably-measuring-browser-performance.aspx">Internet Explorer Performance Lab</a>.&#160; It’s always fun to see how other performance teams operate.</p>]]></content:encoded>
    </item>
    <item>
      <title>Performance Counter Collection</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/performance-counter-collection</link>
      <pubDate>Mon, 13 Feb 2012 21:55:10 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/13/performance-counter-collection/</guid>
      <description><![CDATA[As mentioned in my “Hello, World” post, performance counters are a great diagnostic tool for...]]></description>
      <content:encoded><![CDATA[<p>As mentioned in my <a href="https://blogs.msdn.com/b/web_performance_blog/archive/2012/02/06/asp-net-performance-lab-hello-world.aspx">“Hello, World” post</a>, performance counters are a great diagnostic tool for starting performance investigations. Logging performance counters during your runs does not add much overhead, unlike profilers. Still, this is not a replacement for profilers which are necessary for in-depth investigations. The following are some tools you can use to collect performance counters.</p>  <p><strong></strong></p>  <p><strong>Performance Monitor</strong></p>  <p>Windows ships with the <a href="https://technet.microsoft.com/en-us/library/cc749249.aspx">Performance Monitor</a> tool, or PerfMon for short. This GUI allows you to view live performance counter data on either the local machine or on remote systems. Simply run `perfmon` and navigate to Performance-&gt;Monitoring Tools-&gt;Performance Monitor. Right click to add or remove counters. Press ‘Ctrl+G’ to switch the graph type.&#160; Report View is handy when monitoring multiple counters.</p>  <p><strong>Perfecto and LogMan</strong></p>  <p><a href="https://blogs.msdn.com/b/josere/archive/2010/04/09/taking-a-quick-peek-at-the-performance-of-your-asp-net-app.aspx">Perfecto</a> is a Data Collector Set that plugs into PerfMon, and was created by <a href="https://blogs.msdn.com/b/josere">Jose Reyes</a>. This is a quick, simple way to collect ASP.NET, IIS, CLR and system counters which give a good overview of ASP.NET performance.</p>  <p><a href="https://technet.microsoft.com/en-us/library/bb490956.aspx">LogMan</a> is a command line tool for managing PerfMon Data Collector Sets.</p>  <p>Try the following:</p>  <ol>   <li>Download <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/99/34/34/perfecto.zip" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Components-PostAttachments/00-09-99-34-34/perfecto.zip">Perfecto</a>, unzip and run the setup script </li>    <li>Run `logman start –n “Service\ASPNET Perfecto”` </li>    <li>Make a few web requests to localhost</li>    <li>Run `logman stop –n “Service\ASPNET Perfecto”` </li>    <li>View the report at &quot;%SystemDrive%\PerfLogs\Admin\ASPNET Perfecto\000001\report.html” </li> </ol>  <p>Don’t be afraid to customize Perfecto to your needs: add performance counters, change the report directory, etc.&#160; Right click ‘ASPNET Perfecto’ to edit the properties in PerfMon.&#160; Right click again and Save Template… to create an updated version of Perfecto.DataCollectorSet.xml.</p>  <p><strong>TypePerf and TList</strong></p>  <p>For basic counter collections, you can use the <a href="https://technet.microsoft.com/en-us/library/bb490960.aspx">TypePerf</a> command-line tool. It can be combined with the <a href="https://www.microsoft.com/downloads/details.aspx?FamilyID=C055060B-9553-4593-B937-C84881BCA6A5&amp;amp;amp;displaylang=e&amp;displaylang=en">TList</a> command in order to collect counters which are specific to a given process. For example, you can collect the Processor Time for all processes by running:</p>  <blockquote>   <p>`for /t “tokens=2 delims=. “ %a in (‘tlist’) do typeperf –sc 1 “Process(%a)\% Processor Time”</p> </blockquote>  <p><strong>WCat</strong></p>  <p><a href="https://technet.microsoft.com/en-us/query/ms951774#usingwcat_topic5">WCat</a> also supports the collection of performance counters.&#160; This is our primary way of collecting performance counters since most of our scenarios use WCat.&#160; Take a look at our settings.ubr file to see which counters we track:</p>  <pre class="csharpcode">settings
{
    counters
    {
        interval = 10;

        counter = <span class="str">&quot;.NET CLR Exceptions(w3wp)\\# of Exceps Thrown / sec&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Jit(w3wp)\\% Time in Jit&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Jit(w3wp)\\IL Bytes Jitted / sec&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Loading(w3wp)\\% Time Loading&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Loading(w3wp)\\Current appdomains&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Loading(w3wp)\\Current Assemblies&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\# of current logical Threads&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\# of current physical Threads&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\# of current recognized threads&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\# of total recognized threads&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\Queue Length / sec&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\Total # of Contentions&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\Contention Rate / sec&quot;</span>;
        counter = <span class="str">&quot;.NET CLR LocksAndThreads(w3wp)\\Current Queue Length&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\% Time in GC&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# Bytes in all Heaps&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# Gen 0 Collections&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# Gen 1 Collections&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# Gen 2 Collections&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# Induced GC&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Allocated Bytes/sec&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Finalization Survivors&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Gen 0 heap size&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Gen 1 heap size&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Gen 2 heap size&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Large Object Heap size&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\Large Object Heap size&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Memory(w3wp)\\# of Pinned Objects&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Security(w3wp)\\% Time in RT checks&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Security(w3wp)\\Stack Walk Depth&quot;</span>;
        counter = <span class="str">&quot;.NET CLR Security(w3wp)\\Total Runtime Checks&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Cache Total Entries&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Cache Total Hit Ratio&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Cache Total Turnover Rate&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Output Cache Entries&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Output Cache Hits&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Output Cache Hit Ratio&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Output Cache Turnover Rate&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Compilations Total&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Errors Total/Sec&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Pipeline Instance Count&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Requests Executing&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Requests in Application Queue&quot;</span>;
        counter = <span class="str">&quot;ASP.NET Applications(__Total__)\\Requests/Sec&quot;</span>;
        counter = <span class="str">&quot;ASP.NET\\Application Restarts&quot;</span>;
        counter = <span class="str">&quot;ASP.NET\\Request Wait Time&quot;</span>;
        counter = <span class="str">&quot;ASP.NET\\Requests Current&quot;</span>;
        counter = <span class="str">&quot;ASP.NET\\Requests Queued&quot;</span>;
        counter = <span class="str">&quot;ASP.NET\\Requests Rejected&quot;</span>;
        counter = <span class="str">&quot;Memory\\Available MBytes&quot;</span>;
        counter = <span class="str">&quot;Memory\\Cache Faults/sec&quot;</span>;
        counter = <span class="str">&quot;Memory\\Demand Zero Faults/sec&quot;</span>;
        counter = <span class="str">&quot;Memory\\Page Faults/sec&quot;</span>;
        counter = <span class="str">&quot;Memory\\Pages/sec&quot;</span>;
        counter = <span class="str">&quot;Memory\\Transition Faults/sec&quot;</span>;
        counter = <span class="str">&quot;Memory\\Pool Nonpaged Bytes&quot;</span>;
        counter = <span class="str">&quot;Memory\\Pool Paged Bytes&quot;</span>;
        counter = <span class="str">&quot;PhysicalDisk(_Total)\\% Disk Time&quot;</span>;
        counter = <span class="str">&quot;PhysicalDisk(_Total)\\% Disk Read Time&quot;</span>;
        counter = <span class="str">&quot;PhysicalDisk(_Total)\\% Disk Write Time&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\% Processor Time&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\Handle Count&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\ID Process&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\Private Bytes&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\Thread Count&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\Virtual Bytes&quot;</span>;
        counter = <span class="str">&quot;Process(w3wp)\\Working Set&quot;</span>;
        counter = <span class="str">&quot;Processor(_Total)\\% Interrupt Time&quot;</span>;
        counter = <span class="str">&quot;Processor(_Total)\\% Privileged Time&quot;</span>;
        counter = <span class="str">&quot;Processor(_Total)\\% Processor Time&quot;</span>;
        counter = <span class="str">&quot;Processor(_Total)\\% User Time&quot;</span>;
        counter = <span class="str">&quot;System\\Context Switches/sec&quot;</span>;
        counter = <span class="str">&quot;System\\System Calls/sec&quot;</span>;
        counter = <span class="str">&quot;Web Service(_Total)\\Get Requests/sec&quot;</span>;
        counter = <span class="str">&quot;Web Service(_Total)\\Post Requests/sec&quot;</span>;
        counter = <span class="str">&quot;Web Service(_Total)\\Connection Attempts/sec&quot;</span>;
        counter = <span class="str">&quot;Web Service(_Total)\\Current Connections&quot;</span>;
        counter = <span class="str">&quot;Web Service(_Total)\\ISAPI Extension Requests/sec&quot;</span>;
        counter = <span class="str">&quot;Web Service Cache\\URI Cache Hits %&quot;</span>;
        counter = <span class="str">&quot;Web Service Cache\\Kernel: URI Cache Hits %&quot;</span>;
        counter = <span class="str">&quot;Web Service Cache\\File Cache Hits %&quot;</span>;
    }
}</pre>


<p><strong></strong></p>

<p><strong>PAL</strong></p>

<p><a href="https://pal.codeplex.com/">Performance Analysis of Logs (PAL)</a> is a tool by Microsoft Premier Field Engineer, <a href="https://blogs.technet.com/b/clinth/">Clint Huffman</a>. I haven’t had a chance to preview this tool yet, so I don’t want to speculate. It does seem to have a powerful feature set and following, so it’s definitely worth a look if you need a more comprehensive view.</p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET Performance Lab: Hello, World!</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/asp-net-performance-lab-hello-world</link>
      <pubDate>Mon, 06 Feb 2012 20:38:00 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/06/asp-net-performance-lab-hello-world/</guid>
      <description><![CDATA[I thought I could shed some light on the ASP.NET performance testing by presenting our most basic...]]></description>
      <content:encoded><![CDATA[<p>I thought I could shed some light on the ASP.NET performance testing by presenting our most basic scenario: Hello, World!</p>  <p><strong>Step 1: State the Objective</strong></p>  <p>We want to ensure that the basic ASP.NET pipeline does not regress from one release to the next.&#160; We use server throughput (requests per second) as our performance metric.&#160; We want throughput to be on-par or better than the previous release (aka, baseline).</p>  <p><strong>Step 2: Create the Scenario</strong></p>  <p>We have a basic IIS website with the following ASPX page:</p>  <pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">html</span><span class="kwrd">&gt;</span>
    <span class="asp">&lt;%</span>=”Hello, World!” <span class="asp">%&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre>


<p><strong>Step 3: Run the Scenario</strong></p>

<p>Most of our scenarios use the <a href="https://technet.microsoft.com/en-us/query/ms951774">wcat</a> load tool to test the web server.&#160; You can download wcat <a href="https://www.iis.net/community/default.aspx?tabid=34&amp;g=6&amp;i=1467">here</a>.</p>

<p>In order to detect regressions we need to have reproducible results.&#160; Here are some of the ways that we reduce variability:</p>

<ul>
  <li>Eliminate the variables.&#160; Since I am measuring ASP.NET performance, .NET should be my one variable.&#160; Other factors such as hardware, OS, IIS, wcat version and the scenario itself should remain constant.</li>

  <li>Use a private network.&#160; Eliminate unnecessary network traffic to the web server which could affect results.</li>

  <li>Minimize server processes.&#160; Again, we want to avoid competition for server resources.&#160; We usually disable Windows Firewall and run the wcat controller and clients from separate machines.</li>

  <li>Measure warm.&#160; Since we are testing throughput and not startup, we can reduce the variability by adding a warm-up period.&#160; This will reduce JIT compilation and population of caches which could cause more variance.</li>

  <li>Max the CPU.&#160; Server load and system resources factor into the equation as well.&#160; We try to keep this near-constant by applying a full load during testing.&#160; Our goal is to achieve at least 90% CPU usage during our runs. </li>
</ul>

<p>We quantify our test variance (aka, noise) by running multiple iterations.&#160; We ignore the first iteration which we’ve found to have greater variance, and calculate the average and standard deviation for the remaining three.&#160; Standard deviation is our noise indicator.</p>

<p><strong>Step 4: Analyze the Results</strong></p>

<p>After doing our baseline and test runs, we should have results like the following:</p>

<table border="1" cellspacing="0" cellpadding="2" width="400"><tbody>
    <tr>
      <td valign="top" width="57">Scenario</td>

      <td valign="top" width="57">Baseline</td>

      <td valign="top" width="57">Result</td>

      <td valign="top" width="57">Diff</td>

      <td valign="top" width="57">Baseline StdDev</td>

      <td valign="top" width="57">Result StdDev</td>

      <td valign="top" width="57">Pass/Fail</td>
    </tr>

    <tr>
      <td valign="top" width="57">HelloWorld</td>

      <td valign="top" width="57">41549.67</td>

      <td valign="top" width="57">40432.67</td>

      <td valign="top" width="57">-2.69%</td>

      <td valign="top" width="57">0.64%</td>

      <td valign="top" width="57">0.35%</td>

      <td valign="top" width="57">PASS</td>
    </tr>
  </tbody></table>

<p>These are the columns:</p>

<ul>
  <li>Baseline, Result – Requests per second average for the last 3 iterations of the run</li>

  <li>Diff – Percentage of how far off the Result is from the Baseline</li>

  <li>Baseline StdDev, Result StdDev – Percentage of variance between the run iterations</li>

  <li>Pass / Fail – Whether the Diff is above our threshold.</li>
</ul>

<p>Based on our experience we’ve set our threshold at 5%.&#160; We define failures as runs that are more than 5% regressed.&#160; Runs that show &gt;5% improvement should also be investigated in order to understand and validate the cause.</p>

<p>We consider a run noisy if the standard deviation exceeds a threshold, which we also set at 5%.&#160; If a failed run is noisy, we throw out one more iteration to see if the Diff and StdDev improve.&#160; If they do we may ignore the failure and wait for the next run.&#160; If the runs continue to be noisy, then the scenario should be investigated in order to further reduce the variance.</p>

<p><strong>Step 5: Investigate Regressions</strong></p>

<p>As the saying goes, “Measure Early, Measure Often”.&#160; The less changes there are between your runs, the easier it will be to track down the cause of your regressions.&#160; This is why the ASP.NET performance lab runs daily with builds from multiple branches.&#160; Often times I’m able to quickly identify a regression simply by looking at the source control history.</p>

<p>Another way to quickly diagnose regressions is to enable performance counters or other non-invasive tracing which could help identify the cause.&#160; We always save the wcat logs with our performance counters and other useful information such as throughput, working set, percent cpu usage, and HTTP responses.&#160; The HTTP responses can rule out test failures, while the other diagnostics (combined with source control) can help narrow down the cause.</p>

<p>Finally, if a quick diagnosis is not possible, find a good profiler.&#160; Some of the tools we use are the Visual Studio (F1) profiler, CLR Profiler, and XPerf.&#160; I hope to demonstrate some of these in future posts.</p>]]></content:encoded>
    </item>
    <item>
      <title>Web Performance Blog</title>
      <link>https://docs.microsoft.com/archive/blogs/web_performance_blog/web-performance-blog</link>
      <pubDate>Thu, 02 Feb 2012 15:55:00 GMT</pubDate>
      <dc:creator><![CDATA[Christy Henriksson]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/web_performance_blog/2012/02/02/web-performance-blog/</guid>
      <description><![CDATA[This week I launched a new blog that will focus on the performance of Microsoft&rsquo;s Web...]]></description>
      <content:encoded><![CDATA[<p>This week I launched a new blog that will focus on the performance of Microsoft&rsquo;s Web Stack.&nbsp; This includes IIS, ASP.NET, MVC, WCF, WF, Visual Web Developer, WebMatrix and much, much more.&nbsp; Content will be compiled from the performance team under Scott Guthrie that helps to deliver these products.</p>
<p><a href="https://blogs.msdn.com/b/web_performance_blog/">https://blogs.msdn.com/b/web_performance_blog/</a></p>
<p>I hope that our blog becomes a valuable resource for you and I welcome your feedback.&nbsp; Happy reading<em>!</em></p>
<p><em>-Christy Henriksson, ASP.NET Performance Champ</em></p>]]></content:encoded>
    </item>
  </channel>
</rss>