<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Richard Campbell Blogs Too - ASP.NET</title>
    <link>http://www.campbellassociates.ca/blog/</link>
    <description>Surrendering to the Inevitable</description>
    <language>en-us</language>
    <copyright>Richard Campbell</copyright>
    <lastBuildDate>Thu, 08 Nov 2007 00:55:14 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7067.0</generator>
    <managingEditor>richard@campbellassociates.ca</managingEditor>
    <webMaster>richard@campbellassociates.ca</webMaster>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=bdff864b-6487-455f-9ef5-98ad2735b365</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,bdff864b-6487-455f-9ef5-98ad2735b365.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,bdff864b-6487-455f-9ef5-98ad2735b365.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bdff864b-6487-455f-9ef5-98ad2735b365</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
And just like that, the tradeshow is over. Well, by the afternoon, anyway. I worked
in the booth for the morning shift, but had to ditch after lunch to work with Kent
on our first session of the conference: ASP.NET Scaling Strategies and Tactics. All
these sessions are residuals of all the consulting and research we've done creating <a href="http://www.strangeloopnetworks.com/">Strangeloop</a>.
</p>
        <p>
The session starts on the strategies of scaling first, and really there are only two:
Specialization and Distribution. Most folks think only about distribution when they're
scaling a web site, that is, adding more servers. But specialization not only plays
a critical role, but should play it first. Specialization is all about breaking down
your web application into smaller bits, whether it be separate SSL servers, image
servers, etc.
</p>
        <p>
Once you've done some specialization, distribution gets easier and more flexible.
</p>
        <p>
That's the strategic part of the session, then we dig into the tactics, more of the
details around what it takes to put those strategies into practice. For example, you
can set up your own image servers to take the load off your ASP.NET servers, or can
switch to a <a href="http://en.wikipedia.org/wiki/Content_Delivery_Network">Content
Delivery Network</a> (like <a href="http://www.akamai.com/">Akamai</a>) to handle
images. Most of the time, these tactics are specific to the application, ie, it depends. 
</p>
        <p>
When the session was over, I hustled across the conference center to do a <a href="http://www.dotnetrocks.com/">.NET
Rocks</a> Live with <a href="http://www.intellectualhedonism.com/">Carl</a>. Our guest
- Kent Alstad. Since Kent was on the <a href="http://www.dotnetrocks.com/default.aspx?showNum=246">ASP.NET
Scalability Panel</a> back at Tech Ed in June, we've received a number of emails from
folks asking for more... so we delivered. Since Kent was with us already, it was pretty
easy.
</p>
        <p>
We had a great crowd for the .NET Rocks Live, they really whooped it up. I'm sure
you'll hear it when the show is published.
</p>
        <p>
After that session I dropped into the Speaker Party for a couple of hours, up in the
penthouse suites of The Hotel at <a href="http://www.mandalaybay.com/">Mandalay Bay</a>.
Waaay too many people in too small a space, incredibly loud and lots and lots of fun.
</p>
        <p>
I didn't stay long though, I headed out to dinner at <a href="http://www.bellagio.com/restaurants/sensi.aspx">Sensi</a> at
the <a href="http://www.bellagio.com/">Bellagio</a> with the Strangeloop folks and
a few key influencers. 
</p>
        <p>
Tomorrow is another crazy busy day!
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=bdff864b-6487-455f-9ef5-98ad2735b365" />
      </body>
      <title>DevConnections Day 3: End of the Tradeshow, Beginning of Sessions</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,bdff864b-6487-455f-9ef5-98ad2735b365.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,bdff864b-6487-455f-9ef5-98ad2735b365.aspx</link>
      <pubDate>Thu, 08 Nov 2007 00:55:14 GMT</pubDate>
      <description>&lt;p&gt;
And just like that, the tradeshow is over. Well, by the afternoon, anyway. I worked
in the booth for the morning shift, but had to ditch after lunch to work with Kent
on our first session of the conference: ASP.NET Scaling Strategies and Tactics. All
these sessions are residuals of all the consulting and research we've done creating &lt;a href="http://www.strangeloopnetworks.com/"&gt;Strangeloop&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The session starts on the strategies of scaling first, and really there are only two:
Specialization and Distribution. Most folks think only about distribution when they're
scaling a web site, that is, adding more servers. But specialization not only plays
a critical role, but should play it first. Specialization is all about breaking down
your web application into smaller bits, whether it be separate SSL servers, image
servers, etc.
&lt;/p&gt;
&lt;p&gt;
Once you've done some specialization, distribution gets easier and more flexible.
&lt;/p&gt;
&lt;p&gt;
That's the strategic part of the session, then we dig into the tactics, more of the
details around what it takes to put those strategies into practice. For example, you
can set up your own image servers to take the load off your ASP.NET servers, or can
switch to a &lt;a href="http://en.wikipedia.org/wiki/Content_Delivery_Network"&gt;Content
Delivery Network&lt;/a&gt; (like &lt;a href="http://www.akamai.com/"&gt;Akamai&lt;/a&gt;) to handle
images. Most of the time, these tactics are specific to the application, ie, it depends. 
&lt;/p&gt;
&lt;p&gt;
When the session was over, I hustled across the conference center to do a &lt;a href="http://www.dotnetrocks.com/"&gt;.NET
Rocks&lt;/a&gt; Live with &lt;a href="http://www.intellectualhedonism.com/"&gt;Carl&lt;/a&gt;. Our guest
- Kent Alstad. Since Kent was on the &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=246"&gt;ASP.NET
Scalability Panel&lt;/a&gt; back at Tech Ed in June, we've received a number of emails from
folks asking for more... so we delivered. Since Kent was with us already, it was pretty
easy.
&lt;/p&gt;
&lt;p&gt;
We had a great crowd for the .NET Rocks Live, they really whooped it up. I'm sure
you'll hear it when the show is published.
&lt;/p&gt;
&lt;p&gt;
After that session I dropped into the Speaker Party for a couple of hours, up in the
penthouse suites of The Hotel at &lt;a href="http://www.mandalaybay.com/"&gt;Mandalay Bay&lt;/a&gt;.
Waaay too many people in too small a space, incredibly loud and lots and lots of fun.
&lt;/p&gt;
&lt;p&gt;
I didn't stay long though, I headed out to dinner at &lt;a href="http://www.bellagio.com/restaurants/sensi.aspx"&gt;Sensi&lt;/a&gt; at
the &lt;a href="http://www.bellagio.com/"&gt;Bellagio&lt;/a&gt; with the Strangeloop folks and
a few key influencers. 
&lt;/p&gt;
&lt;p&gt;
Tomorrow is another crazy busy day!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=bdff864b-6487-455f-9ef5-98ad2735b365" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,bdff864b-6487-455f-9ef5-98ad2735b365.aspx</comments>
      <category>.NET Rocks!</category>
      <category>ASP.NET</category>
      <category>PodCasting</category>
      <category>Speaking</category>
      <category>Strangeloop</category>
      <category>Travel</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=ea779f7e-4d25-43d5-9b07-a59e94cd607b</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,ea779f7e-4d25-43d5-9b07-a59e94cd607b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,ea779f7e-4d25-43d5-9b07-a59e94cd607b.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ea779f7e-4d25-43d5-9b07-a59e94cd607b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Carl and I grabbed an interview with Dino Esposito in a quiet room during the conference,
his viewpoint on Silverlight and ASP.NET technologies is always interesting.
</p>
        <p>
Dino's session on "What Partial Rendering is not AJAX" rang true for me as well -
his point is that the essence of AJAX is pushing page rendering to the browser, rather
than computing it on the server. But partial rendering still computes the HTML on
the server and sends it to the browser to display. This undermines the goal of AJAX.
</p>
        <p>
I had last session of the day (and conference) and a huge crowd for my load testing
talk today, as usual there were relatively few folks in the audience that had done
load testing before, so a lot of my talk focused on the fundamentals of why and where
for load testing. The data we've gathered around Strangeloop is great stuff for getting
people started.
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=ea779f7e-4d25-43d5-9b07-a59e94cd607b" />
      </body>
      <title>DevReach Day Two</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,ea779f7e-4d25-43d5-9b07-a59e94cd607b.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,ea779f7e-4d25-43d5-9b07-a59e94cd607b.aspx</link>
      <pubDate>Tue, 02 Oct 2007 21:41:14 GMT</pubDate>
      <description>&lt;p&gt;
Carl and I grabbed an interview with Dino Esposito in a quiet room during the conference,
his viewpoint on Silverlight and ASP.NET technologies is always interesting.
&lt;/p&gt;
&lt;p&gt;
Dino's session on "What Partial Rendering is not AJAX" rang true for me as well -
his point is that the essence of AJAX is pushing page rendering to the browser, rather
than computing it on the server. But partial rendering still computes the HTML on
the server and sends it to the browser to display. This undermines the goal of AJAX.
&lt;/p&gt;
&lt;p&gt;
I had last session of the day (and conference) and a huge crowd for my load testing
talk today, as usual there were relatively few folks in the audience that had done
load testing before, so a lot of my talk focused on the fundamentals of why and where
for load testing. The data we've gathered around Strangeloop is great stuff for getting
people started.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=ea779f7e-4d25-43d5-9b07-a59e94cd607b" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,ea779f7e-4d25-43d5-9b07-a59e94cd607b.aspx</comments>
      <category>.NET Rocks!</category>
      <category>ASP.NET</category>
      <category>PodCasting</category>
      <category>Speaking</category>
      <category>Testing</category>
      <category>Travel</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=3fb1af9d-7ae4-4e1d-ae02-961acba2f651</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,3fb1af9d-7ae4-4e1d-ae02-961acba2f651.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,3fb1af9d-7ae4-4e1d-ae02-961acba2f651.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3fb1af9d-7ae4-4e1d-ae02-961acba2f651</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Sold out! Yep, the show is packed. Its not the biggest show in the world, but the
attendees are focused and excited to be here. The keynote speech today included the
local Microsoft folks and <a href="http://www.telerik.com/">Telerik</a> and, of course,
Tim Huckaby! Tim's stories around building great applications that change the world
are hard to touch. The audience was spellbound.
</p>
        <p>
My work came in the afternoon, I took the <a href="http://www.campbellassociates.ca/blog/PermaLink,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx">Scaling
Habits of ASP.NET Applications</a> out for a spin again, with lots of interesting
questions and discussion afterward.
</p>
        <p>
In the evening Carl and I ran a panel discussion on WPF with <a href="http://blogs.interknowlogy.com/timhuckaby/">Tim
Huckaby</a>, <a href="http://www.softinsight.com/bnoyes/">Brian Noyes</a> and <a href="http://telerikwatch.com/">Todd
Anglin</a>.
</p>
        <p>
Tomorrow is the last day, then we're touring Sofia!
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=3fb1af9d-7ae4-4e1d-ae02-961acba2f651" />
      </body>
      <title>DevReach Day One</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,3fb1af9d-7ae4-4e1d-ae02-961acba2f651.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,3fb1af9d-7ae4-4e1d-ae02-961acba2f651.aspx</link>
      <pubDate>Mon, 01 Oct 2007 21:25:14 GMT</pubDate>
      <description>&lt;p&gt;
Sold out! Yep, the show is packed. Its not the biggest show in the world, but the
attendees are focused and excited to be here. The keynote speech today included the
local Microsoft folks and &lt;a href="http://www.telerik.com/"&gt;Telerik&lt;/a&gt; and, of course,
Tim Huckaby! Tim's stories around building great applications that change the world
are hard to touch. The audience was spellbound.
&lt;/p&gt;
&lt;p&gt;
My work came in the afternoon, I took the &lt;a href="http://www.campbellassociates.ca/blog/PermaLink,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx"&gt;Scaling
Habits of ASP.NET Applications&lt;/a&gt; out for a spin again, with lots of interesting
questions and discussion afterward.
&lt;/p&gt;
&lt;p&gt;
In the evening Carl and I ran a panel discussion on WPF with &lt;a href="http://blogs.interknowlogy.com/timhuckaby/"&gt;Tim
Huckaby&lt;/a&gt;, &lt;a href="http://www.softinsight.com/bnoyes/"&gt;Brian Noyes&lt;/a&gt; and &lt;a href="http://telerikwatch.com/"&gt;Todd
Anglin&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Tomorrow is the last day, then we're touring Sofia!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=3fb1af9d-7ae4-4e1d-ae02-961acba2f651" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,3fb1af9d-7ae4-4e1d-ae02-961acba2f651.aspx</comments>
      <category>.NET Rocks!</category>
      <category>ASP.NET</category>
      <category>PodCasting</category>
      <category>Speaking</category>
      <category>Strangeloop</category>
      <category>Travel</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=849dac76-8899-424b-b514-e29ed93e0b21</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=849dac76-8899-424b-b514-e29ed93e0b21</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Blame <a href="http://www.dasblonde.net/">Michele Leroux Bustamante</a> for this one
- she talked me into coming down to do a couple of presentations at the <a href="http://socalcodecamp.com/">SoCal
Code Camp</a>.
</p>
        <p>
I did my Querying Talk again, but also took The Scaling Habits of ASP.NET out for
a spin for the first time since the <a href="http://www.vancouvertechfest.com/">Vancouver
TechFest</a>.
</p>
        <p>
Scaling Habits is a fun talk for me because it really is a tour through the evolution
of an ASP.NET application - from those early days where you're one guy with a clever
idea for a web app, through to what it takes to run a large scale site with multiple
servers and the related bureaucracy for operating it.
</p>
        <p>
Along the way I talk about the elements of the evolving site - how much traffic is
typical, the kinds of metrics that matter, and so on. And most importantly, what it
takes to move to the next level of evolution for the application.
</p>
        <p>
At the core of this whole concept is the idea of the Performance Equation. <a href="http://www.campbellassociates.ca/blog/content/binary/WindowsLiveWriter/SpeakingattheSoCalCodeCamp_E191/PerformanceEquation.gif" atomicselection="true"><img style="margin: 10px" height="79" alt="The Performance Equation" src="http://www.campbellassociates.ca/blog/content/binary/WindowsLiveWriter/SpeakingattheSoCalCodeCamp_E191/PerformanceEquation_thumb.gif" width="623" /></a></p>
        <p>
A quick description of each factor in the performance equation:
</p>
        <table cellspacing="0" cellpadding="2" width="627" border="0" unselectable="on">
          <tbody>
            <tr>
              <td valign="top" width="137">
R</td>
              <td valign="top" width="488">
Response time (in seconds)</td>
            </tr>
            <tr>
              <td valign="top" width="138">
Payload</td>
              <td valign="top" width="488">
Total number of bytes being transmitted</td>
            </tr>
            <tr>
              <td valign="top" width="139">
Bandwidth</td>
              <td valign="top" width="488">
The transfer rate available</td>
            </tr>
            <tr>
              <td valign="top" width="140">
RTT</td>
              <td valign="top" width="488">
Round Trip Time</td>
            </tr>
            <tr>
              <td valign="top" width="141">
AppTurns</td>
              <td valign="top" width="488">
Number of requests that make up the web page</td>
            </tr>
            <tr>
              <td valign="top" width="142">
Concurrent Requests</td>
              <td valign="top" width="488">
How many requests will be run simultaneously to build the page</td>
            </tr>
            <tr>
              <td valign="top" width="143">
Cs</td>
              <td valign="top" width="488">
Compute time on the server</td>
            </tr>
            <tr>
              <td valign="top" width="143">
Cc</td>
              <td valign="top" width="488">
Compute time on the client</td>
            </tr>
          </tbody>
        </table>
        <p>
Now I can't take credit for this equation, I did not invent it. The original one comes
from the <a href="http://www.netforecast.com/Reports/NFR5085%20Field%20Guide%20to%20Application%20Delivery%20Systems.pdf">"Field
Guide to Application Delivery Systems" by Peter Sevcik and Rebecca Wetzel from NetForecast</a>.
However, I did make one change to it - the original equation does not account for
simultaneous downloading of resource files and the base overhead of the page file
itself. That is represented by the separate addition of an RTT and dividing the rest
of the AppTurns by the number of concurrent requests.
</p>
        <p>
So all of these factors go into the time it takes for a web page to fully render on
your web browser after you request it. 
</p>
        <p>
When I display the equation to an audience, I always ask the question: "What part
do you work on?" When I'm talking to ASP.NET developers, invariably the answer is
Cs - Compute time on the server. After all, that's the code you wrote. But if you
don't know what Cs is in relation to all the other factors of the equation, how do
you know if that's the right thing to work on?
</p>
        <p>
Some other interesting issues I've run into once I started looking at web performance
this way:
</p>
        <ul>
          <li>
In many cases bandwidth is just not the issue, we have lots. But when it *is* an issue,
often we don't test with the same bandwidth that the customer has, so we don't realize
when bandwidth is a problem. 
</li>
          <li>
Round Trip Time is the ping time between the customer and the server. Again, since
we often test with servers that are so close to us that the ping time is ultra-low,
we don't have test conditions that match with our customers. Its amazing how huge
a factor bad RTT can be for performance. 
</li>
          <li>
AppTurns of course exacerbate RTT times, because its a multiplier - if you have a
dozen JS files, a dozen CSS files and thirty images (which is remarkably common),
you're talking about over 50 AppTurns, and even divided by Concurrent Requests, that
expands response time by lots of seconds. 
</li>
          <li>
Normally, with Internet Explorer and FireFox, the number of Concurrent Requests is
four. It can be adjusted at the client computer, but its very rarely done. It is possible
to do a trick with URI renaming where each resource appears to come from a separate
server so that you can fool the web browsers into doing more than four concurrent
requests. 
</li>
          <li>
Compute time on the client becomes a significant issue when you get heavy with the
Javascript, most often seen with AJAX-style pages. In my opinion, getting the browser
more involved in generating a web page is a good idea, but you need to account for
the cost involved. If you're only looking at server compute times, then of course
AJAX looks like a brilliant solution - because you've hidden the cost.</li>
        </ul>
        <p>
Now that's not to say that Compute Time on the Server isn't important to the equation
- it *might* be. But you should know for sure before you pour your time into improving
it. Going through the exercise of breaking down where the total response time goes
is a critical first step to making sure your effort is going to the right place.
</p>
        <p>
Thanks again to all the folks at the <a href="http://socalcodecamp.com/">SoCal Code
Camp</a> - I had a fantastic time, I'd love to come down again!
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=849dac76-8899-424b-b514-e29ed93e0b21" />
      </body>
      <title>Speaking at the SoCalCodeCamp!</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx</link>
      <pubDate>Mon, 02 Jul 2007 01:07:14 GMT</pubDate>
      <description>&lt;p&gt;
Blame &lt;a href="http://www.dasblonde.net/"&gt;Michele Leroux Bustamante&lt;/a&gt; for this one
- she talked me into coming down to do a couple of presentations at the &lt;a href="http://socalcodecamp.com/"&gt;SoCal
Code Camp&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I did my Querying Talk again, but also took The Scaling Habits of ASP.NET out for
a spin for the first time since the &lt;a href="http://www.vancouvertechfest.com/"&gt;Vancouver
TechFest&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Scaling Habits is a fun talk for me because it really is a tour through the evolution
of an ASP.NET application - from those early days where you're one guy with a clever
idea for a web app, through to what it takes to run a large scale site with multiple
servers and the&amp;nbsp;related bureaucracy for operating it.
&lt;/p&gt;
&lt;p&gt;
Along the way I talk about the elements of the evolving site - how much traffic is
typical, the kinds of metrics that matter, and so on. And most importantly, what it
takes to move to the next level of evolution for the application.
&lt;/p&gt;
&lt;p&gt;
At the core of this whole concept is the idea of the Performance Equation. &lt;a href="http://www.campbellassociates.ca/blog/content/binary/WindowsLiveWriter/SpeakingattheSoCalCodeCamp_E191/PerformanceEquation.gif" atomicselection="true"&gt;&lt;img style="margin: 10px" height="79" alt="The Performance Equation" src="http://www.campbellassociates.ca/blog/content/binary/WindowsLiveWriter/SpeakingattheSoCalCodeCamp_E191/PerformanceEquation_thumb.gif" width="623"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
A quick description of each&amp;nbsp;factor in the performance equation:
&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="627" border="0" unselectable="on"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="137"&gt;
R&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Response time (in seconds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="138"&gt;
Payload&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Total number of bytes being transmitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="139"&gt;
Bandwidth&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
The transfer rate available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
RTT&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Round Trip Time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="141"&gt;
AppTurns&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Number of requests that make up the web page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="142"&gt;
Concurrent Requests&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
How many requests will be run simultaneously to build the page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="143"&gt;
Cs&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Compute time on the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="143"&gt;
Cc&lt;/td&gt;
&lt;td valign="top" width="488"&gt;
Compute time on the client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Now I can't take credit for this equation, I did not invent it. The original one comes
from the &lt;a href="http://www.netforecast.com/Reports/NFR5085%20Field%20Guide%20to%20Application%20Delivery%20Systems.pdf"&gt;"Field
Guide to Application Delivery Systems" by Peter Sevcik and Rebecca Wetzel from NetForecast&lt;/a&gt;.
However, I did make one change to it - the original equation does not account for
simultaneous downloading of resource files and the base overhead of the page file
itself. That is represented by the separate addition of an RTT and dividing the rest
of the AppTurns by the number of concurrent requests.
&lt;/p&gt;
&lt;p&gt;
So all of these factors go into the time it takes for a web page to fully render on
your web browser after you request it. 
&lt;/p&gt;
&lt;p&gt;
When I display the equation to an audience, I always ask the question: "What part
do you work on?" When I'm talking to ASP.NET developers, invariably the answer is
Cs - Compute time on the server. After all, that's the code you wrote. But if you
don't know what Cs is in relation to all the other factors of the equation, how do
you know if that's the right thing to work on?
&lt;/p&gt;
&lt;p&gt;
Some other interesting issues I've run into once I started looking at web performance
this way:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
In many cases bandwidth is just not the issue, we have lots. But when it *is* an issue,
often we don't test with the same bandwidth that the customer has, so we don't realize
when bandwidth is a problem. 
&lt;li&gt;
Round Trip Time is the ping time between the customer and the server. Again, since
we often test with servers that are so close to us that the ping time is ultra-low,
we don't have test conditions that match with our customers. Its amazing how huge
a factor bad RTT can be for performance. 
&lt;li&gt;
AppTurns of course exacerbate RTT times, because its a multiplier - if you have a
dozen JS files, a dozen CSS files and thirty images (which is remarkably common),
you're talking about over 50 AppTurns, and even divided by Concurrent Requests, that
expands response time by lots of seconds. 
&lt;li&gt;
Normally, with Internet Explorer and FireFox, the number of Concurrent Requests is
four. It can be adjusted at the client computer, but its very rarely done. It is possible
to do a trick with URI renaming where each resource appears to come from a separate
server so that you can fool the web browsers into doing more than four concurrent
requests. 
&lt;li&gt;
Compute time on the client becomes a significant issue when you get heavy with the
Javascript, most often seen with AJAX-style pages. In my opinion, getting the browser
more involved in generating a web page is a good idea, but you need to account for
the cost involved. If you're only looking at server compute times, then of course
AJAX looks like a brilliant solution - because you've hidden the cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now that's not to say that Compute Time on the Server isn't important to the equation
- it *might* be. But you should know for sure before you pour your time into improving
it. Going through the exercise of breaking down where the total response time goes
is a critical first step to making sure your effort is going to the right place.
&lt;/p&gt;
&lt;p&gt;
Thanks again to all the folks at the &lt;a href="http://socalcodecamp.com/"&gt;SoCal Code
Camp&lt;/a&gt; - I had a fantastic time, I'd love to come down again!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=849dac76-8899-424b-b514-e29ed93e0b21" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,849dac76-8899-424b-b514-e29ed93e0b21.aspx</comments>
      <category>ASP.NET</category>
      <category>Speaking</category>
      <category>SQL Server</category>
      <category>Strangeloop</category>
      <category>Travel</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=d71f658b-d4eb-4498-af42-35977b42fb35</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,d71f658b-d4eb-4498-af42-35977b42fb35.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,d71f658b-d4eb-4498-af42-35977b42fb35.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d71f658b-d4eb-4498-af42-35977b42fb35</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been assembling my notes for my Chalk Talk on ASP.NET Scaling at TechEd US in
Orlando.
</p>
        <p>
The Chalk Talk will be held on Friday June 8 at 1pm, in the ASP.NET Community Area.
</p>
        <p>
The biggest challenge in talking about scaling is to not fall into a discussion on
performance. Most folks mix conversation about scaling and performance together, on
the assumption that excellent performance provides excellent scaling. It isn't true
- in some cases, to get great scalability, you have to impede performance. In reality,
the best case scenario for scaling up an application is to maintain performance, not
to improve it.
</p>
        <p>
Performance is all about how quickly your web page responds to a request, scale is
about how many requests you can handle at once. The "at once" part of that statement
is important, since the idea that excellent performance provides excellent scale only
is true when requests are not "at once", but fairly close together. If you could compute
every page in 50ms and you only got requests every 100ms, you'd only be handling one
request at a time... your great performance has given you the illusion of great scale.
A lot of people consider this scaling, but its not really. Real scale is all about
how your site handles simultaneous traffic.
</p>
        <p>
There are two fundamental techniques for scaling: specialization and distribution.
</p>
        <p>
Specialization is the process of separating out specific tasks that your web application
does and building/buying specialized resources to handle those tasks better. You already
do this - you have a separate database from your web servers. When you get into large
scale web sites, image handling often becomes a specialization. You could set up dedicate
image servers, or even offload that work to a third party company like Akamai. Getting
the load of image handling out of your web servers allows them to handle more of the
requests that they need to handle: Processing ASP.NET web pages. Obviously the challenge
of making specialization work is going through every web page and altering the image
tags so that they point at the image servers: Time consuming, but not especially hard.
That's scaling by specialization.
</p>
        <p>
The other technique for scaling is distribution. The key to distribution is creating
multiple copies of the same resources and balancing work between them. Typically this
would be multiple, identical web servers and a load balancer. The challenge to making
distribution work well is effective load balancing, and that means a lack of affinity.
That means no data specific to a given session kept in the web server, all of that
information has to be available to every web server in the farm. There are a variety
of affinite resources in ASP.NET, the best known of which is Session, and there are
a variety of methods for making those resources non-affinite, the best known method
being to write them to SQL Server.
</p>
        <p>
This is where we get into the performance/scaling compromise: moving Session data
out of the web server and over to SQL Server definitely slows down performance, in
exchange for being much more scalable. But this is not a simple curve - sure, this
method is slower per request on average, but that speed doesn't change for longer
as the number of simultaneous requests increases. 
</p>
        <p>
Distribution also opens up advantages for reliability and maintainability, in exchange
for dealing with the complexity of multiple servers. That's outside the scope of purely
looking at scalability, but its certainly relevant to the equation over all. Its also
important to remember that scalability isn't the only reason to have a web farm.
</p>
        <p>
Of course, you can combine these two techniques, having specialized resources and
distributing them across multiple servers. And this adds an additional advantage:
You can scale each of those specialized resources independently. So if you need to
improve the scalability of images, expand the image server farm.
</p>
        <p>
The key to both these techniques is good instrumentation: You need to know where the
problems are. Specialization helps because it creates clear boundaries between the
various resources involved in a web application. And often you'll find that the non-affinity
step you skipped becomes your key problem scaling up - and it will be instrumentation
that will show that too you. Of course, then we get into the argument of whether or
not the instrumentation *is* the problem, because it too exerts a certain amount of
load on the servers.
</p>
        <p>
There's more than just this to talk about as well: There are a variety of techniques
for going to a non-affinity solution, there's also the challenges of caching at scale
and invalidation.
</p>
        <p>
And don't forget the database! As you scale up your web farm, the database can represent
a serious bottleneck. Solving that is a huge task on its own, involving its own implementations
around specialization and distribution.
</p>
        <p>
I had originally suggested this topic as a breakout session, but I'm really looking
forward to doing it as a Chalk Talk, for the higher level of interaction I expect
to have with the audience. Chalk Talks are a lot more intimate, I'm going to steer
clear of a slide deck and focus on using the white board to look at the various evolutions
of a web application as it scales up.
</p>
        <p>
Hope to see you there!
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=d71f658b-d4eb-4498-af42-35977b42fb35" />
      </body>
      <title>ASP.NET Scaling Chalk Talk at TechEd US</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,d71f658b-d4eb-4498-af42-35977b42fb35.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,d71f658b-d4eb-4498-af42-35977b42fb35.aspx</link>
      <pubDate>Fri, 25 May 2007 18:56:04 GMT</pubDate>
      <description>&lt;p&gt;
I've been assembling my notes for my Chalk Talk on ASP.NET Scaling at TechEd US in
Orlando.
&lt;/p&gt;
&lt;p&gt;
The Chalk Talk will be held on Friday June 8 at 1pm, in the ASP.NET Community Area.
&lt;/p&gt;
&lt;p&gt;
The biggest challenge in talking about scaling is to not fall into a discussion on
performance. Most folks mix conversation about scaling and performance together, on
the assumption that excellent performance provides excellent scaling. It isn't true
- in some cases, to get great scalability, you have to impede performance. In reality,
the best case scenario for scaling up an application is to maintain performance, not
to improve it.
&lt;/p&gt;
&lt;p&gt;
Performance is all about how quickly your web page responds to a request, scale is
about how many requests you can handle at once. The "at once" part of that statement
is important, since the idea that excellent performance provides excellent scale only
is true when requests are not "at once", but fairly close together. If you could compute
every page in 50ms and you only got requests every 100ms, you'd only be handling one
request at a time... your great performance has given you the illusion of great scale.
A lot of people consider this scaling, but its not really. Real scale is all about
how your site handles simultaneous traffic.
&lt;/p&gt;
&lt;p&gt;
There are two fundamental techniques for scaling: specialization and distribution.
&lt;/p&gt;
&lt;p&gt;
Specialization is the process of separating out specific tasks that your web application
does and building/buying specialized resources to handle those tasks better. You already
do this - you have a separate database from your web servers. When you get into large
scale web sites, image handling often becomes a specialization. You could set up dedicate
image servers, or even offload that work to a third party company like Akamai. Getting
the load of image handling out of your web servers allows them to handle more of the
requests that they need to handle: Processing ASP.NET web pages. Obviously the challenge
of making specialization work is going through every web page and altering the image
tags so that they point at the image servers: Time consuming, but not especially hard.
That's scaling by specialization.
&lt;/p&gt;
&lt;p&gt;
The other technique for scaling is distribution. The key to distribution is creating
multiple copies of the same resources and balancing work between them. Typically this
would be multiple, identical web servers and a load balancer. The challenge to making
distribution work well is effective load balancing, and that means a lack of affinity.
That means no data specific to a given session kept in the web server, all of that
information has to be available to every web server in the farm. There are a variety
of affinite resources in ASP.NET, the best known of which is Session, and there are
a variety of methods for making those resources non-affinite, the best known method
being to write them to SQL Server.
&lt;/p&gt;
&lt;p&gt;
This is where we get into the performance/scaling compromise: moving Session data
out of the web server and over to SQL Server definitely slows down performance, in
exchange for being much more scalable. But this is not a simple curve - sure, this
method is slower per request on average, but that speed doesn't change for longer
as the number of simultaneous requests increases. 
&lt;/p&gt;
&lt;p&gt;
Distribution also opens up advantages for reliability and maintainability, in exchange
for dealing with the complexity of multiple servers. That's outside the scope of purely
looking at scalability, but its certainly relevant to the equation over all. Its also
important to remember that scalability isn't the only reason to have a web farm.
&lt;/p&gt;
&lt;p&gt;
Of course, you can combine these two techniques, having specialized resources and
distributing them across multiple servers. And this adds an additional advantage:
You can scale each of those specialized resources independently. So if you need to
improve the scalability of images, expand the image server farm.
&lt;/p&gt;
&lt;p&gt;
The key to both these techniques is good instrumentation: You need to know where the
problems are. Specialization helps because it creates clear boundaries between the
various resources involved in a web application. And often you'll find that the non-affinity
step you skipped becomes your key problem scaling up - and it will be instrumentation
that will show that too you. Of course, then we get into the argument of whether or
not the instrumentation *is* the problem, because it too exerts a certain amount of
load on the servers.
&lt;/p&gt;
&lt;p&gt;
There's more than just this to talk about as well: There are a variety of techniques
for going to a non-affinity solution, there's also the challenges of caching at scale
and invalidation.
&lt;/p&gt;
&lt;p&gt;
And don't forget the database! As you scale up your web farm, the database can represent
a serious bottleneck. Solving that is a huge task on its own, involving its own implementations
around specialization and distribution.
&lt;/p&gt;
&lt;p&gt;
I had originally suggested this topic as a breakout session, but I'm really looking
forward to doing it as a Chalk Talk, for the higher level of interaction I expect
to have with the audience. Chalk Talks are a lot more intimate, I'm going to steer
clear of a slide deck and focus on using the white board to look at the various evolutions
of a web application as it scales up.
&lt;/p&gt;
&lt;p&gt;
Hope to see you there!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=d71f658b-d4eb-4498-af42-35977b42fb35" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,d71f658b-d4eb-4498-af42-35977b42fb35.aspx</comments>
      <category>ASP.NET</category>
      <category>Speaking</category>
      <category>Tech Ed</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6</wfw:commentRss>
      <title>Cooking Up a No Code ASP.NET Tuning Solution!</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6.aspx</link>
      <pubDate>Mon, 21 May 2007 22:15:50 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;I’ve been talking about &lt;a href="http://www.campbellassociates.ca/blog/default.aspx#a1097b5f2-c5e1-4cbe-b7c1-59b473c50076"&gt;load-testing
ASP.NET applications&lt;/a&gt;, and &lt;a href="http://www.campbellassociates.ca/blog/PermaLink,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx"&gt;what
it’s like when you fail&lt;/a&gt;. Well, now I can finally talk about why I’ve been thinking
about all this stuff. I just spent the last two weeks talking to people about our
launch and getting feedback from analysts about the &lt;a href="http://strangeloopnetworks.com/"&gt;Strangeloop
AppScaler&lt;/a&gt;, and now I can finally talk about it in public!&lt;/span&gt;&lt;span lang=EN-US style="COLOR: #003300"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Here are the basics: You already know how application
tuning impairs the development process. Not only does it take a long time for pretty
limited returns, but it takes you from this lightweight, fast ASP.NET development
process—the whole reason you started using ASP.NET in the first place—to this much
more ponderous endeavor, where every piece of performance tuning you do places new
requirements on everything else you’re coding moving forward. Well, the &lt;a href="http://www.strangeloopnetworks.com/"&gt;Strangeloop
AppScaler&lt;/a&gt; basically takes that entire application tuning process and puts it in
a box. It’s a very, very cool thing. But now that we're out in the open, what I really
want to talk about is how we got here.&lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;It all started with looking for a better way
to do session. Everybody’s talked about session, and everybody knows that it could
be handled better, but nobody had actually done it. The default, of course, is in-process
session. Since we all start development on a single web server, in-process makes sense.
But as the application becomes more important, more web servers are needed, and the
idea of going out-of-process comes up.&lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Microsoft provides two out-of-process approaches.
One is using SQL Server, which you likely already have, since it’s where you store
your data. But SQL Server is kind of overkill for session, since you're just storing
a blob of session data there: you don't really need the power of SQL Server for that.
SQL Server is reliable, but slow. The alternative is State Server, which is substantially
faster, but isn't reliable and generally isn't a great bit of software.&lt;/span&gt;&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;And switching session methods is pretty trivial,
since all you have to change is the web.config file. Although one issue people occasionally
run into is that they haven't marked their objects for serialization. In very rare
cases, they can't serialize their objects, but for the most part, it’s just about
setting properties correctly.&lt;/span&gt;&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Typically, most people deal with the issue by
leaving session in-process and using a load balancer that supports sticky session,
where the load balancer uses the ASP.NET cookie (or IP address) to *stick* a given
user to the same web server each time they visit the site. While it certainly solves
the problem of session, it undermines the value of a web farm. If the server goes
down, the session’s lost. Some servers can end up much busier than others, so you
aren't really balancing your load. And server updates tend to be a major pain. &lt;/span&gt;&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;To really load balance, to get the full advantage
of your web farm in terms of performance and reliability, you need to get the session
data out of the web server and go out-of-process. When you do that, you can load balance
properly and go to any web server you want, but it means that session processing takes
longer. So originally, our mission was to really look at session and figure out a
way to get in-process performance but with out-of-process flexibility. &lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;When we did all the math to figure out exactly
why doing session out-of-process was so much slower, we found it was network trips
were a major part of the processing time. Every request/response pair with out-of-process
session means two additional network trip pairs: to fetch the session data at the
beginning of the&amp;nbsp;response computation, and to write the modified session data
out at the end of the&amp;nbsp;response computation. But the only reason all these network
trips happen is that the request travels all the way to the web server before the
server realizes it needs session data. So we thought, “What if we put the session
data in front of the web server, so by the time the request gets to the web server,
it already has the data?”&lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;That’s what AppScaler does (well, one of the
things it does). As a request comes in, it passes through AppScaler, and AppScaler
says, “I don’t care what server you’re going to, here’s the session data you need.”
Then it attaches the session data onto the request. When the request arrives at the
web server, the session provider strips the session data out of the request and the
page processes normally. When it finishes computing the response it attaches the session
data to the response and sends it back to the browser. On the way out the&amp;nbsp;response
passes through AppScaler, and AppScaler removes the session data and stores it away
in its network cache, and everything proceeds normally from there. &lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;So suddenly, we’d eliminated all these extra
network trips, but we were still out of process, so you still have all that flexibility.
Pretty cool, right? Then we took it a step further and said, “Gee whiz, since we’re
already here doing this, why don’t we just do viewstate too?” As you know, viewstate
can get totally out of hand, typically due to the use of third-party controls, which
is why the really performance-conscious sites don’t use third-party controls at all.
And giving up third-party controls means either slowing down your development process
to create controls yourself, or just not using all the controls that you otherwise
might. With AppScaler, you can use all the controls you want (within reason). It takes
that viewstate out of the page before it goes to the browser, so you don’t pay the
performance penalty.&lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;So fixing session and viewstate were the first
features of AppScaler, and the results were pretty impressive—we were really cutting
down page sizes and seeing substantial performance gains. And that’s when we had the
big realization: Now that we’re sitting here in front of the web server farm where
we can see all this traffic, there are all kinds of smart things we can do to optimize
the performance of ASP.NET applications!&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Fixing browser caching was low-hanging fruit
for us. With browser caching, you mark various resource files (images, js and cs files,
for example) as cacheable at the browser, normally with some sort of time limit (a
day, a week, etc). Once the browser caches those items, it won’t request them again
for as long as the cache is valid. That gives substantial performance gains since
you cut down a lot of the&amp;nbsp;resource requests that make a web page work.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;The downside to browser caching is when you
go to update the website. Unless you’re extremely careful, you can end up with browsers
messing up your new pages because they use cached items instead of new items. And
of course the pages that get messed up are the ones the CEO is looking at, because
he hangs out on the site all the time and has everything under the sun in the browser
cache. In my experience, people abandon browser caching after an event like that,
and never use it again.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;AppScaler fixes browser caching by dealing with
expiration properly. First off, you specify what to cache in AppScaler, so that you
don’t have to fiddle with settings on your web servers. AppScaler just automatically
marks those resource files for caching as they pass through on the way to the browser.
But then the really clever bit comes into play: AppScaler watches the resource files
on the web server so that when there is an update, it sees it and knows the underlying
files have changed.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Once AppScaler knows a resource file has changed,
it dynamically renames it in the request/response pairs so that the browser doesn’t
have it cached. It keeps up the renaming until the cache expires. So suddenly browser
caching doesn’t cause problems with website updates.&lt;/span&gt;&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Our experience with ASP.NET has demonstrated
again and again that caching is king. And when we studied the potential of caching
with AppScaler, we realized that self-learning caching was the number one performance
return we could offer with this idea. Being between the browser and the web farm is
the perfect place to cache and to coordinate cache expiries. As a developer, you know
you have to cache, and you can write code to do it, but it’s a lot of programming,
and it changes the way you have to code going forward. More than that, you have to
figure out what to cache. You might guess wrong. Or more likely, because of the time
and effort involved, you’re probably only going to cache a few things that are obvious. &lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;AppScaler Response Cache evolved from that
experience. It started out as a system for monitoring traffic, looking for where the
request/response pairs match, and how frequently a response is different for a given
request. It looks at parameters, such as querystring and POST elements to identify
different requests. So by watching all traffic going to and from the application,
AppScaler learns what to cache, and when to expire it.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;Based on those recommendations, you can tell
AppScaler to actually cache the items, or you can put it into an automatic mode, where
AppScaler will cache what it thinks it should. This automated caching feature is incredibly
useful for dealing with Slashdot or Digg events, where suddenly traffic is up 10 or
100 times.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;But ultimately, the real advantage is the
lack of coding – writing caching code in ASP.NET works, but it slows down the development
cycle going forward. AppScaler gives you the same benefits, but without the impact
on your development.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: #003300"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US style="COLOR: black"&gt;Now for the record, if all of this sounds very
straightforward, it’s because I’m just giving the highlights here. Making all of this
work together has been an extremely complex, time-consuming project. Also, while I’m
really excited about it, I want to be clear that this is not going to fix every problem.
If your pages are a megabyte apiece and half of that is viewstate, for example, we’re
going to have a tough time helping you at any significant level of scale. You’re still
going to have to do some basic tuning. But it’s when you get into the really exotic
tuning, when you’re doing these miniscule kinds of tweaks and breaking pages down
fraction by fraction to find out where you can squeeze a little more performance out
of it—the stuff that really impairs your coding more than anything else—that’s when
AppScaler can really help you out. And this is just a subset of the things it can
do. I listed four features here. There are more than twenty others on the books today,
and the list keeps growing. &lt;/span&gt;&lt;span style="COLOR: #003300; mso-ansi-language: EN-CA"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,1ee1c4cd-fa2f-4934-91d8-7eba7c7cbcb6.aspx</comments>
      <category>ASP.NET</category>
      <category>Strangeloop</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=e3a3dff9-d134-43b7-b366-1a4433dfc824</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,e3a3dff9-d134-43b7-b366-1a4433dfc824.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,e3a3dff9-d134-43b7-b366-1a4433dfc824.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e3a3dff9-d134-43b7-b366-1a4433dfc824</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Decided not to work on Sunday for a change.
</p>
        <p>
Instead, I upgraded servers! Ah, such a geek.
</p>
        <p>
My old web server <a href="http://www.southparkstudios.com/show/display_char.php?id=3">Stan</a> is
very very old... P3 1Ghz with 512MB of RAM. Running <a href="http://www.microsoft.com/windows2000/default.mspx">Windows
2000</a>, it has been a workhorse of a machine. I put <a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/503/ep_503_02.gif&amp;img_name=Stan on stage" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/503/ep_503_02.gif&amp;img_name=Stan on stage">Stan</a> together
in <a href="http://www.campbellassociates.ca/rack/2000_11.htm">November of 2000</a>.
Hard to believe it has been essentially running unmodified for over six years. But
that also means those <a href="http://www.fujitsu.com/global/support/computing/storage/hdd/eol/dhdd/mpf3xxat-catalog.html">hard
drives</a> have over 50,000 hours on them, which makes them ticking time bombs. And
that's what the <a href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology">SMART
reporting</a> is saying too.
</p>
        <p>
          <a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/308/308_stan.gif&amp;img_name=Stan's pissed" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/308/308_stan.gif&amp;img_name=Stan's pissed">Stan</a> is
just too old to upgrade, he needs to be replaced.
</p>
        <p>
His replacement is <a href="http://www.southparkstudios.com/show/display_char.php?id=98">Jimmy</a>,
a machine I already had in the rack that was a testbed for betas of <a href="http://www.microsoft.com/sql/default.mspx">SQL
Server 2005</a>. <a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/606/606_image_25.jpg&amp;img_name=Jimmy auditions" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/606/606_image_25.jpg&amp;img_name=Jimmy auditions">Jimmy</a> is
a P4 3Ghz with 2GB of RAM, running <a href="http://www.microsoft.com/windowsserver2003/default.mspx">Windows
Server 2003 R2 SP2</a>. Takes some time to get used to the <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/7b037954-441d-4037-a111-94df7880c319.mspx?mfr=true">little
differences between IIS5 and IIS6</a>, but its all bareable.
</p>
        <p>
Migrating a web server is a pain in the butt. Lots of little configuration details
you have to get right. To do the testing, I copied a backup of Stan's web sites onto
Jimmy. However, since there are multiple sites on the web server, I depend on host
header identification to sort out what site is what, which means I need to use the
correct names of the web sites to access them. So what's a boy to do? I want to leave
the sites up and running on the old server while I mess around with the new one.
</p>
        <p>
I could have faked out a DNS server, but that seemed like a lot of work. Instead I
modified the <a href="http://en.wikipedia.org/wiki/Hosts_file">HOSTS</a> file on my
main workstation so that the web sites on Jimmy were pointed to directly. Funny how
old technology serves the purpose so well.
</p>
        <p>
Since HOSTS takes priority over any DNS lookup, I was able to point sites (like <a href="http://www.campbellassociates.ca">www.campbellassociates.ca</a>)
to the IP address of Jimmy directly. Then I could tweak and test to my heart's content.
</p>
        <p>
One whammy I ran into was with <a href="http://msdn2.microsoft.com/en-us/office/aa905431.aspx">FrontPage
Server Extensions</a>. For the most part my web server runs the little web sites of
friends and family, and they all use FrontPage, <a href="http://office.microsoft.com/en-us/frontpage/default.aspx">whether
Microsoft wants them to or not</a>. While it set up the extensions easily enough,
I couldn't administer the sites to set up access for the authoring accounts - no matter
what account information I entered, it failed.
</p>
        <p>
Turned out it wasn't me, it was a feature of <a href="http://www.microsoft.com/technet/downloads/winsrvr/servicepacks/sp1/default.mspx">Windows
Server 2003 Service Pack 1</a>. The service pack added a loopback check, making sure
that the local computer name always matches the host header. And since I'm using multiple
host headers, that's just not going to work. The fix is in <a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;896861">Knowledge
Base Article 896861</a>. You have two choices: turn off loopback checking, or enter
all the domain names that are legal for loopback checking.
</p>
        <p>
I turned it off. Call me lazy.
</p>
        <p>
Upgraded <a href="http://www.dasblog.info/">dasBlog</a> as well. What I was really
after was <a href="http://akismet.com/">Akismet</a>, the comment spam filtering solution.
Unfortunately, the shipping edition of dasBlog doesn't have direct support for it.
But the <a href="http://www.dasblog.info/DailyBuilds.aspx">daily builds</a> have it.
I'm not normally a guy who runs a daily build, but for Akismet, its worth it. Take
that, comment spammers!
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=e3a3dff9-d134-43b7-b366-1a4433dfc824" />
      </body>
      <title>Migrating web servers, upgrading dasBlog...</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,e3a3dff9-d134-43b7-b366-1a4433dfc824.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,e3a3dff9-d134-43b7-b366-1a4433dfc824.aspx</link>
      <pubDate>Mon, 21 May 2007 06:05:15 GMT</pubDate>
      <description>&lt;p&gt;
Decided not to work on Sunday for a change.
&lt;/p&gt;
&lt;p&gt;
Instead, I upgraded servers! Ah, such a geek.
&lt;/p&gt;
&lt;p&gt;
My old web server &lt;a href="http://www.southparkstudios.com/show/display_char.php?id=3"&gt;Stan&lt;/a&gt; is
very very old... P3 1Ghz with 512MB of RAM. Running &lt;a href="http://www.microsoft.com/windows2000/default.mspx"&gt;Windows
2000&lt;/a&gt;, it has been a workhorse of a machine. I put &lt;a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/503/ep_503_02.gif&amp;amp;img_name=Stan on stage" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/503/ep_503_02.gif&amp;amp;img_name=Stan on stage"&gt;Stan&lt;/a&gt; together
in &lt;a href="http://www.campbellassociates.ca/rack/2000_11.htm"&gt;November of 2000&lt;/a&gt;.
Hard to believe it has been essentially running unmodified for over six years. But
that also means those &lt;a href="http://www.fujitsu.com/global/support/computing/storage/hdd/eol/dhdd/mpf3xxat-catalog.html"&gt;hard
drives&lt;/a&gt; have over 50,000 hours on them, which makes them ticking time bombs. And
that's what the &lt;a href="http://en.wikipedia.org/wiki/Self-Monitoring,_Analysis,_and_Reporting_Technology"&gt;SMART
reporting&lt;/a&gt; is saying too.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/308/308_stan.gif&amp;amp;img_name=Stan's pissed" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/308/308_stan.gif&amp;amp;img_name=Stan's pissed"&gt;Stan&lt;/a&gt; is
just too old to upgrade, he needs to be replaced.
&lt;/p&gt;
&lt;p&gt;
His&amp;nbsp;replacement is &lt;a href="http://www.southparkstudios.com/show/display_char.php?id=98"&gt;Jimmy&lt;/a&gt;,
a machine I already had in the rack that was a testbed for betas of &lt;a href="http://www.microsoft.com/sql/default.mspx"&gt;SQL
Server 2005&lt;/a&gt;. &lt;a href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/606/606_image_25.jpg&amp;amp;img_name=Jimmy auditions" temp_href="http://www.southparkstudios.com/downloads/display_image.php?img=http://images.southparkstudios.com/media/images/606/606_image_25.jpg&amp;amp;img_name=Jimmy auditions"&gt;Jimmy&lt;/a&gt; is
a P4 3Ghz with 2GB of RAM, running &lt;a href="http://www.microsoft.com/windowsserver2003/default.mspx"&gt;Windows
Server 2003 R2 SP2&lt;/a&gt;. Takes some time to get used to the &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/7b037954-441d-4037-a111-94df7880c319.mspx?mfr=true"&gt;little
differences between IIS5 and IIS6&lt;/a&gt;, but its all bareable.
&lt;/p&gt;
&lt;p&gt;
Migrating a web server is a pain in the butt. Lots of little configuration details
you have to get right. To do the testing, I copied a backup of Stan's web sites onto
Jimmy. However, since there are multiple sites on the web server, I depend on host
header identification to sort out what site is what, which means I need to use the
correct names of the web sites to access them. So what's a boy to do? I want to leave
the sites up and running on the old server while I mess around with the new one.
&lt;/p&gt;
&lt;p&gt;
I could have faked out a DNS server, but that seemed like a lot of work. Instead I
modified the &lt;a href="http://en.wikipedia.org/wiki/Hosts_file"&gt;HOSTS&lt;/a&gt; file on my
main workstation so that the web sites on Jimmy were pointed to directly. Funny how
old technology serves the purpose so well.
&lt;/p&gt;
&lt;p&gt;
Since HOSTS takes priority over any DNS lookup, I was able to point sites (like &lt;a href="http://www.campbellassociates.ca"&gt;www.campbellassociates.ca&lt;/a&gt;)
to the IP address of Jimmy directly. Then I could tweak and test to my heart's content.
&lt;/p&gt;
&lt;p&gt;
One whammy I ran into was with &lt;a href="http://msdn2.microsoft.com/en-us/office/aa905431.aspx"&gt;FrontPage
Server Extensions&lt;/a&gt;. For the most part my web server runs the little web sites of
friends and family, and they all use FrontPage, &lt;a href="http://office.microsoft.com/en-us/frontpage/default.aspx"&gt;whether
Microsoft wants them to or not&lt;/a&gt;. While it set up the extensions easily enough,
I couldn't administer the sites to set up access for the authoring accounts - no matter
what account information I entered, it failed.
&lt;/p&gt;
&lt;p&gt;
Turned out it wasn't me, it was a feature of &lt;a href="http://www.microsoft.com/technet/downloads/winsrvr/servicepacks/sp1/default.mspx"&gt;Windows
Server 2003 Service Pack 1&lt;/a&gt;. The service pack added a loopback check, making sure
that the local computer name always matches the host header. And since I'm using multiple
host headers, that's just not going to work. The fix is in &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;896861"&gt;Knowledge
Base Article 896861&lt;/a&gt;. You have two choices: turn off loopback checking, or enter
all the domain names that are legal for loopback checking.
&lt;/p&gt;
&lt;p&gt;
I turned it off. Call me lazy.
&lt;/p&gt;
&lt;p&gt;
Upgraded &lt;a href="http://www.dasblog.info/"&gt;dasBlog&lt;/a&gt; as well. What I was really
after was &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt;, the comment spam filtering solution.
Unfortunately, the shipping edition of dasBlog doesn't have direct support for it.
But the &lt;a href="http://www.dasblog.info/DailyBuilds.aspx"&gt;daily builds&lt;/a&gt; have it.
I'm not normally a guy who runs a daily build, but for Akismet, its worth it. Take
that, comment spammers!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=e3a3dff9-d134-43b7-b366-1a4433dfc824" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,e3a3dff9-d134-43b7-b366-1a4433dfc824.aspx</comments>
      <category>ASP.NET</category>
      <category>dasBlog</category>
      <category>Rackmounting</category>
      <category>Spam</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=1458f2e8-afc8-4152-bcb3-df576f63a16e</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1458f2e8-afc8-4152-bcb3-df576f63a16e</wfw:commentRss>
      <title>Failing From Your Own Success</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx</link>
      <pubDate>Fri, 11 May 2007 17:25:52 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;While I’m on the subject of load testing, this
is the horror story I hear over and over again from developers: The site is ready,
it looks great, the client loves it. But you’ve focused all your energy on features
and on getting the thing out the door, and almost no energy thinking about how it’s
actually going to run under load. So almost invariably, it’s not until ship date,
when your investor or whoever’s paying for the site sends the link to everybody he
knows, and says “Look guys, I’ve succeeded!” that the site finally runs under load.
And it’s a disaster. It’s like one developer I know who built and tested a site completely
internally, and it wasn’t until the day it went live that he realized that the average
page size was 1.5MB. Or that no one actually tested the transactional integrity of
the web pages with the database, and the first time two people try to enter data at
the same time, bad things happen. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;So this is an important question to ponder: What
does it look like when your site fails under load? It’s not like there’s an explosion,
or a sign that pops up out of the server that says “Help!” Failure doesn’t look like
anything in particular. It’s an inelegant thing, and it’s an inconsistent thing. You
see all kinds of bizarre messaging, usually for stuff that’s unrepeatable. You get
errors in code that doesn’t actually have errors (no wonder you can’t reproduce them!).
It’s just that the environment you’re living in under load is so different. People
can waste a lot of time pursuing those errors. You can make yourself completely crazy
chasing down these phantom “bugs,” not recognizing that they’re just symptoms of an
overloaded web server. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Of course, even a great load tester can’t &lt;i style="mso-bidi-font-style: normal"&gt;really&lt;/i&gt; show
you what failure looks like. You get a report showing how long it took a page to render,
but what does that actually look like? What pieces came up and what didn’t? What did
the error message look like? Those kinds of things are very tough for a load tester
to capture.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;font color=#000000&gt;&lt;span lang=EN-US&gt;That’s why Sean Wilson, our QA manager at Strangeloop,
recommends that even when you’re running a load test, you actually go in and use the
site yourself during the test. You may be the only “real” person on the site, but
you’re experiencing it as if there’s another 10,000 people using it. It’s worthwhile
to capture that human viewpoint. The impact of a 120-second response time is nowhere
near as significant when your Spirent Avalanche reports it as it is when you’re actually
sitting there watching the thing freeze for two minutes and the only thing on the
page is a partially drawn banner. Or worse yet, a partially rendered form that a user
may &lt;i style="mso-bidi-font-style: normal"&gt;think&lt;/i&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: EN-CA"&gt; they
can start working with, only to find a minute or so later that it goes nuts.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Which brings me to the next point to ponder:
Fail gracefully. As developers, we tend to think that the correct answer is always,
“No bugs, we’ll just fix everything.” But the reality is that you’ll never do it.
It will never, ever completely go away. So put the cycles into dealing with failure
well. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;The basic definition of a graceful failure is
a failure where everybody knows what happened. Or at least, you’ve controlled the
message explaining what happened. Take the default IIS “Server Too Busy” message.
It’s not a pretty message, but it gets the job done. It conveys the information. It’s
not some weird ASP.NET error that just makes your customer angry at your incompetence,
and sends you off trying to debug something that can’t be debugged. The customer may
still be annoyed that you weren’t adequately prepared for your bandwidth demands,
but at least they know what happened. And you can go from there.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Obviously, you want to provide some more content
than the default messages generated from IIS or from ASP.NET. At least a better apology.
Give the customer a sense that this shouldn’t have happened, we’re sorry about it,
we have a record of it happening, and we’ll deal with it. Ideally, you don’t want
to need any message because everything’s handled. But that’s an ideal, and should
be treated as such. You have to have something in between.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Of course, nobody likes thinking about failure,
but this isn’t about failure. It’s about success. These failures under load are the
kinds of things that happen to successful sites. With the Web in resurgence again,
with ASP.NET becoming more and more popular, and with sites getting bigger and bigger,
the load is only going up from here. You should be planning on being successful, and
that means thinking about these things. If you haven’t thought about them, they’re
going to think about you. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#000000&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=1458f2e8-afc8-4152-bcb3-df576f63a16e" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,1458f2e8-afc8-4152-bcb3-df576f63a16e.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Strangeloop</category>
      <category>Testing</category>
    </item>
    <item>
      <trackback:ping>http://www.campbellassociates.ca/blog/Trackback.aspx?guid=1097b5f2-c5e1-4cbe-b7c1-59b473c50076</trackback:ping>
      <pingback:server>http://www.campbellassociates.ca/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.campbellassociates.ca/blog/PermaLink,guid,1097b5f2-c5e1-4cbe-b7c1-59b473c50076.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.campbellassociates.ca/blog/CommentView,guid,1097b5f2-c5e1-4cbe-b7c1-59b473c50076.aspx</wfw:comment>
      <wfw:commentRss>http://www.campbellassociates.ca/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1097b5f2-c5e1-4cbe-b7c1-59b473c50076</wfw:commentRss>
      <title>Peeking Over the Fence into the Networking Guys' Backyard Reveals a Brilliant Load Testing Solution</title>
      <guid isPermaLink="false">http://www.campbellassociates.ca/blog/PermaLink,guid,1097b5f2-c5e1-4cbe-b7c1-59b473c50076.aspx</guid>
      <link>http://www.campbellassociates.ca/blog/PermaLink,guid,1097b5f2-c5e1-4cbe-b7c1-59b473c50076.aspx</link>
      <pubDate>Sat, 05 May 2007 00:40:47 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;We’ve been going through beta testing at &lt;a href="http://www.strangeloopnetworks.com/"&gt;Strangeloop&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;,
which means I’ve had the chance to do some serious scaling of ASP.NET. One of the
interesting experiences that keeps coming up in this process is the reaction we get
from customers when we’re helping them do load testing. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;One of the things we can offer our early beta
test customers is the opportunity to load test their site, with and without Mobius
in the loop. We need the test data anyway, and quite a few candidates don’t really
have much in the way of load testing resources ready to go. And then we test their
site in our lab with our &lt;a href="http://www.spirent.com/analysis/technology.cfm?media=7&amp;amp;WS=325&amp;amp;SS=109&amp;amp;wt=2"&gt;Spirent
Avalanche&lt;/a&gt;, and they go “Wow! I need one of those!”&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;So what’s a &lt;a href="http://www.spirent.com/analysis/technology.cfm?media=7&amp;amp;WS=325&amp;amp;SS=109&amp;amp;wt=2"&gt;Spirent
Avalanche&lt;/a&gt;, you ask? Funny you should ask… It’s 3Us of load testing love.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Josh Bixby, our VP of product development, noticed
it when he was at trade shows. One of the benefits of having our feet in both the
development camp and the networking camp is that we naturally see things on the network
side that a lot of developers don’t. Josh pointed out that virtually every company
making networking appliances had one of these 3U boxes in their demo racks. But I’d
never heard of it before. So we checked it out, and realized it was the best answer
I’ve ever seen to doing load testing. I know that load testing isn’t something people
want to think about unless they HAVE to think about it. But if you do have to think
about it, you have to check this out. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;I don’t need to emphasize how much of a pain
load testing is. Typically, you have two options, both of which suck: If you’re doing
it yourself, you may be spending literally a week setting up a load test farm, and
you’re probably spending more energy making the configuration work than actually doing
the test. Which is no surprise, since most likely you’re using any piece of junk you
can find, trying to network together a bunch of machines with different NICs, different
performance, different speeds, etc., before you even begin to configure the test.
I had one customer that bought me ten identical, dedicated servers for load testing
- for about the same cost as an Avalanche - but that’s the exception, not the rule.
And it still gives you much less control, you have to do all your own analytics, etc.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;It’s easy to think “Oh, I’ll just use &lt;a href="http://www.mercury.com/us/"&gt;Mercury
Interactive&lt;/a&gt; (sorry, &lt;a href="http://h71028.www7.hp.com/enterprise/cache/447066-0-0-0-121.html?rd=mercury"&gt;HP
Mercury&lt;/a&gt;) to do my load testing.” Easy until you see the price. Paying six digits
for load testing with a 20% annual maintenance contract isn’t so easy. And that’s
just for software – you still supply the hardware. I don’t think anyone told Mercury
that the Dot Com Boom was over. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;So taking a page from the network guys, there’s
a third way to do load testing: You get a Spirent Avalanche, hook it up, and let it
do the job. One 3U box with four gigabit Ethernet ports that can generate nearly two
million users by itself. So you’ve got the hardware and the software all in one box.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Of course, the Avalanche isn’t cheap either,
although they’ve nailed the gradually pregnant business model well – you can rent
the gear, and those rental charges get applied to a purchase. We spent less than $100,000
on our 2700 with all the features we needed to do web testing. It also uses TCL-based
scripting, which is usually the realm of networking guys, not developers, and can
be difficult to understand. TCL provides the Avalanche with the flexibility to do
load testing on a lot more than just web stuff.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;However, bundled with the Avalanche is a product
called &lt;a href="http://www.sstinc.com/webpro_spirent.html"&gt;TracePlus/Web Detective
(Spirent Edition)&lt;/a&gt;, made by &lt;a href="http://www.sstinc.com/"&gt;System Software Technology
(SST)&lt;/a&gt;. SST makes a variety of different TracePlus products for networking and
web, including this version specifically for working with the Avalanche. TracePlus
provides the classic capture mechanisms that you see with most load generating tools,
where the tool captures your navigation of the web pages and captures them as HTTP
commands. The Avalanche internally converts this to its TCL commands.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;The Avalanche has some ability to do reporting
internally (pretty graphs), but the main way we’re using it is in “Excel mode”, where
it generates CSV files that we can load into spreadsheets for analysis.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;We’re also finding that the Avalanche doesn’t
understand ASP.NET things like viewstate very well, but then, neither does &lt;a href="http://www.microsoft.com/technet/archive/itsolutions/intranet/downloads/webstres.mspx?mfr=true"&gt;WAST&lt;/a&gt;.
We’re using &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718823.aspx"&gt;Visual
Studio 2005 Team Edition for Testers&lt;/a&gt; to get really smart functional testing around
specific ASP.NET features.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Even with these complications, it’s such a better
way to do load testing than setting up servers, and infinitely better than letting
your paying customers do the testing. So if you’re doing load testing, why aren’t
you using one of these? Why don’t more people know about this? This is pretty standard
equipment if you build networking gear. It’s not like the Avalanche is some new, earth-shattering
product. It’s not even mentioned on the main page of Spirent’s Web site?!?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;I have yet to find anyone else in the ASP.NET
world using a Spirent Avalanche. I really think it’s just a cultural issue, where
great stuff is getting lost in translation between the networking world and the Web
development world. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;&lt;font color=#000000&gt;Important lesson: If you’re not paying attention
to the networking space, you should be. You may just be wasting your time wrestling
with a problem that other smart people have already solved. That’s one of the cool
things about working with Strangeloop; we really get to straddle the line between
those two worlds. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;
&lt;font face="Times New Roman" color=#000000&gt;&amp;nbsp;&lt;/font&gt;
&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.campbellassociates.ca/blog/aggbug.ashx?id=1097b5f2-c5e1-4cbe-b7c1-59b473c50076" /&gt;</description>
      <comments>http://www.campbellassociates.ca/blog/CommentView,guid,1097b5f2-c5e1-4cbe-b7c1-59b473c50076.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Network Gear</category>
      <category>Strangeloop</category>
      <category>Testing</category>
    </item>
  </channel>
</rss>