<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEEDQ38_fip7ImA9WhRUFkU.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093</id><updated>2012-01-27T08:44:32.146-08:00</updated><category term="PerfViz" /><category term="GPU" /><category term="instrumentation" /><category term="Risk Management" /><category term="China" /><category term="CMG" /><category term="Amazon" /><category term="Newton" /><category term="storage" /><category term="Cisco" /><category term="game theory" /><category term="Windows" /><category term="Apple" /><category term="WebLogic" /><category term="instantons" /><category term="mapreduce" /><category term="mainframe" /><category term="big data" /><category term="Mathematica" /><category term="BitTorrent" /><category term="Galileo" /><category term="Stephen Hawking" /><category term="Larkspur Landing" /><category term="SPEC" /><category term="TPC" /><category term="web 2.0" /><category term="spam" /><category term="classes" /><category term="Solaris" /><category term="nanotechnology" /><category term="performance" /><category term="Ignite" /><category term="Monte Carlo" /><category term="Knuth" /><category term="training" /><category term="load test" /><category term="IBM" /><category term="simulation" /><category term="business" /><category term="Cobham's Theorem" /><category term="scalability" /><category term="Moore's law" /><category term="Starbucks" /><category term="Sun Microsystems" /><category term="FOSS" /><category term="CAPTCHA" /><category term="Gmail" /><category term="MeasureIT" /><category term="Guerrilla capacity planning" /><category term="Perl" /><category term="chemistry" /><category term="Velocity Conference" /><category term="Best Practices" /><category term="Brooks' law" /><category term="datacenter" /><category term="performance models" /><category term="iPhone" /><category term="load average" /><category term="bandwidth" /><category term="queueing theory" /><category term="VMware" /><category term="Conficker" /><category term="Hotsos" /><category term="optimization" /><category term="Little's law" /><category term="Steve Ballmer" /><category term="statistics" /><category term="LoadRunner" /><category term="Intel" /><category term="Apdex" /><category term="CMOS" /><category term="ORACLE" /><category term="barycentric coordinates" /><category term="Twitter" /><category term="stretch factor" /><category term="Microsoft" /><category term="GDAT" /><category term="SPARC" /><category term="Kepler" /><category term="benchmark" /><category term="response time" /><category term="MacOS X" /><category term="latency" /><category term="TeamQuest" /><category term="metastability" /><category term="Xerox PARC" /><category term="browsers" /><category term="Steve Jobs" /><category term="python" /><category term="Hadoop" /><category term="batteries" /><category term="multiprocessor" /><category term="Zipf's law" /><category term="parallel" /><category term="AMD" /><category term="A.A. Michelson" /><category term="physics" /><category term="Virtualization" /><category term="melbourne" /><category term="Crypto" /><category term="steady state" /><category term="schedulers" /><category term="capacity planning" /><category term="operating systems" /><category term="PDQ" /><category term="cloud computing" /><category term="supercomputer" /><category term="Green" /><category term="Dirac" /><category term="multicore" /><category term="Java" /><category term="GCaP" /><category term="Google" /><category term="Amdahl's law" /><category term="databases" /><category term="Guerrilla Manual" /><category term="Einstein" /><category term="Ruby" /><category term="GBoot" /><category term="penryn" /><category term="performance management" /><category term="Linux" /><category term="Higgs boson" /><category term="netbook" /><category term="GRIDs" /><category term="USL" /><category term="Wall Street" /><category term="quantum information" /><category term="black swans" /><category term="R" /><category term="Erlang" /><title>Taking the Pith Out of Performance</title><subtitle type="html">Guerrilla geek-speak about local Silicon Valley machinations and other InfoTech goings on, as well as insights into computer performance analysis and capacity management based on books, group discussions, tech training and tool dev at &lt;a href="http://www.perfdynamics.com/"&gt;Performance Dynamics Company&lt;/a&gt;.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://perfdynamics.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>314</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TakingThePithOutOfPerformance" /><feedburner:info uri="takingthepithoutofperformance" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUYNRn09fyp7ImA9WhRUE0k.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3108549188249919774</id><published>2012-01-22T11:58:00.000-08:00</published><updated>2012-01-23T11:33:17.367-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-23T11:33:17.367-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Little's law" /><category scheme="http://www.blogger.com/atom/ns#" term="load test" /><category scheme="http://www.blogger.com/atom/ns#" term="SPEC" /><category scheme="http://www.blogger.com/atom/ns#" term="benchmark" /><title>Throughput-Delay Curves</title><content type="html">My colleague Bob Lane at Yahoo.com asked me if I'd ever seen curves like this:
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-KNTcrzfpqf8/TxxYQM_0w8I/AAAAAAAAA7A/pZygQLZ2LeM/s1600/sunaus-xr.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="228" width="320" src="http://3.bp.blogspot.com/-KNTcrzfpqf8/TxxYQM_0w8I/AAAAAAAAA7A/pZygQLZ2LeM/s320/sunaus-xr.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Not only is the answer, yes (it's a throughput-delay plot or XR plot in my notation), but that particular plot comes from my &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;GCaP course&lt;/a&gt; notes. There, I use it to analyze the comparative performance of a &lt;i&gt;functional&lt;/i&gt; multiprocessor (NS6000) and a &lt;i&gt;symmetric&lt;/i&gt; multiprocessor (SC2000). Note how the two curves cross at around 1500 OPS. You can ask yourself why and if you can't come up with an explanation, you should be registering for a &lt;a href="http://www.perfdynamics.com/rego.html"&gt;Guerrilla class&lt;/a&gt;. :)
&lt;blockquote&gt;&lt;em&gt;
The above XR plot also serves as a useful reminder that the &lt;a href="http://perfdynamics.blogspot.com/2010/03/bandwidth-vs-latency-world-is-curved.html"&gt;throughput and response-time metrics&lt;/a&gt; are not only &lt;b&gt;dependent&lt;/b&gt; on one another, but they are generally dependent in a &lt;b&gt;nonlinear&lt;/b&gt; way&amp;mdash;despite what some experts may claim:&lt;/em&gt;
&lt;p&gt;
&lt;tt&gt;From xxxx@cisco.com &lt;br /&gt;
Mon, 16 Sep 2002 08:04:04 +1000&lt;br /&gt;
...in reality, Latency &amp; Throughput are two completely different metrics associated with performance. Latency isn't related to Throughput and vice-versa. ...&lt;/tt&gt;
&lt;/blockquote&gt;

What is truly alarming, however, is that I am unable to find this example in any of &lt;a href="http://www.perfdynamics.com/books.html"&gt;my books&lt;/a&gt;; after a quick and non-exhaustive search. I would have expected it was discussed in &lt;a href="http://www.perfdynamics.com/iBook/ppa.html"&gt;The Practical Performance Analyst&lt;/a&gt; (since the example is of that vintage), but I don't see it. If you happen to spot it or know which book chapter it is in, please &lt;a href="http://www.perfdynamics.com/contact.html"&gt;let me know&lt;/a&gt;.
&lt;P&gt;
Since the throughput-delay product is merely a statement of &lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.18"&gt;Little's law&lt;/a&gt;, &lt;b&gt;N = X*R&lt;/b&gt;, you can use it to trivially calculate the &lt;i&gt;number of thingies&lt;/i&gt; (N) at any point on the XR plot. Then, you can plot say, throughput as a function of N, i.e., X&amp;nbsp;=&amp;nbsp;X(N), which you weren't given in the original visual representation. For the above example, N is the number of &lt;i&gt;client generators&lt;/i&gt; impressing load on the test rig:
&lt;P&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-a1srPvTmD5c/Txxd5KGtB3I/AAAAAAAAA7M/sUERxdClQ2k/s1600/sunaus-x.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="192" width="320" src="http://4.bp.blogspot.com/-a1srPvTmD5c/Txxd5KGtB3I/AAAAAAAAA7M/sUERxdClQ2k/s320/sunaus-x.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;P&gt;
Now you can see clearly that the SC2000 throughput has reached a saturation value of about 2500 OPS by 100 generators. So, there would be no virtue in driving the NFS system with more load generators (even if there is NIC bandwidth available) because the response time will be begin to climb embarrassingly. 
&lt;P&gt;
Although the above example is dated in terms of the technology, it is &lt;b&gt;timeless in terms of its instruction&lt;/b&gt;. With that in mind, you can review more modern XR plots on the &lt;a href="http://www.spec.org/"&gt;SPEC.org website&lt;/a&gt; where the current NFS benchmark is called &lt;a href="http://www.spec.org/sfs2008/results/res2011q4/"&gt;SFS2008&lt;/a&gt;. Here are some SPEC throughput-delay plots from 2011:
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-cHMuk4LdEXc/Txxpa9dJKEI/AAAAAAAAA7Y/S3A1IrM_f0Q/s1600/spec-sfs-all.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="252" width="400" src="http://3.bp.blogspot.com/-cHMuk4LdEXc/Txxpa9dJKEI/AAAAAAAAA7Y/S3A1IrM_f0Q/s400/spec-sfs-all.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
&lt;a href="http://www.speedguide.net/articles/the-tcp-window-latency-and-the-bandwidth-delay-2678"&gt;Packet pushers&lt;/a&gt; also regard the &lt;a href="http://en.wikipedia.org/wiki/Bandwidth-delay_product"&gt;bandwidth-delay product&lt;/a&gt; as very important because it:
&lt;blockquote&gt;&lt;em&gt;
&lt;ul&gt;
&lt;li&gt; "determines the amount of data that can be in transit in the network"
&lt;li&gt; [is a] "very important concept in a window-based protocol such as TCP, as throughput is bound by" [it]
&lt;li&gt; can be conveniently &lt;a href="http://www.speedguide.net/bdp.php"&gt;calculated&lt;/a&gt; for TCP packets
&lt;/ul&gt;
&lt;/em&gt;&lt;/blockquote&gt;
&lt;b&gt;Cautionary note:&lt;/b&gt; Be careful to distinguish between the (band)width of the network pipe, i.e., X&lt;sub&gt;max&lt;/sub&gt;, vs. the number of packets per second, i.e., X, being pushed through that pipe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3108549188249919774?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pEfU7vONYiAMKWRx7GKhsJvA8LU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pEfU7vONYiAMKWRx7GKhsJvA8LU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pEfU7vONYiAMKWRx7GKhsJvA8LU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pEfU7vONYiAMKWRx7GKhsJvA8LU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/vFoI0u56KQ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3108549188249919774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3108549188249919774" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3108549188249919774?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3108549188249919774?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/vFoI0u56KQ0/throughput-delay-curves.html" title="Throughput-Delay Curves" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KNTcrzfpqf8/TxxYQM_0w8I/AAAAAAAAA7A/pZygQLZ2LeM/s72-c/sunaus-xr.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2012/01/throughput-delay-curves.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4FQn87fSp7ImA9WhRVEk8.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-5245425807846559497</id><published>2012-01-01T00:13:00.000-08:00</published><updated>2012-01-10T12:21:53.105-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T12:21:53.105-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Perl" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="queueing theory" /><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="quantum information" /><category scheme="http://www.blogger.com/atom/ns#" term="USL" /><category scheme="http://www.blogger.com/atom/ns#" term="storage" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="Erlang" /><title>My Year in Review 2011</title><content type="html">Some days I wonder if I ever actually accomplish anything anymore. Maybe it's time to just pack it in and become a greeter at &lt;a href="http://www.walmart.com/"&gt;Walmart&lt;/a&gt;. I know a bit about how queues work, so that should put me a few notches ahead of the competition. And I would expect the competition to be fierce because it's a pretty cushy job; but &lt;a href="http://www.usatoday.com/money/industries/retail/story/2011-12-25/walmart-greeter-punched/52224460/1"&gt;not every day&lt;/a&gt;, apparently.
&lt;p&gt;
&lt;center&gt;
&lt;img border="0" height="281" width="400" src="http://2.bp.blogspot.com/-9QOFOYfCCrI/Tv_b0Q6D_wI/AAAAAAAAA54/Xz_ih7D54y0/s400/Wal%2BMart%2Bgreeter.jpg" /&gt;
&lt;/center&gt;

Before taking the big leap, I decided it might be a good idea to note down some of the technical projects I've worked on this year (over and above the daily grind):
&lt;ol&gt;
&lt;li&gt; Finished editing the manuscript for the &lt;b&gt;2nd edition&lt;/b&gt; of the &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;Perl::PDQ&lt;/a&gt; book, which was published in August.

&lt;li&gt; Finalized the &lt;b&gt;invited chapter&lt;/b&gt; &lt;i&gt;A Methodology for Optimizing Multithreaded System Scalability on Multicores&lt;/i&gt; (co-authored with Shanti Subramanyam and Stefan Parvu) for the edited volume: &lt;a href="http://www.amazon.co.uk/Programming-Multi-Core-Many-Core-Computing-Distributed/dp/0470936908"&gt;Programming Multi-core and Many-core Computing Systems&lt;/a&gt; (Wiley-Blackwell).

&lt;li&gt; &lt;b&gt;Sommerfeld-Dirac Paradox:&lt;/b&gt; In 1916, Arnold Sommerfeld calculated the relativistic corrections to the Bohr atom and found that the associated &lt;a href="http://www.perfdynamics.com/Test/rosi.gif"&gt;perihelion precession&lt;/a&gt; produced the known fine structure of the hydrogen spectrum. Remarkably, this is the same result as discovered by Dirac more than a decade later in 1928. The paradox is that the Sommerfeld model does not involve electron (fermionic) spin, whereas spin is intimately involved with the Dirac solution. I originally heard about this paradox from my Masters thesis advisor, &lt;a href="http://en.wikipedia.org/wiki/Christie_Jayaratnam_Eliezer"&gt;Prof. Christie Eliezer&lt;/a&gt;, who had been one of &lt;a href="http://www.neilgunther.com/Dirac/dirac.html"&gt;Dirac's research students&lt;/a&gt;. Recently, it has been suggested that the paradox arises from a fortuitous ambiguity in the way certain of the quantum numbers are defined. If this is so, I believe there ought to be a topological proof. I've got the &lt;a href="http://www.perfdynamics.com/Test/specani.gif"&gt;Lie group algebras&lt;/a&gt; down, but it's still a work in progress.

&lt;li&gt; My ongoing effort to provide a simple &lt;a href="http://perfdynamics.blogspot.com/2008/01/erlang-explained.html"&gt;pictorial derivation&lt;/a&gt; of the &lt;b&gt;Erlang M/M/m queue&lt;/b&gt; has been simplified even further.
In case there's any doubt, here's the proof on my whiteboard dated April 13, 2011. :)
&lt;p&gt;
&lt;center&gt;
&lt;!-- &lt;a href="http://4.bp.blogspot.com/-liSgANPP2nQ/TwAJmnwnCpI/AAAAAAAAA6E/CseCvNrzyRI/s1600/IMG_0714.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt; --&gt;
&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-liSgANPP2nQ/TwAJmnwnCpI/AAAAAAAAA6E/CseCvNrzyRI/s400/IMG_0714.JPG" /&gt;
&lt;!-- &lt;/a&gt; --&gt;
&lt;/center&gt;
I still need to write this up coherently.

&lt;li&gt; Steve Jenkin asked me why the electrical power consumed by a magnetic disk increases as the &lt;a href="http://stevej-on-it.blogspot.com/2011/11/surprises-reading-up-on-raid-and-disk.html"&gt;fifth power&lt;/a&gt; of the platter radius. I didn't know it did! So, I decided to see if I could derive the physics from first principles. &lt;a href="http://www.blogger.com/comment.g?blogID=29583699&amp;postID=6860628401661342097"&gt;I was able to do so&lt;/a&gt;, but I've yet to find the time to blog about the details. The main point is that the consumed electrical power (Watts) grows as the &lt;b&gt;5th power&lt;/b&gt; of the disk diameter and the &lt;b&gt;3rd power&lt;/b&gt; of the angular speed (RPM). Since these are very fast functions, this relationship is an important result for green datacenter design.

&lt;li&gt; Together with my colleagues at HP Labs, I've been working on a mathematical model of &lt;a href="http://www.magcloud.com/browse/Issue/2344"&gt;color naming&lt;/a&gt;. If you find yourself having trouble even parsing that sentence, now you know how I felt when I was introduced to this subject. &lt;a href="http://www.bbc.co.uk/iplayer/episode/p00fvlfk/Science_In_Action_07_04_2011/"&gt;Neuroscientists speculate&lt;/a&gt; that the left side of the brain, which deals with language, is also involved in &lt;b&gt;processing colors&lt;/b&gt; in the right visual field. More colorful background information can be found on the &lt;a href="http://blog.xkcd.com/2010/05/03/color-survey-results/"&gt;XKCD blog&lt;/a&gt;. This is also a work in progress and I can't say more about our results until they are finally published. I can report, however, that quite unexpectedly, it's turned out to be one of the most exiting pieces of science that I've worked on in a long time.

&lt;li&gt; In response to having been challenged both &lt;a href="http://www.xaprb.com/blog/2011/10/06/when-systems-scale-better-than-linearly/"&gt;publicly&lt;/a&gt; (without any supporting data) and privately (with supporting data that I can't reveal publicly) over the need to model so-called &lt;a href="http://en.wikipedia.org/wiki/Speedup"&gt;superlinear scaling&lt;/a&gt;, I've developed a theorem that states such &lt;b&gt;superlinear modifications&lt;/b&gt; to the &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;Universal Scalability Law&lt;/a&gt; are unnecessary. More on this later.
 
&lt;li&gt; I believe I can construct a theorem, which says something like this: 
&lt;i&gt;The system performance of any computer system, no matter how big or distributed, can always be modeled with just a &lt;b&gt;surprisingly few queueing nodes&lt;/b&gt;.&lt;/i&gt; How can this be? If you look carefully in my &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;PPDQ book&lt;/a&gt;, you'll notice that most (if not all) of the models are relatively simple. Although I've observed this effect many times, over many years, I never put much stock in it. As of March this year, that suddenly changed. I now believe I know why it always works out that way, in general. There will, of course, be some exceptions because you can always add more detail.
This theorem also means that it will finally be possible to &lt;i&gt;automatically&lt;/i&gt; build your PDQ model directly from collected performance data. 

&lt;li&gt; Designed and road-tested the new &lt;a href="http://www.perfdynamics.com/Classes/Outlines/gdata.html"&gt;GDAT training course&lt;/a&gt;.
&lt;li&gt; Fixed "string" variables (there are no strings in C) in the PDQ library that were causing the &lt;a href="http://cran.r-project.org/bin/windows/rw-FAQ.html#The-R-Console"&gt;R Console&lt;/a&gt; to crash. Still have to export the fix to &lt;a href="http://sourceforge.net/projects/pdq-qnm-pkg/"&gt;SourceForge&lt;/a&gt;.

&lt;li&gt; Constructed &lt;b&gt;multiple optimization functions&lt;/b&gt; for an M/M/m queue to demonstrate that there is no unique way to define optimal load points (&amp;rho;*) or &lt;a href="http://deliveryimages.acm.org/10.1145/1860000/1854041/millsap-5.png"&gt;"knees"&lt;/a&gt; (a misnomer) for &lt;a href="http://www.cmg.org/measureit/issues/mit62/m_62_15.html"&gt;response time curves&lt;/a&gt;.
&lt;p&gt;
&lt;center&gt;
&lt;img border="0" height="122" width="200" src="http://3.bp.blogspot.com/-8BnSqItcnm0/TwD5jR0XF1I/AAAAAAAAA6c/JkOG9O9gD04/s200/mma-Y1Y2Y3.png" /&gt;
&lt;/center&gt;
&lt;p&gt;
For example, for any configuration of m-servers in the above table, which of the functions Y1, Y2 or Y3 represents the correct optimal load (&amp;rho;* values in each row)?

&lt;li&gt; Wrote this blog post. OK, that doesn't count but an odd-numbered list might be unlucky in an even year. :P
 
&lt;/ol&gt;
Since several of these projects are still in a rather untidy state, I probably should spend a bit more time polishing them up before sauntering down to the Walmart employment office. In the meantime, 
&lt;p&gt;
&lt;center&gt;&lt;big&gt;Happy New Year!&lt;/big&gt;&lt;/center&gt;
&lt;hr noshade size=1 width=99&gt;
&lt;hr noshade size=1 width=66&gt;
&lt;hr noshade size=1 width=33&gt;
&lt;hr noshade size=1 width=16&gt;
&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-5245425807846559497?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vAYtvOilJgZ54OuIqwF2K5LzCd0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vAYtvOilJgZ54OuIqwF2K5LzCd0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vAYtvOilJgZ54OuIqwF2K5LzCd0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vAYtvOilJgZ54OuIqwF2K5LzCd0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/jist_tdmLf0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/5245425807846559497/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=5245425807846559497" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5245425807846559497?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5245425807846559497?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/jist_tdmLf0/my-year-in-review-2011.html" title="My Year in Review 2011" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-9QOFOYfCCrI/Tv_b0Q6D_wI/AAAAAAAAA54/Xz_ih7D54y0/s72-c/Wal%2BMart%2Bgreeter.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2012/01/my-year-in-review-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMESHo6cCp7ImA9WhRUEks.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-5630774721393270372</id><published>2011-12-27T12:04:00.000-08:00</published><updated>2012-01-22T12:00:09.418-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-22T12:00:09.418-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="performance models" /><category scheme="http://www.blogger.com/atom/ns#" term="capacity planning" /><title>A List of CaP Skills</title><content type="html">This question popped up recently on Linkedin:

&lt;blockquote&gt;&lt;i&gt;"Can someone tell me what skill set should a Performance and Capacity Analyst have and develop throughout his career?"&lt;/i&gt;&lt;/blockquote&gt;

and I realized that, although I have a kind of list in my head, and I talk about such skills in my &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;classes&lt;/a&gt;, I have been too lazy to write them down anywhere; which is pretty dumb. I must try to do something about that (New Year resolution? What are the odds?). In some ways, my fallback is the online &lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html"&gt;Guerrilla Manual&lt;/a&gt;.

Anyway, here is my (slightly edited) response to the &lt;a href="http://goo.gl/PR5Eo"&gt;LI question&lt;/a&gt;, and let it therefore constitute my first attempt at writing down such a list.
&lt;blockquote&gt;
&lt;a name='more'&gt;&lt;/a&gt;
Unlike the usual set of computer-based skills needed for programming or app dev or kernel dev or being a network engineer or a sysadm, &lt;b&gt;CaP&lt;/b&gt; (&lt;b&gt;C&lt;/b&gt;apacity planning &lt;b&gt;a&lt;/b&gt;nd &lt;b&gt;P&lt;/b&gt;erformance analysis) is more like a &lt;b&gt;physical science&lt;/b&gt;, in my view.
&lt;blockquote&gt;
&lt;FONT style="BACKGROUND-COLOR: yellow"&gt;&lt;i&gt;It all starts and ends with the data.&lt;/i&gt;&lt;/FONT&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Physical sciences involve such skills as:
&lt;ol&gt;
&lt;li&gt; Collection and observation of raw data
&lt;li&gt; Controlled experiments in the lab to find clearer relationships in the data
&lt;li&gt; Use of tools to create and analyze data
&lt;li&gt; Development of models to both explain data and predict effects
&lt;li&gt; Publishing/marketing results and budgeting for experimental equipment
&lt;/ol&gt;

Scientists usually don't like to acknowledge (5). "Marketing" is a dirty word, but they do it anyway. :)
&lt;blockquote&gt;
&lt;FONT style="BACKGROUND-COLOR: yellow"&gt;&lt;i&gt;It's all marketing!&lt;/i&gt;&lt;/FONT&gt;
&lt;/blockquote&gt;
I'm also including the biological sciences here; the main difference being that bio systems can up and die on you when testing. Rebooting is not an option, and that can really ruin your data.
&lt;p&gt;
Translating the above skills list for CaP:
&lt;ol&gt;
&lt;li&gt; Collection of raw data using monitoring tools
&lt;li&gt; Load testing simulations to determine &lt;a href="http://www.perfdynamics.com/papers.html#tth_sEc24"&gt;stimulus-response relationships&lt;/a&gt;
&lt;li&gt; Use of Excel, R, visualization, etc., to analyze data
&lt;li&gt; Development of models to both explain and predict
&lt;li&gt; Marketing/publishing your analysis and knowing the financial ramifications
&lt;/ol&gt;

To make each of these skills manifest requires:
&lt;ul&gt;
&lt;li&gt; understanding the relevant technologies
&lt;li&gt; understanding of good deal of math and statistics (without being a mathematician)
&lt;li&gt; being able to communicate technical concepts to mere mortals (e.g., the CEO)
&lt;li&gt; ability to perform diagnostic experiments
&lt;li&gt; being a generalist vs. a specialist (Get your face out of the bit bucket)
&lt;li&gt; ability to spot patterns and analogies (e.g., &lt;a href="http://goo.gl/KOIsC"&gt;UNIX load average&lt;/a&gt; acts like an RC electric circuit)
&lt;li&gt; paying attention to the right details (Put that kitchen sink down!)
&lt;li&gt; cross-checking your conclusions (e.g., Therefore: lightweight heavy processes sleep furiously)
&lt;li&gt; constantly watching market trends (to avoid being run over by the technology train)
&lt;/ul&gt;

It's also important to have a clear and unambiguous understanding of performance metrics. But even more important than that, is understanding the &lt;b&gt;relationships&lt;/b&gt; &lt;i&gt;between&lt;/i&gt; those metrics. Those relationships are typically &lt;b&gt;nonlinear&lt;/b&gt; and that's what makes CaP both hard and interesting. And that's what makes all the above skills not only important but &lt;b&gt;vital&lt;/b&gt;. 
&lt;blockquote&gt;
&lt;FONT style="BACKGROUND-COLOR: yellow"&gt;&lt;i&gt;We are data scientists too!&lt;/i&gt;&lt;/FONT&gt;
&lt;/blockquote&gt;

The nonlinear relationships are often best expressed using queue-theoretic paradigms because all complex computer systems can be represented as a network (or circuit) of buffers (queues). QED
&lt;p&gt;
The good news here is, you will &lt;i&gt;not&lt;/i&gt; be replaced by software or a computer any time soon. 
&lt;blockquote&gt;
&lt;FONT style="BACKGROUND-COLOR: yellow"&gt;&lt;i&gt;&lt;a href="http://goo.gl/zxDwe"&gt;Watson won Jeopardy&lt;/a&gt;. Pfft! Big deal.&lt;/i&gt;&lt;/FONT&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Models, e.g., queueing models, are not only useful for &lt;i&gt;prediction&lt;/i&gt; (the usage most people think of), but they are often &lt;b&gt;more&lt;/b&gt; useful for &lt;b&gt;explaining&lt;/b&gt; data.
&lt;blockquote&gt;
&lt;FONT style="BACKGROUND-COLOR: yellow"&gt;&lt;i&gt;A good model is better than a crystal ball (which is just a piece of glass).&lt;/FONT&gt;&lt;/i&gt;
&lt;/blockquote&gt;
Beyond the technical skills, CaP also requires connecting it all up with financial constraints/budgets in purchasing/procurement cycles, etc. That aspect varies enormously depending on the type of business and its operational requirements.
&lt;/blockquote&gt;
What did I miss? Comments, corrections, additions, refinements: all welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-5630774721393270372?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xLufctmhulldsE1rydUz13z_V-Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLufctmhulldsE1rydUz13z_V-Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xLufctmhulldsE1rydUz13z_V-Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLufctmhulldsE1rydUz13z_V-Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/meSo9AhscGs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/5630774721393270372/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=5630774721393270372" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5630774721393270372?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5630774721393270372?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/meSo9AhscGs/list-of-cap-skills.html" title="A List of CaP Skills" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/12/list-of-cap-skills.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIERng6eSp7ImA9WhRXE0s.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-6350360521129248569</id><published>2011-12-19T19:08:00.000-08:00</published><updated>2011-12-19T21:55:07.611-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T21:55:07.611-08:00</app:edited><title>Season's Greetings 2011</title><content type="html">Best wishes to all my blog readers and &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Guerrilla class alumni&lt;/a&gt; during this 2011 holiday season. I look forward to more of the same next year.

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-xmBNd5CL3Yo/Tu_31BAxb9I/AAAAAAAAA5o/Z9KVWvoi6DU/s1600/hamcam2.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="216" width="400" src="http://3.bp.blogspot.com/-xmBNd5CL3Yo/Tu_31BAxb9I/AAAAAAAAA5o/Z9KVWvoi6DU/s400/hamcam2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;b&gt;Image:&lt;/b&gt; The winter lights of Silicon Valley, California, from &lt;a href="http://g.co/maps/zxjy2"&gt;Mt. Hamilton&lt;/a&gt; webcam courtesy of &lt;a href="http://www.ucolick.org/"&gt;UC Regents&lt;/a&gt; and &lt;a href="http://mthamilton.ucolick.org/"&gt;Lick Observatory&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-6350360521129248569?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NyHxANlNI14HSuIQ4HhNPavL9pc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NyHxANlNI14HSuIQ4HhNPavL9pc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NyHxANlNI14HSuIQ4HhNPavL9pc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NyHxANlNI14HSuIQ4HhNPavL9pc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/cC7IfswqsIc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/6350360521129248569/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=6350360521129248569" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6350360521129248569?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6350360521129248569?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/cC7IfswqsIc/seasons-greetings-2011.html" title="Season's Greetings 2011" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-xmBNd5CL3Yo/Tu_31BAxb9I/AAAAAAAAA5o/Z9KVWvoi6DU/s72-c/hamcam2.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/12/seasons-greetings-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBSXw9cSp7ImA9WhRUEks.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3597624055907357417</id><published>2011-10-24T10:38:00.000-07:00</published><updated>2012-01-22T12:00:58.269-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-22T12:00:58.269-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="load test" /><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="big data" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud computing" /><category scheme="http://www.blogger.com/atom/ns#" term="USL" /><category scheme="http://www.blogger.com/atom/ns#" term="LoadRunner" /><category scheme="http://www.blogger.com/atom/ns#" term="benchmark" /><title>Webinar: Load Testing Meets Data Analytics</title><content type="html">This &lt;b&gt;Thursday, October 27 at 10 am PDT&lt;sup&gt;*&lt;/sup&gt;&lt;/b&gt;, I'll be participating in a &lt;a href="http://www.soasta.com/soasta-cloudtest-run-more-tests/"&gt;webinar&lt;/a&gt; sponsored by &lt;a href="http://www.soasta.com/"&gt;SOASTA, Inc&lt;/a&gt;. They make a 
new breed of load-testing product called &lt;i&gt;CloudTest&lt;/i&gt;&amp;reg; which, despite its name, is not restricted to load testing cloud-based apps, although it can do that too. &lt;a name='more'&gt;&lt;/a&gt;
&lt;P&gt;
&lt;i&gt;CloudTest&lt;/i&gt; facilitates load testing &lt;i&gt;any&lt;/i&gt; &lt;b&gt;web-based apps&lt;/b&gt; currently being deployed in your data center, &lt;b&gt;at scale&lt;/b&gt;, in &lt;b&gt;less time&lt;/b&gt;. The "at scale" part refers to the fact that &lt;b&gt;thousands&lt;/b&gt; of user-loads can be provisioned dynamically via cloud-based servers, and the "less time" part refers to constructing test scenarios more rapidly than can be achieved with conventional scripting. Therefore, test coverage can approach 100%, which also means a lot of test data might be generated. The potential data torrent caused by such a high degree of coverage necessitates being able to transform all that data into &lt;b&gt;information&lt;/b&gt;, thereby exposing performance and scalability issues. Enter &lt;i&gt;CloudTest&lt;/i&gt; &lt;b&gt;data visualization&lt;/b&gt; and &lt;b&gt;real-time analytics&lt;/b&gt;.
&lt;P&gt;
In that vein, I'll be presenting three case studies where better test-data analytics would have been very useful:
&lt;ol&gt;
&lt;li&gt; &lt;b&gt;CASE STUDY: Unseen Error Rates.&lt;/b&gt; The inability to visualize RDBMS transaction errors in the SUT meant that the reported throughput data  were overly optimistic because they were actually comprised of 70% committed transactions + 30% errors due to &lt;i&gt;failed&lt;/i&gt; transactions. None of the performance test engineers were aware of this problem during 18 months of testing (until I pointed it out&amp;mdash;over the phone!). Real-time analytics could have avoided a lot of useless testing.

&lt;li&gt; &lt;b&gt;CASE STUDY: Local vs. Global Test Data.&lt;/b&gt; Like ships passing in the night, QA and WebOps, being in different organizations, never talked to each other so there was no awareness of the glaring discrepancy between user-latency data (measured by services like Keynote and Gomez) and load-testing SLA targets (measured with LoadRunner, JMeter, etc.) for apps development. &lt;i&gt;CloudTest&lt;/i&gt; incorporates both.

&lt;li&gt; &lt;b&gt;CASE STUDY: More Testing is Better.&lt;/b&gt; The early releases of &lt;a href="http://www.google.com/url?sa=t&amp;rct=j&amp;q=memcached&amp;source=web&amp;cd=1&amp;ved=0CDwQFjAA&amp;url=http%3A%2F%2Fmemcached.org%2F&amp;ei=1pqlTvv7FrLJiQKhxrAw&amp;usg=AFQjCNEEMDfA6L4gMMP-z9gOQ-F_Xxy8gA"&gt;memcached&lt;/a&gt; were thread-limited, which meant it would still scale &lt;i&gt;out&lt;/i&gt; but not scale &lt;i&gt;up&lt;/i&gt; on next gen multicore servers; a situation that would be tantamount to considerable wasted capacity&amp;mdash;defeating the purpose of cheap K-V caching&lt;sup&gt;&amp;dagger;&lt;/sup&gt;. The ability for &lt;i&gt;CloudTest&lt;/i&gt; to resample data via more tests in the same time ensures more accurate statistical analysis. I'll demonstrate how the &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;USL nonlinear regression model&lt;/a&gt; can be applied to predicting improved scalability using the memcached load tests.
&lt;/ol&gt;
Because data and information are not the same thing, these examples will also show you how to transform your current test data into more useful  information.
&lt;p&gt;&lt;hr&gt;
* This webinar was &lt;a href="http://www.soasta.com/soasta-cloudtest-run-more-tests/"&gt;recorded&lt;/a&gt;.
  Also check out the online &lt;a href="http://cloudlink.soasta.com/t5/Public-Webinar-and-Training-Q-A/Q-amp-A-from-quot-Test-More-and-Find-More-Issues-quot-webinar/td-p/1712"&gt;Q&amp;A section&lt;/a&gt;.
&lt;br&gt;
&amp;dagger; See N. Gunther, S. Subramanyam and S. Parvu, "&lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html#tth_sEc4.3"&gt;Hidden Scalability Gotchas in Memcached and Friends&lt;/a&gt;," Velocity conference 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3597624055907357417?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XG2ban4zLNwomKe4mvfnbyBZ62U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XG2ban4zLNwomKe4mvfnbyBZ62U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XG2ban4zLNwomKe4mvfnbyBZ62U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XG2ban4zLNwomKe4mvfnbyBZ62U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/_I9cp1IL1cU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3597624055907357417/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3597624055907357417" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3597624055907357417?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3597624055907357417?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/_I9cp1IL1cU/webinar-load-testing-meets-data.html" title="Webinar: Load Testing Meets Data Analytics" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/10/webinar-load-testing-meets-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUCQ3ozeip7ImA9WhdaEkw.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3563029872924747433</id><published>2011-10-20T20:32:00.000-07:00</published><updated>2011-10-21T08:17:42.482-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-21T08:17:42.482-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="performance management" /><title>Kanban Revived in an Agile Kind of Way</title><content type="html">I just returned from a workshop on the latest in web technologies (invitation only) where I was surprised to hear reference made to &lt;a href="http://en.wikipedia.org/wiki/Kanban#Kanban_cards"&gt;kanban&lt;/a&gt;. &lt;i&gt;Kanban&lt;/i&gt; is a card-based system originally developed by Toyota in the 1950s for controlling their manufacturing lines. I have a note about it in the "Brief History of Buffers" section of my &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;Perl::PDQ book&lt;/a&gt; because it is a logical precursor to &lt;a href="http://en.wikipedia.org/wiki/Just_in_time_(business)"&gt;JIT&lt;/a&gt; scheduling and compiling. I will also discuss it in the up-coming &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Guerrilla classes&lt;/a&gt;.
&lt;p&gt;
Now, it seems kanban has been revived under the "agile" banner for making &lt;a href="http://www.agileweboperations.com/scrum-vs-kanban"&gt;software development&lt;/a&gt; more efficient. Of course, the concept of using cards to capture dev state information is not entirely new, even in the context of software engineering. So-called &lt;a href="http://www.code-magazine.com/article.aspx?quickid=0102061&amp;page=2"&gt;Snow Cards&lt;/a&gt; are another card-based technique used to monitor the software development process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3563029872924747433?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jOemyEOPslpbagqRPCMeg4TASuc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jOemyEOPslpbagqRPCMeg4TASuc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jOemyEOPslpbagqRPCMeg4TASuc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jOemyEOPslpbagqRPCMeg4TASuc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/M63OrwX1N4E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3563029872924747433/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3563029872924747433" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3563029872924747433?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3563029872924747433?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/M63OrwX1N4E/kanban-revived-in-agile-kind-of-way.html" title="Kanban Revived in an Agile Kind of Way" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/10/kanban-revived-in-agile-kind-of-way.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4BRXk6eyp7ImA9WhdbF0k.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-7279552352676560941</id><published>2011-10-03T00:00:00.000-07:00</published><updated>2011-10-15T22:45:54.713-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-15T22:45:54.713-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>Visual Illusions: Google vs Facebook vs Yahoo</title><content type="html">The ability to &lt;b&gt;visualize data&lt;/b&gt;, enabled by the advent of graphical computer tools, has been a great boon to Cap and Perf. The power derives from the way graphical displays provide an efficient impedance match to the visual system in our brain. The weakness derives from the way graphical displays provide an efficient impedance match to the visual system in our brain. We can get carried away by visual representations alone. Every marketing organization exploits that weakness. Numbers do have poor cognitive impedance, but that doesn't mean numbers should ignored altogether. In fact, we often need a combination of both numerical and visual data representations so that we don't suffer visual miscues and thus jump to the wrong conclusion. The following presents an example of how easily this can happen.
&lt;p&gt;
Recently, Guerrilla alumnus, Scott J. pointed me at this &lt;a href="http://www.businessinsider.com/chart-of-the-day-facebook-revenue-2011-9"&gt;Chart of the Day&lt;/a&gt; showing how Google revenue growth was outpacing both Facebook and Yahoo, when compared 7 years after launching the respective companies.
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-DYWZ-tac3xc/ToXrdYaY_8I/AAAAAAAAA3o/u7KBCq2dL28/s1600/chart-facebook-yahoo-google-sept-2011.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://1.bp.blogspot.com/-DYWZ-tac3xc/ToXrdYaY_8I/AAAAAAAAA3o/u7KBCq2dL28/s400/chart-facebook-yahoo-google-sept-2011.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Clearly, this chart is intended to be an attention getter for the &lt;a href="http://www.businessinsider.com/sai"&gt;Silicon Alley Insider&lt;/a&gt; website but, it looks about right and normally I might have just accepted the claim without giving it anymore thought. The notion that &lt;i&gt;Google growth is dominating&lt;/i&gt;, is also consistent with a lot of other things one sees. No surprises there.&lt;a name='more'&gt;&lt;/a&gt;

&lt;h4&gt;Exponential doubling period&lt;/h4&gt;
In this particular case, however, I was struck by the &lt;i&gt;shape&lt;/i&gt; of the data and curious to find out if the growth of GOOG and FB revenue follows an exponential trend or not. Exponential growth is not unexpected because it's the continuous analog of &lt;a href="http://en.wikipedia.org/wiki/Compound_interest"&gt;compound interest&lt;/a&gt;. If they are growing exponentially, I can compare their &lt;i&gt;doubling periods&lt;/i&gt; &lt;b&gt;numerically&lt;/b&gt; and determine by how their growth will look in the future.
&lt;p&gt;
The doubling period is an analysis technique that I use in Chapter 8 of my &lt;a href="http://www.perfdynamics.com/iBook/gcap.html"&gt;Guerrilla Capacity Planning&lt;/a&gt; book to determine the &lt;b&gt;traffic growth&lt;/b&gt; of major &lt;b&gt;websites&lt;/b&gt;. In section 8.7.5 the doubling time t&lt;sub&gt;2&lt;/sub&gt; is defined as:
&lt;br /&gt;
&lt;center&gt;&lt;br /&gt;
t&lt;sub&gt;2&lt;/sub&gt; = Ln(2) / A&lt;br /&gt;
&lt;/center&gt;&lt;br /&gt;
where A is the growth parameter of the fitted &lt;a href="http://en.wikipedia.org/wiki/Exponential_function"&gt;exponential curve&lt;/a&gt; (the rate at which it bends upward) and Ln(2) is the &lt;a href="http://en.wikipedia.org/wiki/Natural_logarithm"&gt;natural logarithm&lt;/a&gt; of 2 (2 for doubling). The only fly in the ointment is that I don't have the actual numeric values used in the histogram chart, but that need not be a showstopper. There are only a half dozen data points for each company, so I can estimate them visually. Then, I can use R to fit the exponential models and calculate the respective doubling times.

&lt;h4&gt;Analysis in R&lt;/h4&gt;
First, we read the data (as eyeballed from the online chart) into R. Since the amount of data is small, I simply use the &lt;tt&gt;textConnection&lt;/tt&gt; trick to write the data in situ, rather than using an external file.
&lt;pre class="source-code"&gt;&lt;code&gt;
gd &lt;- read.table(textConnection("Year GOOG FB\tYAH
1 0.001 0.002 0.001
2 0.01 0.02 0.01
3 0.1 0.2 0.1
4 0.5 0.45 0.3
5 1.5 0.75 0.6
6 3.2 2.0 1.1
7 6.1 4.0 0.75"), 
header=TRUE,sep="\t")
closeAllConnections()
&lt;/code&gt;&lt;/pre&gt;
I can now plot those estimated data points and compare them with the original chart.
&lt;pre class="source-code"&gt;&lt;code&gt;
plot(gd$Year,gd$GOOG,type="b",col="green",lwd=2,lty="dashed",
main="Annual revenues for GOOG (green), FB (blue), YAH (red)",
xlab="Years after launch", ylab="$ billions")
points(gd$Year,gd$FB,type="b",col="blue",lwd=2,lty="dashed")
points(gd$Year,gd$YAH,type="b",col="red",lwd=2,lty="dashed")
&lt;/code&gt;&lt;/pre&gt;
The result looks like this:
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-iCGOHM0iMlo/ToX4f694dqI/AAAAAAAAA3w/eBTWLqSHzrg/s1600/Rplot-googfb.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="374" width="400" src="http://3.bp.blogspot.com/-iCGOHM0iMlo/ToX4f694dqI/AAAAAAAAA3w/eBTWLqSHzrg/s400/Rplot-googfb.png" /&gt;&lt;/a&gt;&lt;/div&gt;

The dashed lines simply connect related points together. The two solid lines are produced by performing the corresponding exponential fits to the GOOG and FB data.
&lt;pre class="source-code"&gt;&lt;code&gt;
# x-values for continuous exp curves
x&lt;-seq(from=1, to=7, by=0.1)

ggfit&lt;-nls(gd$GOOG ~ g0*exp(g1*gd$Year),data=gd,start=list(g0=1,g1=1))
gc&lt;-coef(ggfit)
lines(x,y=gc[1]*exp(gc[2]*x))

fbfit&lt;-nls(gd$FB ~ f0*exp(f1*gd$Year),data=gd,start=list(f0=1,f1=1))
fc&lt;-coef(fbfit)
lines(x,y=fc[1]*exp(fc[2]*x))

# report the doubling periods
text(1,5.0,sprintf("%2s doubling time: %4.2f months", names(gd)[2],12*log(2)/gc[2]),adj=c(0,0))
text(1,4.5,sprintf("%2s doubling time: %4.2f months", names(gd)[3],12*log(2)/fc[2]),adj=c(0,0))
&lt;/code&gt;&lt;/pre&gt;
From the R analysis we see that the doubling period for Google (t&lt;sub&gt;2&lt;/sub&gt; = 11.39 months) is slightly &lt;b&gt;longer&lt;/b&gt; than that for Facebook (t&lt;sub&gt;2&lt;/sub&gt; = 10.94 months). Despite the banner claim made by &lt;a href="http://www.businessinsider.com/sai"&gt;Silicon Alley Insider&lt;/a&gt;, based on these estimated data, Google is growing revenue at a slightly &lt;i&gt;slower&lt;/i&gt; rate than Facebook. How can that be?

&lt;h4&gt;Conclusion&lt;/h4&gt;
In the original histogram chart, it looks like Google is growing faster than Facebook. Well, &lt;b&gt;looks can be deceiving&lt;/b&gt;. Your brain can be fooled (easily) by optical illusions. That's why we need to do analysis in the first place. Viewed uncritically, your brain can easily be led astray.
&lt;p&gt;
To resolve this paradox, let's do two things:
&lt;ol&gt;
&lt;li&gt; Project the growth models out further than the 7 years associated with the data
&lt;li&gt; Plot the projected curves on log-linear axes (for reasons that will become clear shortly)
&lt;/ol&gt;
Here's the result (you might want to click on the image to magnify it).
&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-0s9Ggvtfn6M/ToaUt5Ug7DI/AAAAAAAAA4A/RPpm-eJKWD8/s1600/Rplot-project.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="165" width="400" src="http://4.bp.blogspot.com/-0s9Ggvtfn6M/ToaUt5Ug7DI/AAAAAAAAA4A/RPpm-eJKWD8/s400/Rplot-project.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
The left-hand plot shows that the two curves cross somewhere between 7 years out and 40 years out. Whereas green (Google) is currently on top, according to the data, blue (Facebook) eventually ends up on top according to the exponential models; assuming nothing else changes in the future. The right-hand plot uses a log-scaled y-axis to reveal more clearly that the crossover occurs at t = 23.9 years.  Once again, if you rely purely on visuals, you might think the crossover doesn't occur until &lt;b&gt;after 30 years&lt;/b&gt; (what looks like a "knee" in the left-hand plot), but you'd be misled. It occurs almost &lt;b&gt;10 years earlier&lt;/b&gt;.
&lt;p&gt;
If, for example, you were only interested in short-term gains (as Wall St is wont to do), the original visual (histogram) is correct. If, on the other hand, you are in your 20s and investing longer term, e.g., for your retirement, you might get a surprise.
&lt;p&gt;
By now, you might be thinking that these projections are not very accurate, and I wouldn't completely disagree with you. But what &lt;i&gt;is&lt;/i&gt; accurate here? The original data in the histogram (even the really real actual data) probably aren't very accurate either; we really can't know without deeper investigation. And that's my point: independent of the accuracy of the data, &lt;i&gt;the numerical analysis can cause you to pay attention to, and possibly ask questions about, something you might otherwise have taken for granted on purely visual grounds&lt;/i&gt;.
&lt;center&gt;
&lt;i&gt;&lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.11"&gt;Even wrong expectations are better than no expectations&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;
&lt;p&gt;
I'm a big fan of &lt;a href="http://groups.google.com/group/perfviz"&gt;data visualization&lt;/a&gt;, but not to the exclusion of numerical analysis. We need both and we need both to be easily accessible.
&lt;center&gt;
&lt;i&gt;&lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.26"&gt;The art is in the science&lt;/a&gt;&lt;/i&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-7279552352676560941?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cQBxFORb2ObLdullscKcArRZ4dU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cQBxFORb2ObLdullscKcArRZ4dU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cQBxFORb2ObLdullscKcArRZ4dU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cQBxFORb2ObLdullscKcArRZ4dU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/yAc_8HcC5No" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/7279552352676560941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=7279552352676560941" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/7279552352676560941?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/7279552352676560941?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/yAc_8HcC5No/visual-illusions-google-vs-facebook-vs.html" title="Visual Illusions: Google vs Facebook vs Yahoo" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-DYWZ-tac3xc/ToXrdYaY_8I/AAAAAAAAA3o/u7KBCq2dL28/s72-c/chart-facebook-yahoo-google-sept-2011.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/10/visual-illusions-google-vs-facebook-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACSHc4cSp7ImA9WhdWGEg.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-1735993217913849870</id><published>2011-09-12T11:39:00.000-07:00</published><updated>2011-09-12T11:39:29.939-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-12T11:39:29.939-07:00</app:edited><title>Plan for GCaP in November</title><content type="html">Seats are still available for the final &lt;a href="http://www.perfdynamics.com/Classes/Outlines/gboot.html"&gt;   Guerrilla Boot Camp&lt;/a&gt; (GBoot) and


&lt;a href="http://www.perfdynamics.com/Classes/Outlines/guerilla.html"&gt;Guerrilla Capacity Planning&lt;/a&gt; (GCaP) classes for 2011 at the &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Early Bird&lt;/a&gt; rate. Before registering, you can review the highlights of the May &lt;a href="http://perfdynamics.blogspot.com/2011/05/may-2011-guerrilla-classes-light-bulb.html"&gt;GCaP class&lt;/a&gt;. If you came to the August &lt;a href="http://perfdynamics.blogspot.com/2011/08/gdat-2011-in-review.html"&gt;GDAT class&lt;/a&gt;, but missed the May classes, this is your chance to complete the set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;&lt;img alt="Entrance Larkspur Landing hotel Pleasanton California" height="173" src="http://3.bp.blogspot.com/_MPdbS9EPh5Y/TFSvF5F97JI/AAAAAAAAArs/XkqSZlk6Zy4/s320/Larkspur-Pleasanton.jpg" width="365" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
As usual, it will be held at our lovely &lt;b&gt;Larkspur Landing&lt;/b&gt; location.  Click on the image for booking information.&lt;br /&gt;
&lt;br /&gt;
Attendees should bring their &lt;span style="font-weight: bold;"&gt;laptops&lt;/span&gt;, as course materials are provided on CD or flash drive. The venue also offers free &lt;span style="font-weight: bold;"&gt;wi-fi&lt;/span&gt; to the internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-1735993217913849870?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AVYoTRiSuh9DEsGWSjK2uWu5p-w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AVYoTRiSuh9DEsGWSjK2uWu5p-w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AVYoTRiSuh9DEsGWSjK2uWu5p-w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AVYoTRiSuh9DEsGWSjK2uWu5p-w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/WR-7FgRYpSg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/1735993217913849870/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=1735993217913849870" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/1735993217913849870?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/1735993217913849870?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/WR-7FgRYpSg/plan-for-gcap-in-november.html" title="Plan for GCaP in November" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_MPdbS9EPh5Y/TFSvF5F97JI/AAAAAAAAArs/XkqSZlk6Zy4/s72-c/Larkspur-Pleasanton.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/09/plan-for-gcap-in-november.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CRX84eip7ImA9WhdUFko.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3147840189282312987</id><published>2011-09-06T20:59:00.000-07:00</published><updated>2011-10-03T14:06:04.132-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T14:06:04.132-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="ORACLE" /><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="storage" /><category scheme="http://www.blogger.com/atom/ns#" term="capacity planning" /><title>How Much Wayback for CaP?</title><content type="html">How much data do you need to retain for meaningful capacity planning and performance analysis purposes? Sounds like one of those "&lt;a href="http://perfdynamics.blogspot.com/2007/04/how-long-should-queue-be.html"&gt;how long is a piece of string?&lt;/a&gt;" questions and I've never really thought about it in any formal way, but it occurred to me that 5 years is not an unreasonable archival period. 
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;a href="http://1.bp.blogspot.com/-D7UUtgqbVEg/TmcbrqK5P2I/AAAAAAAAA3g/sz_HvuE09gk/s1600/wayback.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/-D7UUtgqbVEg/TmcbrqK5P2I/AAAAAAAAA3g/sz_HvuE09gk/s400/wayback.jpg" width="400" /&gt;&lt;/a&gt;&lt;center&gt;&lt;a href="http://en.wikipedia.org/wiki/Mister_Peabody"&gt;Mister Peabody and Sherman in front of the WABAC machine&lt;/center&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;br /&gt;
My reasoning goes like this:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;blockquote&gt;
To make statistically meaningful estimates for models like linear least squares, you need at minimum about half a dozen data points. This is the kind of rule of thumb (RoT) I developed for &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;USL scalability modeling&lt;/a&gt; to be meaningful.&lt;br /&gt;
&lt;br /&gt;
Now consider that same RoT from another standpoint. If you are Amazon.com, for example, and you want to estimate your Christmas growth trend, then you need about half a dozen data points. That means 5 or 6 years of data.&lt;br /&gt;
&lt;br /&gt;
That time scale for a historical data repository certainly distinguishes CaP from simple performance monitoring (no storage) and performance analysis (short-term history) where you are looking for diagnostic patterns rather than trends.
&lt;br /&gt;
How much data is kept during those 5 yrs is a secondary, sampling question. As surely as you throw away arbitrary periods of data those will become the periods you will need at some later time for CaP purposes. In fact, it's probably more work to selectively remove certain data periods than it is to automatically keep the lot. But keeping everything might be overkill. That's typically where data aggregation comes in. The further back in time you go, the less likely you will need events with fine time-granularity.&lt;/blockquote&gt;
&lt;br /&gt;
With this RoT in mind, I decided to google the topic but discovered there is very little that is relevant to CaP since most commentators are typically considering data storage for applications (e.g., an RDMS), not historical data for CaP analysis. FWIW, here's what I found during a relatively quick review:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; SMB planning mentions &lt;a href="http://searchsmbstorage.techtarget.com/feature/Data-storage-capacity-planning-for-SMBs"&gt;5 years&lt;/a&gt; without any justification&lt;br /&gt;
&lt;blockquote&gt;
"knowing what your business is doing...in an 18-month time frame, to a three-year time frame, to a five-year time frame. You really need to plan out that far, but if you do, it's fantastic. If you have a five-year plan, it will trickle down more easily into getting your hands around capacity and growth."&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Oracle example of &lt;a href="http://download.oracle.com/docs/html/A88720_01/cpchap.htm"&gt;6 weeks&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;
"Suppose, for example, you always want to be able to view hour data for the previous six weeks. ..."&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt; IBM up to &lt;a href="http://publib.boulder.ibm.com/infocenter/tivihelp/v15r1/index.jsp?topic=%2Fcom.ibm.itm.doc_6.2.2fp2%2Fhistory_sumprune_bestpractice.htm"&gt;2 months&lt;/a&gt; before aggregating ("pruning")&lt;br /&gt;
&lt;blockquote&gt;
"Capacity planning and predictive alerting: For capacity planning and predictive analytics, you typically perform long term trend analysis. The Performance Analyzer, for example, uses Daily summarization data for the predefined analytic functions. So, in most cases, configure daily summarization. You can define your own analytic functions and use Hourly or Weekly summarization data."&lt;br /&gt;
&lt;br /&gt;
"For the analytic functions to perform well, ensure that you have an 
appropriate number of data points in the summarized table. If there are too 
few, the statistical analysis will not be very accurate. You will probably 
want at least 25 to 50 data points. To achieve 50 data points using Daily 
summarization, you must keep the data for 50 days before pruning. More data 
points will make the statistical predictions more accurate, but will affect 
the performance of your reporting and statistical analysis. Consider having 
no more than a few hundred data points per resource being evaluated. If you 
use Hourly summarization, you get 336 data points every 2 weeks."&lt;br /&gt;
&lt;br /&gt;
"Adaptive monitoring (dynamic thresholding): Keep 7 to 30 days of detailed data when comparing all work days. If you compare Monday to Monday, then you need to keep the Detailed data much longer to be able to establish a trend. When comparing a specific day of the week, you will&lt;br /&gt;
probably need to have at least 60 days of data.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; RRDtool example &lt;a href="http://www.vandenbogaerdt.nl/rrdtool/tutorial/rrdcreate.php"&gt;2 years&lt;/a&gt; for consolidation decisions.&lt;br /&gt;
&lt;blockquote&gt;
"if now is March 1st, 2009, do you want to look at 2007-03-01 until 2009-03-01 or&lt;br /&gt;
do you want to be able to look at 2007-03-01 midnight to next midnight."&lt;br /&gt;
&lt;br /&gt;
"What you need to understand here is consolidation. Say that you will be looking 
at two years worth of information, and that the available data is in a 
resolution of 300 seconds per bucket. This means you have more than 200,000 
buckets."&lt;br /&gt;
&lt;br /&gt;
"Example: Say you want to be able to display the last 2 years, the last 2 months, the last 2 weeks and the last 2 days. The database uses the default step size of 300&lt;br /&gt;
seconds per interval."&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Ultimately, I'd like to turn my 5-year RoT into a &lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html"&gt;Guerrilla Mantra&lt;/a&gt;. Send me your thoughts and comments to help me get there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3147840189282312987?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aHwEofGwFbkZ8lXIu7WAfvyzfd0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aHwEofGwFbkZ8lXIu7WAfvyzfd0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aHwEofGwFbkZ8lXIu7WAfvyzfd0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aHwEofGwFbkZ8lXIu7WAfvyzfd0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/HZFhdQz-rcw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3147840189282312987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3147840189282312987" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3147840189282312987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3147840189282312987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/HZFhdQz-rcw/how-much-history-for-cap.html" title="How Much Wayback for CaP?" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-D7UUtgqbVEg/TmcbrqK5P2I/AAAAAAAAA3g/sz_HvuE09gk/s72-c/wayback.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/09/how-much-history-for-cap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUERHg7fSp7ImA9WhdWGEg.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-465922820856379621</id><published>2011-08-23T00:00:00.000-07:00</published><updated>2011-09-12T11:46:45.605-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-12T11:46:45.605-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>Subjugation to the Sigmas</title><content type="html">No doubt you've heard about the &lt;a href="http://en.wikipedia.org/wiki/Nines_%28engineering%29"&gt;tyranny of the 9s&lt;/a&gt; in reference to computer system availability. You're probably also familiar with the phrase &lt;a href="http://en.wikipedia.org/wiki/Six_Sigma"&gt;six sigma&lt;/a&gt;, either in the context of manufacturing process quality control or the improvement of business processes. As we discovered in the recent &lt;a href="http://perfdynamics.blogspot.com/2011/08/gdat-2011-in-review.html"&gt;Guerrilla Data Analysis Techniques&lt;/a&gt; class, the two concepts are related.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;br /&gt;
&lt;table border="1"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;b&gt;&amp;nbsp;Nines&amp;nbsp; &lt;/td&gt;&lt;td colspan="1" align="center"&gt;&lt;b&gt;Percent&lt;/b&gt; &lt;/td&gt;&lt;td colspan="1" align="center"&gt;&amp;nbsp;&lt;b&gt;Downtime/Year&amp;nbsp;&lt;/b&gt; &lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;b&gt;&amp;#963; Level&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;4 &lt;/td&gt;&lt;td align="right"&gt;99.99%&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;&amp;nbsp;52.596 minutes&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;4&amp;#963;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;5 &lt;/td&gt;&lt;td align="right"&gt;99.999%&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;&amp;nbsp;5.2596 minutes&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;- &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;6 &lt;/td&gt;&lt;td align="right"&gt;99.9999%&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;&amp;nbsp;31.5576 seconds&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;5&amp;#963;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;7 &lt;/td&gt;&lt;td align="right"&gt;99.99999%&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;&amp;nbsp;3.15576 seconds&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;-&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center"&gt;8 &lt;/td&gt;&lt;td align="right"&gt;&amp;nbsp;99.999999%&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;&amp;nbsp;315.6 milliseconds&amp;nbsp; &lt;/td&gt;&lt;td align="center"&gt;6&amp;#963;&lt;/td&gt;&lt;/tr&gt;
&lt;/b&gt;&lt;/b&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
In this way, people like to talk about achieving "5 nines" availability or a "six sigma" quality level. These phrases are often bandied about without appreciating: &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;ol&gt;&lt;li&gt; that nines and sigmas refer to similar criteria.&lt;br /&gt;
&lt;li&gt; that high nines and high sigmas are very difficult to achieve consistently.&lt;br /&gt;
&lt;/ol&gt;See the appended Comments below for more details and examples.&lt;p&gt;To arrive at the 3rd column of numbers in the table, you can use the following R function to find out how much shorter downtime per year each additional 9 imposes. Hence, the term &lt;i&gt;tyranny&lt;/i&gt;. &lt;pre class="source-code"&gt;&lt;code&gt;
downt &lt;- function(nines,tunit=c('s','m','h')) {
	ds &lt;- 10^(-nines) * 365.25*24*60*60
	if(tunit == 's') { ts &lt;- 1; tu &lt;- "seconds" }
	if(tunit == 'm') { ts &lt;- 60; tu &lt;- "minutes" }
	if(tunit == 'h') { ts &lt;- 3600; tu &lt;- "hours" }
	return(sprintf("Downtime per year at %d nines: %g %s", nines, ds/ts,tu))
}

&gt; downt(5,'m')
[1] "Downtime per year at 5 nines: 5.2596 minutes"
&gt; downt(8,'s')
[1] "Downtime per year at 8 nines: 0.315576 seconds"
&lt;/code&gt;&lt;/pre&gt;The associated &amp;sigma; levels correspond to the area under the Normal (Gaussian) or "bell shaped" curve within that 2&amp;sigma; interval centered on the mean (&amp;mu;). The &amp;sigma; refers to the standard deviation in the usual way.  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-52tVW48U4uw/TlNEgaBnDgI/AAAAAAAAA3Q/gctyuDN4B9Q/s1600/sigma.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="190" width="399" src="http://2.bp.blogspot.com/-52tVW48U4uw/TlNEgaBnDgI/AAAAAAAAA3Q/gctyuDN4B9Q/s400/sigma.png" /&gt;&lt;/a&gt;&lt;/div&gt;The corresponding area under the Normal curve can be calculated using the following R function: &lt;pre class="source-code"&gt;&lt;code&gt;
library(NORMT3)
sigp &lt;- function(sigma) {
	sigma &lt;- as.integer(sigma)
	apc &lt;- erf(sigma/sqrt(2))
	return(sprintf("%d-sigma bell area: %10.8f%%; Prob(chance): %e", sigma, apc*100, 1-apc))
}

&gt; sigp(2)
[1] "2-sigma bell area: 95.44997361%; Prob(chance): 4.550026e-02"
&gt; sigp(5)
[1] "5-sigma bell area: 99.99994267%; Prob(chance): 5.733031e-07"
&lt;/code&gt;&lt;/pre&gt;So, 5&amp;sigma; corresponds to slightly more than 99.9999% of the area under in the bell curve; the total area being 100%. It also corresponds closely to six 9s availability. The 2nd number computed by &lt;tt&gt;sigp&lt;/tt&gt; is the probability that the achieved availability was a fluke.   A reasonable mnemonic for some of these values is: &lt;ul&gt;&lt;li&gt; 3&amp;sigma; corresponds roughly to a probability of 1 in 1,000 that four 9s availability occurred by chance.&lt;br /&gt;
&lt;li&gt; 5&amp;sigma; is roughly a 1 in a million chance, which is like flipping a fair coin and getting 20 heads in a row.&lt;br /&gt;
&lt;li&gt; 6&amp;sigma; is roughly a 1 in a billion chance that it was a fluke.&lt;br /&gt;
&lt;/ul&gt;Now you see why these goals are easy to covet but hard to achieve.&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-465922820856379621?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hMRfOtZQgXOGABbvkD2vnWmPoj8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hMRfOtZQgXOGABbvkD2vnWmPoj8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hMRfOtZQgXOGABbvkD2vnWmPoj8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hMRfOtZQgXOGABbvkD2vnWmPoj8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/1TuL5dddaZs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/465922820856379621/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=465922820856379621" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/465922820856379621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/465922820856379621?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/1TuL5dddaZs/subjugation-to-sigmas.html" title="Subjugation to the Sigmas" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-52tVW48U4uw/TlNEgaBnDgI/AAAAAAAAA3Q/gctyuDN4B9Q/s72-c/sigma.png" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/08/subjugation-to-sigmas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcFQXkyeyp7ImA9WhdXEEU.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-8111000547547483246</id><published>2011-08-17T22:23:00.000-07:00</published><updated>2011-08-23T00:03:30.793-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T00:03:30.793-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="PerfViz" /><title>IBM Introduces the Cognitive Chip</title><content type="html">Last week, in the &lt;a href="http://perfdynamics.blogspot.com/2011/08/gdat-2011-in-review.html"&gt;GDAT class&lt;/a&gt;, we were discussing &lt;a href="http://groups.google.com/group/perfviz"&gt;performance visualization&lt;/a&gt; tools as requiring a good impedance match between the digital computer under analysis and the cognitive computer of the analyst&amp;mdash;AKA the brain.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uePZEWlbg2o/TkyeYcOa3lI/AAAAAAAAA28/GeQMFqo4c6g/s1600/BlueMatter_610x304.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="199" width="400" src="http://2.bp.blogspot.com/-uePZEWlbg2o/TkyeYcOa3lI/AAAAAAAAA28/GeQMFqo4c6g/s400/BlueMatter_610x304.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
This week, IBM will announce its first generation cognitive computing chip that they claim mimics the human brain. It is the result of Phase 2 of a grant for DARPA's Systems of Neuromorphic Adaptive Plastic Scalable Electronics (SyNAPSE) project awarded more than 3 years ago to half a dozen IBM labs and 5 major universities.&lt;br /&gt;
&lt;br /&gt;
According to IBM, "BlueMatter, a new algorithm created by IBM researchers in collaboration with Stanford University, exploits the Blue Gene supercomputing architecture in order to noninvasively measure and map the connections between all cortical and sub-cortical locations within the human brain using magnetic resonance diffusion weighted imaging. Mapping the wiring diagram of the brain is crucial to untangling its vast communication network and understanding how it represents and processes information." [Source: &lt;a href="http://news.cnet.com/8301-13772_3-10400362-52.html"&gt;CNET&lt;/a&gt;]&lt;br /&gt;
&lt;br /&gt;
These so-called cognitive chips have two prototypes that are currently being tested. The semiconductors were created out of standard technology in IBM’s VLSI fab plants. Both cores were fabricated using a 45 nm process and feature 256 neurons. One core contains 262,144 programmable synapses&amp;mdash;&lt;i&gt;a social network on a chip&lt;/i&gt;, as ZDNet's Larry Dignan &lt;a href="http://www.zdnet.com/blog/btl/ibm-creates-cognitive-semiconductors-a-step-toward-right-brain-computers/55289"&gt;describes it&lt;/a&gt;&amp;mdash;and 65,536 learning synapses. IBM has demonstrated navigation, machine vision, pattern recognition, associative memory and classification with these chips.&lt;br /&gt;
&lt;br /&gt;
So, what does it do for you? Here, IBM hedges somewhat. It wants you to think of it as complementary to conventional von Neumann digital processors. Taken together both types of chips could be used to correlate data, create hypotheses and remember state in a broader sense than a RAM chip. The combinaton of these two types of chips would be a cognitive computer.&lt;br /&gt;
&lt;br /&gt;
No word on GA or price.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-8111000547547483246?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lUsqrPDM-ZEnhAwycoAeIMUHza4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lUsqrPDM-ZEnhAwycoAeIMUHza4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lUsqrPDM-ZEnhAwycoAeIMUHza4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lUsqrPDM-ZEnhAwycoAeIMUHza4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/pJIHQPSry10" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/8111000547547483246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=8111000547547483246" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/8111000547547483246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/8111000547547483246?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/pJIHQPSry10/ibm-introduces-cognitive-chip.html" title="IBM Introduces the Cognitive Chip" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-uePZEWlbg2o/TkyeYcOa3lI/AAAAAAAAA28/GeQMFqo4c6g/s72-c/BlueMatter_610x304.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/08/ibm-introduces-cognitive-chip.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcDSHcyeip7ImA9WhdXEEU.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-792897712478442555</id><published>2011-08-13T09:34:00.000-07:00</published><updated>2011-08-23T00:04:39.992-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T00:04:39.992-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ORACLE" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="big data" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>GDAT 2011 in Review</title><content type="html">As usual, the &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Guerrilla Data Analysis Techniques&lt;/a&gt; (GDAT) class was a total blast. Motivated students always guarantee that. It would really help our scheduling, however, if people didn't wait until the last nanosecond to &lt;a href="http://www.perfdynamics.com/rego.html"&gt;register&lt;/a&gt; for the class. But given the crazy economic climate, I'm more than happy to do whatever it takes to make GDAT fly.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1TrAw_1pIKI/TkabDU0knII/AAAAAAAAA20/aSvAJtdt6Po/s1600/IMG_4838.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://2.bp.blogspot.com/-1TrAw_1pIKI/TkabDU0knII/AAAAAAAAA20/aSvAJtdt6Po/s400/IMG_4838.JPG" /&gt;&lt;center&gt;Guerrillas in the data mist [Photo: P. Newsom]&lt;/center&gt;&lt;/a&gt;&lt;/div&gt;Some course highlights that you missed: &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; How to apply &lt;a href="http://en.wikipedia.org/wiki/Principal_component_analysis"&gt;PCA tools&lt;/a&gt; in R to performance data&lt;br /&gt;
&lt;li&gt; An introduction to &lt;a href="http://en.wikipedia.org/wiki/Power_law"&gt;power-law&lt;/a&gt; data modeling. Case studies included: network packet traces, detecting disaster recovery onset, Oracle &lt;a href="http://perfdynamics.blogspot.com/2011/08/q-q-plots-for-multi-modal-performance.html"&gt;SQL query-time&lt;/a&gt; distributions. &lt;br /&gt;
&lt;li&gt; How to use &lt;a href="http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/"&gt;heatmaps&lt;/a&gt; and &lt;a href="http://flowingdata.com/2010/02/11/an-easy-way-to-make-a-treemap/"&gt;treemaps&lt;/a&gt; in R to visualize the performance and capacity of kilo-servers in your data center&lt;br /&gt;
&lt;li&gt; The use of &lt;a href="http://www.perfdynamics.com/Tools/tools.html"&gt;animation&lt;/a&gt; and &lt;a href="http://systemdatarecorder.org/cpuplayer/case/sybase/sybase.html"&gt;video&lt;/a&gt; for &lt;a href="http://groups.google.com/group/perfviz"&gt;performance visualization&lt;/a&gt; tools&lt;br /&gt;
&lt;li&gt; How to apply &lt;a href="http://planatscher.net/svmtut/svmtut.html"&gt;Machine Learning&lt;/a&gt; tools in R to cubic light-years of performance data&lt;br /&gt;
&lt;li&gt; How to debug your R scripts&lt;br /&gt;
&lt;li&gt; Jim Holtman may have helped me to resolve a bug in &lt;a href="http://www.perfdynamics.com/Tools/PDQ-R.html"&gt;PDQ-R&lt;/a&gt; that causes the R Console to crash. If so, &lt;a href="http://www.perfdynamics.com/Tools/PDQ-R.html"&gt;PDQ-R&lt;/a&gt; could soon be ready for &lt;a href="http://cran.r-project.org/"&gt;CRAN&lt;/a&gt; time.&lt;br /&gt;
&lt;/ul&gt;We also had a couple of excellent class dinners. Almost like old times. Maybe we aren't heading for GFC-2 or that "double-dip" recession. :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-792897712478442555?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hU8VMq2740aCJnmh5vn1Ste62Q8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hU8VMq2740aCJnmh5vn1Ste62Q8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hU8VMq2740aCJnmh5vn1Ste62Q8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hU8VMq2740aCJnmh5vn1Ste62Q8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/0p5XQ8yV3S0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/792897712478442555/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=792897712478442555" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/792897712478442555?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/792897712478442555?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/0p5XQ8yV3S0/gdat-2011-in-review.html" title="GDAT 2011 in Review" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-1TrAw_1pIKI/TkabDU0knII/AAAAAAAAA20/aSvAJtdt6Po/s72-c/IMG_4838.JPG" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/08/gdat-2011-in-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEHQnc9eip7ImA9WhRSFEo.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-9142502264961714028</id><published>2011-08-03T21:30:00.000-07:00</published><updated>2011-11-16T13:23:53.962-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-16T13:23:53.962-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ORACLE" /><category scheme="http://www.blogger.com/atom/ns#" term="response time" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><category scheme="http://www.blogger.com/atom/ns#" term="performance models" /><title>Q-Q Plots for Multi-modal Performance Data</title><content type="html">I'm in the process of putting together some slides on how to apply &lt;a href="http://en.wikipedia.org/wiki/Q-Q_plot"&gt;Quantile-Quantile plots&lt;/a&gt; to performance data. Q-Q plots are a handy tool for visually inspecting how well your data matches a known probability distribution (prob dsn). If the match is good, the data should line up more or less diagonally in the Q-Q plot. A common usage is to verify normality, i.e. how well the data matches a Normal or Gaussian dsn. In fact, this usage is so common that R even has a separate function called &lt;tt&gt;qqnorm()&lt;/tt&gt; for doing just that.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
That's all textbook stuff, so I was wondering if anyone had tried it on computer performance data, e.g., response times. No sooner had I fired up the Google tab than blow me down if I don't see a blog post entitled &lt;a href="http://aberdave.blogspot.com/2011/06/q-q-plots-to-examine-sql-execution-time.html"&gt;"Q-Q plots to examine SQL execution time distributions"&lt;/a&gt;. Not only that, but it's written by my colleague from the &lt;a href="http://perfdynamics.blogspot.com/2011/03/hotsos-2011-brooks-cooks-delay-and-this.html"&gt;Hotsos Symposium&lt;/a&gt;, Dave Abercrombie&amp;mdash;who has also been beavering away at applying &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;my USL model&lt;/a&gt; to Oracle performance data. I recommend you take a look at Dave's post because he has tried to apply Q-Q plots to some tricky SQL performance data that looks benign when plotted as a histogram, but is actually very difficult to tame. This is demonstrated when Dave's attempts to model the underlying prob dsn using Q-Q plots doesn't meet with much success. Nonetheless, his point that it's better to use Q-Q plots than to eyeball histograms, is a good one.&lt;br /&gt;
&lt;br /&gt;
Since I'm a bit of an old hand at constructing models out of data, and Dave was kind enough to provide the data for download from his blog, I decided to see what I could do with it. After a little fooling around, it struck me that there are actually &lt;b&gt;three&lt;/b&gt; separate regions in these data. &lt;i&gt;Therefore, it's a lost cause trying to model it with a single prob dsn&lt;/i&gt;. The following cluster of 4 plots shows what I came up with.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TSeRBU2S8fg/TjoPNiQAcYI/AAAAAAAAA2k/PvzJjtxkJCY/s1600/Rplot-4logs.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="400" src="http://3.bp.blogspot.com/-TSeRBU2S8fg/TjoPNiQAcYI/AAAAAAAAA2k/PvzJjtxkJCY/s400/Rplot-4logs.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The top-left plot shows a histogram of the raw data set (some 500 query times), but with one very important difference compared with what Dave did. I &lt;b&gt;ranked&lt;/b&gt; the data according to decreasing SQL elapse times. I then partitioned the data into 3 sub-regions (A, B and C). The top-right plot shows a portion of the data (region A) on double-log axes. The near linearity of those data demonstrates rather clearly that they most likely conform to a &lt;a href="http://en.wikipedia.org/wiki/Power_law"&gt;power law&lt;/a&gt; dsn. In fact, this looks like a textbook example. A power law means that the SQL queries are highly correlated in some way.&lt;br /&gt;
&lt;br /&gt;
Both plots on the bottom row (for regions B and C, respectively) also exhibit linear behavior but those data are plotted on log-linear axes, so they cannot be power law. It does suggest, however, that those queries are &lt;i&gt;exponentially&lt;/i&gt; distributed. Moreover, since these SQL query times are periods or &lt;i&gt;intervals&lt;/i&gt;, that further suggests they belong to Poisson processes with &lt;b&gt;two&lt;/b&gt; different rates. It also implies that whatever correlations are present in region A, are not present in regions B and C. &lt;br /&gt;
&lt;br /&gt;
The blue lines in the above plots are the respective regression fits (using R) for each of the proposed models.&lt;br /&gt;
&lt;br /&gt;
Now let's see what the Q-Q plots have to tell us about how well these 3 separate models do.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-f0JkikvYpCs/TjoPVJk3KsI/AAAAAAAAA2s/h-PSWqfGWDQ/s1600/Rplot-4QQ.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="400" src="http://4.bp.blogspot.com/-f0JkikvYpCs/TjoPVJk3KsI/AAAAAAAAA2s/h-PSWqfGWDQ/s400/Rplot-4QQ.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The top-left plot shows the entire data set compared with a normal dsn and, as Dave observed, it is clearly not normal (in every sense of the word). The top-right plot corresponds to the power law model and, although not a perfect diagonal line, it's better than the normal plot and I know that power laws can be notoriously difficult to model. At the very least, I think it says not to reject the power law on this data alone.&lt;br /&gt;
&lt;br /&gt;
The bottom 2 plots would seem to confirm the validity of the exponential models in their respective regions. I'll be interested to hear if there is any support for this multi-modal approach in the Oracle world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-9142502264961714028?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8bUrtWufQfJdyELA-y_FtGpJtpc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bUrtWufQfJdyELA-y_FtGpJtpc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8bUrtWufQfJdyELA-y_FtGpJtpc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bUrtWufQfJdyELA-y_FtGpJtpc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/iyOgQj19H68" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/9142502264961714028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=9142502264961714028" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/9142502264961714028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/9142502264961714028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/iyOgQj19H68/q-q-plots-for-multi-modal-performance.html" title="Q-Q Plots for Multi-modal Performance Data" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-TSeRBU2S8fg/TjoPNiQAcYI/AAAAAAAAA2k/PvzJjtxkJCY/s72-c/Rplot-4logs.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/08/q-q-plots-for-multi-modal-performance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQNRnc-eSp7ImA9WhdRFE8.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-1590647137237522269</id><published>2011-07-10T13:42:00.000-07:00</published><updated>2011-08-03T20:09:57.951-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-03T20:09:57.951-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="queueing theory" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="Erlang" /><title>The M/M/m Numbers Game</title><content type="html">In a &lt;a href="http://perfdynamics.blogspot.com/2011/06/two-heads-are-better-than-one-and-m.html"&gt;previous post&lt;/a&gt;, I explained why R&lt;sub&gt;m&lt;/sub&gt; ~ R&lt;sub&gt;1&lt;/sub&gt;/m doesn't work as an estimator of the mean residence time in an M/M/m multiserver queue: the residence time with m-servers (R&lt;sub&gt;m&lt;/sub&gt;) is &lt;b&gt;not&lt;/b&gt; m-times &lt;i&gt;smaller&lt;/i&gt; than the residence time (R&lt;sub&gt;1&lt;/sub&gt;) at a single-server (m = 1) queue. The problem is that it grossly &lt;b&gt;underestimates&lt;/b&gt; the R&lt;sub&gt;m&lt;/sub&gt; time, which is precisely the &lt;i&gt;wrong direction&lt;/i&gt; for capacity planning scenarios. That's too bad because it would be a handy Guerrilla-style formula if it did work. You could do the calculation in your head and impress everyone on your team and also do party tricks.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 206px; height: 150px;" src="http://3.bp.blogspot.com/_MPdbS9EPh5Y/SoHE2E6nLBI/AAAAAAAAAa4/iH955ogE_pE/s320/mmmAC.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368788664113900562" /&gt;M/M/m multiserver queue&lt;/center &gt;&lt;br /&gt;
Given that R&lt;sub&gt;1&lt;/sub&gt;/m is a poor estimator, you might wonder if there's a better one, and if you'd been working for Thomas Edison he would have told you: "&lt;a href="http://www.brainyquote.com/quotes/authors/t/thomas_a_edison_3.html"&gt;There is. Find it!&lt;/a&gt;" Easy for him to say. But if you did decide to take up Edison's challenge, how would you even &lt;i&gt;begin&lt;/i&gt; to search for such a thing?&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
One way to proceed in situations like this is to play around with &lt;b&gt;numbers&lt;/b&gt; and look for any interesting &lt;b&gt;patterns&lt;/b&gt; that might emerge. In that vein, we're going to play a kind of multiserver numbers game and see if it reveals anything to us about queueing times. You may be thinking that playing games is a foolish thing to do when it comes to a serious subject like  queueing theory, but believe me, even the mathematical heavies like &lt;a href="http://en.wikipedia.org/wiki/Euler"&gt;Euler&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Carl_Friedrich_Gauss"&gt;Gauss&lt;/a&gt; were not above playing numbers games just like the one I'm about to show you. And, as you may have heard, they made a lot of important discoveries that way.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;A Numbers Game&lt;/h4&gt;We know that R&lt;sub&gt;1&lt;/sub&gt;/m manifestly underestimates the R&lt;sub&gt;m&lt;/sub&gt; residence time. Another way to say that is: the estimator is too &lt;i&gt;small&lt;/i&gt; because the divisor m is too &lt;i&gt;big&lt;/i&gt;. Could we &lt;b&gt;design&lt;/b&gt; a divisor that is smaller than m? That looks like an &lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.29"&gt;idiotic question&lt;/a&gt; because &lt;b&gt;m&lt;/b&gt; is just a &lt;b&gt;number&lt;/b&gt;: the number of servers you intend to apply to service the single queue or waiting line, in order to meet the service level objective, R&lt;sub&gt;m&lt;/sub&gt;. You can choose any m but it has to be a &lt;b&gt;whole number&lt;/b&gt; (an integer). What could it possibly mean to "redesign" that number? Well, this is where thinking like a fool or a child can really work for you.&lt;br /&gt;
&lt;br /&gt;
For example, with childlike innocence I could write m = 2 as &lt;b&gt;m = 1 + 1&lt;/b&gt;. Numerically, it's the same thing. But here comes the really cute trick. I know that m = 1 + 1 is too big so, suppose I forget about what m &lt;i&gt;really&lt;/i&gt; means in the real world of CaP &amp; Perf, and replace it with something smaller, e.g., m = 1 + 1/2. That expression may look weird but it's certainly &lt;i&gt;smaller&lt;/i&gt; than m = 2. Besides, it's just a game. All "adult" evaluating should be turned off. To test out this kind of number play it's important to be systematic, so let's tabulate our results as we go along.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;The M/M/2 Game&lt;/h5&gt;For simplicity I'll assume R&lt;sub&gt;1&lt;/sub&gt; = 2 minutes per customer at a grocery checkout with 1 cashier. The exact &lt;a href="http://www.mitan.co.uk/erlang/elgcmath.htm"&gt;Erlang formula&lt;/a&gt; for m&amp;nbsp;=&amp;nbsp;2 cashiers predicts a reduced residence time of R&lt;sub&gt;2&lt;/sub&gt; = 1.33 mins. How does our new estimator stack up against the exact calculation? Here's the tabulation.&lt;br /&gt;
&lt;br /&gt;
&lt;table WIDTH="100%"  border="1"&gt;&lt;caption&gt;&lt;b&gt;Exact&lt;/b&gt; R&lt;sub&gt;2&lt;/sub&gt; = 1.33&lt;/caption&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;&lt;b&gt;Series&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Ratio&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Estimated&lt;/b&gt; R&lt;sub&gt;2&lt;/sub&gt;&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;1.00&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr  align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1/2&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1/2)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;1.33&lt;/TD&gt;     &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
The 1st column shows the numerical series we are using for m. The 2nd column shows how the series is used in the estimator (both old and new), and the 3rd column shows the numerical value of each type of estimator.&lt;br /&gt;
&lt;br /&gt;
The 2nd row corresponds to the value I used in the &lt;a href="http://perfdynamics.blogspot.com/2011/06/two-heads-are-better-than-one-and-m.html"&gt;previous post&lt;/a&gt;. In that case, we would have arrived at R&lt;sub&gt;1&lt;/sub&gt;/2&amp;nbsp;=&amp;nbsp;1 minute, which underestimates the exact value by 0.33 minutes. However, in the 3rd row, with that crazy 1/2, we are spot on. Wow!&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;The M/M/3 Game&lt;/h5&gt;Encouraged by this foolishness, let's consider the m = 3 server case. The next question we have to address is, what to chose for the third number in the series for m? If 1/2 worked as the second term for the m-series in the m = 2 case, that suggests 1/3 might be  a good choice for the third term of this m-series. See 1st column, 3rd row. In that case, the rule that seems to be emerging is: count the term in the m-series and invert that count. Since the new term is a 3rd term in the series, add 1/3. Choosing 1/3 for the third term certainly moves things in the right direction (see 3rd column, 3rd row) when compared with just using m = 3, but there's still a significant gap. Can we make the gap smaller?&lt;br /&gt;
&lt;br /&gt;
&lt;table WIDTH="100%" border="1"&gt;&lt;caption&gt;&lt;b&gt;Exact&lt;/b&gt; R&lt;sub&gt;3&lt;/sub&gt; = 1.16&lt;/caption&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;&lt;b&gt;Series&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Ratio&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Estimated&lt;/b&gt; R&lt;sub&gt;3&lt;/sub&gt;&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1 + 1&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1 + 1)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;0.67&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr  align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1/2 + 1/3&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1/2 + 1/3)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;1.09&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr  align="center"&gt;  &lt;td WIDTH="10%"&gt;1 + 1/2 + 1/4&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1/2 + 1/4)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;1.14&lt;/TD&gt;  &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
If, instead of using the &lt;i&gt;inverse&lt;/i&gt; of the term, we &lt;i&gt;halve each successive term&lt;/i&gt; then we get (1/2)/2 = 1/4 for the third term. Certainly, 1/4 is smaller than 1/3. Using 1/4 in the 4th row of the above table shows a vast improvement, although it's not spot on, like the m = 2 case. But that's fine. Let's not lose our heads in all the excitement. We are only seeking a &lt;i&gt;better estimator&lt;/i&gt;, not a wholesale replacement for the &lt;b&gt;very complex&lt;/b&gt; &lt;a href="http://www.mitan.co.uk/erlang/elgcmath.htm"&gt;Erlang formula&lt;/a&gt;. If things were that simple it would have been done 100 years ago (or earlier) and we would never have heard of &lt;a href="http://en.wikipedia.org/wiki/Agner_Krarup_Erlang"&gt;Agner Erlang&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;The M/M/4 Game&lt;/h5&gt;Let's check one more time with m = 4 servers.&lt;br /&gt;
&lt;br /&gt;
&lt;table WIDTH="100%" border="1"&gt;&lt;caption&gt;&lt;b&gt;Exact&lt;/b&gt; R&lt;sub&gt;4&lt;/sub&gt; = 1.09&lt;/caption&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;&lt;b&gt;Series&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Ratio&lt;/b&gt;&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;&lt;b&gt;Estimated&lt;/b&gt; R&lt;sub&gt;4&lt;/sub&gt;&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1 + 1 + 1&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1 + 1 + 1)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;0.50&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr  align="center"&gt;     &lt;td WIDTH="10%"&gt;1 + 1/2 + 1/3 + 1/4&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1/2 + 1/3 + 1/4)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;0.96&lt;/TD&gt;     &lt;/tr&gt;
&lt;tr  align="center"&gt;  &lt;td WIDTH="10%"&gt;1 + 1/2 + 1/4 + 1/8&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;2/(1 + 1/2 + 1/4 + 1/8)&lt;/TD&gt;      &lt;td WIDTH="10%"&gt;1.07&lt;/TD&gt;  &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
Once again, we see in the 4th row that the &lt;b&gt;halving rule&lt;/b&gt; seems to work best. In fact, it will work for any arbitrary value of m.&lt;br /&gt;
&lt;br /&gt;
What about other R&lt;sub&gt;1&lt;/sub&gt; values besides 2 minutes&amp;mdash;the numerator in the middle column? Unfortunately, the answer there is negatory. The halving rule only works for R&lt;sub&gt;1&lt;/sub&gt; = 2 minutes. Any other value and the ratio will give incorrect results. Oh oh!&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;The General Game&lt;/h4&gt;What's gone wrong? Nothing has gone wrong, I just chose a &lt;b&gt;special&lt;/b&gt; case for the M/M/1 residence time in order to reveal particular number patterns. If we played around with other values of R&lt;sub&gt;1&lt;/sub&gt;, we'd eventually find the &lt;i&gt;general rule&lt;/i&gt;, but it helps to know what you're doing. Since I've already done all that, I'll just tell you the result. Or, feel free to keep playing the game and come back later to read the rest of this post.&lt;br /&gt;
&lt;br /&gt;
In the above tables I used R&lt;sub&gt;1&lt;/sub&gt; = 2 minutes, and that choice contains two assumptions which I deliberately didn't tell you about. I assumed something about the service time (S) and the arrival rate (&amp;lambda;). The server utilization is given by &amp;rho; = &amp;lambda;S from &lt;a href="http://perfdynamics.blogspot.com/2011/07/littles-lore.html"&gt;Little's law&lt;/a&gt;. The halving rule has emerged because I have been assuming a server utilization of &amp;rho;&amp;nbsp;=&amp;nbsp;0.5 or, written as a &lt;b&gt;fraction&lt;/b&gt;, &amp;rho;&amp;nbsp;=&amp;nbsp;1/2. That's where the 1/2 came from and it made the fractional series progressions &lt;b&gt;more intuitive&lt;/b&gt; but, at the same time, more restricted in applicability.&lt;br /&gt;
&lt;br /&gt;
If I had chosen some arbitrary utilization value, then the corresponding fractions in the series would have looked ugly and their progression would have been obscured. Not to worry because I can already see how to generalize those nice simple number patterns to form a &lt;b&gt;general rule&lt;/b&gt;. But before I explain that, a few remarks.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I didn't choose R&lt;sub&gt;1&lt;/sub&gt; = 2 minutes or &amp;rho;&amp;nbsp;=&amp;nbsp;1/2 to trick you. It's actually the sanest thing to do when you're fooling around and not sure of the outcome. Always choose numbers where the patterns will be most obvious and can also be checked in some way. When acting the fool, there's plenty of room to screw up.&lt;/li&gt;
&lt;li&gt;Because this is often a point of confusion, I should clarify that I'm comparing all M/M/m servers operating at the same &amp;rho; value. That means the arriving traffic has already been adjusted in each configuration to make &amp;rho; the same. Even though this may not be how things are done in practice, it is the appropriate assumption for the comparisons being made here. Looking at the diagram of the M/M/m queue (top) you can see that the traffic gets split m-ways. If nothing else is done, then the utilization of the servers will fall with each additional server. Therefore, in order to keep things &lt;a href="http://www.foxnews.com/"&gt;fair and balanced&lt;/a&gt; for comparison, the total traffic arriving into the system has to be increased in proportion to the number of m servers. Since we're not using &amp;lambda; explicitly in the tables, this step is hidden in the value of &amp;rho;.&lt;/li&gt;
&lt;li&gt;Moreover, for M/M/1, I have the rule-of-thumb that if the server utilization is 50%, then the residence time will be 2 service periods or R&lt;sub&gt;1&lt;/sub&gt; = 2, no matter the actual service time or the actual arrival rate.&lt;/li&gt;
&lt;/ul&gt;Returning to the business of generalizing the halving rule, the series in the first column has to be expressed in terms of the utilization &amp;rho; (whatever that value happens to be), not a fixed value like 1/2. The generalization of the series in the above tables now becomes:&lt;br /&gt;
&lt;center&gt;&lt;br /&gt;
1 + &amp;rho; + &amp;rho;&lt;sup&gt;2&lt;/sup&gt; + &amp;rho;&lt;sup&gt;3&lt;/sup&gt; + ... + &amp;rho;&lt;sup&gt;m&lt;/sup&gt;&lt;br /&gt;
&lt;/center&gt;&lt;br /&gt;
and the corresponding estimator (second column) becomes&lt;br /&gt;
&lt;center&gt;&lt;br /&gt;
R&lt;sub&gt;1&lt;/sub&gt; / (1 + &amp;rho; + &amp;rho;&lt;sup&gt;2&lt;/sup&gt; + &amp;rho;&lt;sup&gt;3&lt;/sup&gt; + ... + &amp;rho;&lt;sup&gt;m&lt;/sup&gt;)&lt;br /&gt;
&lt;/center&gt;&lt;br /&gt;
So, instead of multiplying by 1/2 to get each successive term in the series, we multiply each successive term by the utilization &amp;rho; to produce: 1 + &amp;rho; + (&amp;rho; &amp;times; &amp;rho;) + (&amp;rho; &amp;times; &amp;rho;) &amp;times; &amp;rho; + ... and so on, up to m terms. The series always starts with a zeroth term of 1 because &amp;rho;&lt;sup&gt;0&lt;/sup&gt; = 1. I deliberately chose &amp;rho; = 1/2 in the above tables to make the numeric patterns obvious. If you substitute that special value into this &lt;i&gt;general rule&lt;/i&gt;, you'll see that it is consistent with the tabulated results. &lt;br /&gt;
&lt;br /&gt;
This generalized estimator will always be superior to the naive estimator R&lt;sub&gt;1&lt;/sub&gt;/m. Try it, you'll like it.&lt;br /&gt;
&lt;br /&gt;
Finally, I should note that although I started out looking for a way to express a reduced m-divisor, e.g., I wrote m = 1 + 1/2 + 1/4, the ultimate series in &amp;rho; does not represent m, per se. It's formally some other function&amp;mdash;I call it the &lt;b&gt;"morphing function"&lt;/b&gt; but that's whole 'nother story. However, if all m servers are running full tilt at 100% busy (and ignoring unbounded queueing effects), the &amp;rho;-series above becomes 1 + 1 + ... + 1, up to m terms because 1 raised to any power is still 1. In that way we do get back to my starting point, which was to "foolishly" write: m&amp;nbsp;=&amp;nbsp;1 + 1 + ... + 1.&lt;br /&gt;
&lt;br /&gt;
What's interesting for me is that although I already knew this result (see Section 2.7 of my &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;Perl::PDQ book&lt;/a&gt;), I derived it using calculus techniques and the &lt;a href="http://en.wikipedia.org/wiki/Geometric_series"&gt;finite geometric series&lt;/a&gt; rather than numerically, as I've done here. This numerical approach arose out of some very interesting student remarks and questions during the May 2011 &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Guerrilla classes&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Your next opportunity to help me learn new things will be the upcoming &lt;a href="http://www.perfdynamics.com/Classes/Outlines/gdata.html"&gt;GDAT class&lt;/a&gt; in August.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-1590647137237522269?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T_AlYdJ4lov9BKPa3tqsa9jefsI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_AlYdJ4lov9BKPa3tqsa9jefsI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/T_AlYdJ4lov9BKPa3tqsa9jefsI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_AlYdJ4lov9BKPa3tqsa9jefsI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/3buz1s30KP0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/1590647137237522269/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=1590647137237522269" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/1590647137237522269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/1590647137237522269?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/3buz1s30KP0/mmm-numbers-game.html" title="The M/M/m Numbers Game" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_MPdbS9EPh5Y/SoHE2E6nLBI/AAAAAAAAAa4/iH955ogE_pE/s72-c/mmmAC.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/07/mmm-numbers-game.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YHSX44cCp7ImA9WhdTE04.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-5181407519496730718</id><published>2011-07-02T17:40:00.000-07:00</published><updated>2011-07-10T13:52:18.038-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T13:52:18.038-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Little's law" /><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="queueing theory" /><title>Little's Lore</title><content type="html">Guerrilla alumnus Paul P. has a penchant for sending me interesting things, and recently he sent me a piece on &lt;a href="http://en.wikipedia.org/wiki/Little's_law"&gt;Little's law&lt;/a&gt;. Remarkably, it wasn't just another proof of L = &amp;lambda;W, but a brief retrospective written by none other than John Little himself. I quote it here because it not only provides some unusual insight into how these things get done, but it is written in a charming and self-effacing style.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WL1xWELDjpk/Tg-xufLj6TI/AAAAAAAAA1s/RbTznQPLyOc/s1600/little.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="200" width="197" src="http://2.bp.blogspot.com/-WL1xWELDjpk/Tg-xufLj6TI/AAAAAAAAA1s/RbTznQPLyOc/s200/little.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;font face="Georgia"&gt;How did a sensible young PhD like me get involved in a crazy field like this? From 1957-1962, I taught operations research at the Case Institute of Technology in Cleveland (now Case Western Reserve University). I was asked to teach a course on queuing. OK. Initially I used my own notes, but when Morse (1958) came out, I used his book extensively. Queuing was taken by most of the OR graduate students and, indeed, one of these, Ron Wolff, went on to become a first class queuing theorist (Wolff 1989). One year we were at the point when we had done the basic Poisson-exponential queue and moved through multi-server queues, and some other general cases. I remarked, as many before and after me probably have (and Morse does), that the often reappearing formula L = &amp;lambda;W &lt;sup&gt;&amp;dagger;&lt;/sup&gt;seemed very general. In addition I gave the heuristic proof.&lt;sup&gt;&amp;Dagger;&lt;/sup&gt; After class I was talking to a number of students and one of them (Sid Hess) asked, "How hard would it be to prove it in general?" On the spur of the moment, I obligingly said, "I guess it shouldn't be too hard." Famous last words. Sid replied, "Then you should do it!"&lt;br /&gt;
&lt;br /&gt;
The remark stuck in my mind and I started to think about the question from time to time. Clearly there was something fundamental going on, since, when you draw the picture you do not really seem to need any detailed assumptions about interarrival times, service times, number of servers, order of service, and all the other ingredients that go into the panoply of queuing models. You only seemed to need a process that goes up and down in unit amounts and some guarantee of steady state and conservation of items. In addition, because I could see there were end effects in the picture, there needed to be a way to get rid of them in the limit. It seemed to me I was in the general arena of stationary stochastic processes. I am not a mathematician by training, and so I bought copies of measure theoretic stochastic process books like &lt;a href="http://books.google.com/books/about/Stochastic_processes.html?id=_GeYPwAACAAJ"&gt;Doob (1953)&lt;/a&gt;, which mentioned stationary processes and ergodic theorems.&lt;br /&gt;
&lt;br /&gt;
My family's habit at the time was to go to Nantucket in the summer where my wife's family had a small summer house. We would load our children in a station wagon, drive to Woods Hole, take the ferry, and spend a couple months away from the world. Since the beach was the baby-sitter, I was able to split off solid blocks of time to work on research as a good assistant professor should. (I wish I could do that today!) I always brought a pile of books and projects with me. L&amp;nbsp;=&amp;nbsp;&amp;lambda;W was one of them. I soon ran into problems that required more than looking up theorems in my new books, but I worked out approaches to the road blocks and eventually wrote everything up, giving it my best shot. I sent the paper off to &lt;a href="http://or.journal.informs.org/current.dtl"&gt;Operations Research&lt;/a&gt;. It was accepted on the first round.&lt;/font&gt;&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
[Source: D. Chhajed and T. J. Lowe (eds.) &lt;a href="http://www.amazon.com/Building-Intuition-Operations-Management-International/dp/0387736980"&gt;Building Intuition: Insights From Basic Operations Management Models and Principles.&lt;/a&gt; &amp;copy; Springer, 2008]&lt;/blockquote&gt;&lt;hr&gt;&amp;dagger; &lt;small&gt;In my &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;usual notation&lt;/a&gt;, I write Q = &amp;lambda;R where Q is the queue length (including requests in service) and R is the residence time: R = W + S, the sum of the time spent waiting for service and the service time. In the above, W is also the waiting time and therefore L is the waiting-line length or the queue length that doesn't include requests in service.&lt;/small&gt;&lt;br /&gt;
&amp;Dagger; &lt;small&gt;Same as the visual proof in Chapter 2 of &lt;a href="http://"&gt;Perl::PDQ&lt;/a&gt;&lt;/small&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-5181407519496730718?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YroAw3AT4cEht3VmN0RVfEPesOQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YroAw3AT4cEht3VmN0RVfEPesOQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YroAw3AT4cEht3VmN0RVfEPesOQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YroAw3AT4cEht3VmN0RVfEPesOQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/YNevO6Hl2ZE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/5181407519496730718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=5181407519496730718" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5181407519496730718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5181407519496730718?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/YNevO6Hl2ZE/littles-lore.html" title="Little's Lore" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-WL1xWELDjpk/Tg-xufLj6TI/AAAAAAAAA1s/RbTznQPLyOc/s72-c/little.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/07/littles-lore.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUBSHw6eSp7ImA9WhZaEkU.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3671041906783520223</id><published>2011-06-28T10:11:00.000-07:00</published><updated>2011-06-28T11:37:39.211-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-28T11:37:39.211-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="load average" /><category scheme="http://www.blogger.com/atom/ns#" term="instrumentation" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="MacOS X" /><category scheme="http://www.blogger.com/atom/ns#" term="Solaris" /><title>The Backstory on Time-Share Computing</title><content type="html">In chapter 4 of my &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;Perl::PDQ book&lt;/a&gt;, "Linux Load Average&amp;mdash;Take a Load Off" and Appendix B "A Short History of Buffers," I briefly refer to the history of &lt;b&gt;Unix&lt;/b&gt; and ultimately &lt;b&gt;Linux&lt;/b&gt; via &lt;b&gt;Multics&lt;/b&gt;, starting with the original MIT project called &lt;b&gt;CTSS&lt;/b&gt; (Compatible Time-sharing System). My purpose there was to point out that the &lt;a href="http://perfdynamics.blogspot.com/2007/04/how-long-should-queue-be.html"&gt;load average metric&lt;/a&gt; is the earliest example of O/S performance instrumentation. Naturally then, the following 5-part series in the NYT on the development of &lt;a href="http://en.wikipedia.org/wiki/Time-sharing"&gt;time-share&lt;/a&gt; computers caught my attention: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt; &lt;a href="http://opinionator.blogs.nytimes.com/2011/06/19/did-my-brother-invent-e-mail-with-tom-van-vleck-part-one/"&gt;Part one&lt;/a&gt;&lt;br /&gt;
&lt;li&gt; &lt;a href="http://opinionator.blogs.nytimes.com/2011/06/20/did-my-brother-invent-e-mail-with-tom-van-vleck-part-two/"&gt;Part two&lt;/a&gt;&lt;br /&gt;
&lt;li&gt; &lt;a href="http://opinionator.blogs.nytimes.com/2011/06/21/did-my-brother-invent-e-mail-with-tom-van-vleck-part-three/"&gt;Part three&lt;/a&gt;&lt;br /&gt;
&lt;li&gt; &lt;a href="http://opinionator.blogs.nytimes.com/2011/06/22/did-my-brother-invent-e-mail-with-tom-van-vleck-part-four/"&gt;Part four&lt;/a&gt;&lt;br /&gt;
&lt;li&gt; &lt;a href="http://opinionator.blogs.nytimes.com/2011/06/23/did-my-brother-invent-e-mail-with-tom-van-vleck-part-five/"&gt;Part five&lt;/a&gt;&lt;br /&gt;
&lt;/ul&gt;These accounts are noteworthy because they are written by the brother of one of the developers (of early email&amp;mdash;depending on how you define &lt;b&gt;email&lt;/b&gt;) and the author is a journalist, so he interviewed some of the personalities (who are now getting on a bit).&lt;br /&gt;
&lt;br /&gt;
There are also lots of fascinating photos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3671041906783520223?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IzrUajt7MfiGya_mbjcXTsQozn8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IzrUajt7MfiGya_mbjcXTsQozn8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IzrUajt7MfiGya_mbjcXTsQozn8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IzrUajt7MfiGya_mbjcXTsQozn8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/M6U3BEQO2sY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3671041906783520223/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3671041906783520223" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3671041906783520223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3671041906783520223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/M6U3BEQO2sY/backstory-on-time-share-computing.html" title="The Backstory on Time-Share Computing" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/06/backstory-on-time-share-computing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMERXw6eyp7ImA9WhRUFU8.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-8078899860850428688</id><published>2011-06-27T00:01:00.000-07:00</published><updated>2012-01-25T13:20:04.213-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T13:20:04.213-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>A Winking Pink Elephant</title><content type="html">The title of chapter 5 in my &lt;a href="http://www.perfdynamics.com/iBook/gcap.html"&gt;Guerrilla Capacity Planning&lt;/a&gt; book is, "Evaluating Scalability Parameters," and underneath it you'll see this quote:&lt;br /&gt;
&lt;blockquote&gt;&lt;em&gt;"With four parameters I can fit an elephant. With five I can make his trunk wiggle.&lt;/em&gt; &amp;mdash;John von Nemann&lt;/blockquote&gt;In that vein, Guerrilla alumnus Stephen O'C. pointed me at a recent &lt;a href="http://www.johndcook.com/blog/2011/06/21/how-to-fit-an-elephant/"&gt;blog post&lt;/a&gt; and &lt;a href="http://java-srv1.mpi-cbg.de/publications/getDocument.html?id=ff8080812daff75c012dc1b7bc10000c"&gt;paper&lt;/a&gt; (PDF) that draws an elephantine curve using just 4 fitting coefficients or parameters. Stephen also sent me his translation of the Python code into R. Previous efforts apparently had required some 30 parameters. The secret to the success of this latest example is plotting the elephant in the complex plane by summing certain Fourier modes. That's all very cool but I was surprised to see that the output was static (no wiggles), even though 5 parameters are defined. That shortcoming, however, provided me with the impetus to try out R's animation package and here's the result. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7LUeDjlyHik/TgYPpUA1XBI/AAAAAAAAA1M/BDp7r64ybY4/s1600/movie.gif" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="300" src="http://3.bp.blogspot.com/-7LUeDjlyHik/TgYPpUA1XBI/AAAAAAAAA1M/BDp7r64ybY4/s400/movie.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Notice that my elephant not only &lt;b&gt;wiggles&lt;/b&gt; his trunk but he also &lt;b&gt;winks&lt;/b&gt;&amp;mdash;&lt;i&gt;a wiggling winking pink elephant.&lt;/i&gt; Actually, I think he looks more like a winking &lt;a href="http://upload.wikimedia.org/wikipedia/commons/3/3e/Combarelles-mammouth.jpg"&gt;woolly  mammoth&lt;/a&gt;. :)&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Since I also know a thing or two about &lt;a href="http://en.wikipedia.org/wiki/Complex_number"&gt;complex numbers&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Fourier_transform"&gt;Fourier transforms&lt;/a&gt;, I found the Python code a bit obtuse but I didn't want to spend a lot of time rewriting it. Instead, I just looked for opportunities to:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; use the R animation package&lt;br /&gt;
&lt;li&gt; reorganize the code&lt;br /&gt;
&lt;li&gt; use R constructs such as &lt;a href="http://stat.ethz.ch/R-manual/R-patched/library/base/html/lapply.html"&gt;lapply or sapply&lt;/a&gt; instead of loops&lt;br /&gt;
&lt;li&gt; use the &lt;a href="http://ugrad.stat.ubc.ca/R/library/stats/html/fft.html"&gt;fft&lt;/a&gt; (fast fourier transform) function in R &lt;br /&gt;
&lt;/ul&gt;and that's what I discuss in the remainder of this post. First, let's consider a little bit about how this thing works. &lt;p&gt;The resulting shape (and wiggling) of this elephant is controlled by a set of 5 (complex) parameters and their rotated complement. That's actually 20 numbers, but who's counting?  &lt;pre class="source-code"&gt;&lt;code&gt;
require(MASS)
library(animation)

mkmovie = TRUE  #guarantees some form of output

param &lt;- c(50-30i,18+8i,12-10i,-14-60i,1+20i)
parar &lt;- param * exp(1i*pi/2)  #rotate by 90 degrees
&lt;/code&gt;&lt;/pre&gt;If we apply each of the first 4 parameters in succession, the results look like this. &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hWkFzaW6b8I/TgdjpGGPCcI/AAAAAAAAA1c/U-5YWCqOdU8/s1600/Rplot-params.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="270" width="320" src="http://1.bp.blogspot.com/-hWkFzaW6b8I/TgdjpGGPCcI/AAAAAAAAA1c/U-5YWCqOdU8/s320/Rplot-params.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The first parameter produces an ellipse, the second makes a dent in the ellipse, while all 4 parameters together produce the base elephant shape. Roughly speaking, each parameter (p) produces p + 1 lobes in the 2D figure ... or are they limbs? The following R function assigns the parameters to the Fourier coefficients (Cx and Cy) to draw "pinky" the elephant. &lt;pre class="source-code"&gt;&lt;code&gt;
pinky &lt;- function() {
 Cx &lt;- as.complex(rep(0,length(param)))
 Cy &lt;- as.complex(rep(0,length(param))) 
 tv &lt;- seq(0,2*pi,length=1000)

 for (i in 1:2) { #movie frames
  Cx[1] &lt;- parar[1] + Im(param[1])
  Cx[2] &lt;- parar[2] + Im(param[2])
  Cx[3] &lt;- Re(param[3])
  Cx[4] &lt;- Re(param[5]) - (i-1)
  Cx[5] &lt;- Re(param[4])
  
  Cy[1] &lt;- param[1] - Re(param[1]) + Im(param[4])
  Cy[2] &lt;- param[2] - Re(param[2])
  Cy[3] &lt;- param[3] - Re(param[3])
  
  x &lt;- c(fourier(tv, Cx))
  y &lt;- c(fourier(tv, Cy))
  
  plot(y, -x, type="l", col='red', lwd=10, axes=FALSE, ylab='', xlab='')
  lines(y, -x, type="l", col='pink', lwd=4)
  if (i &gt; 1) points(Im(param[5]), Im(param[5]), col='black', pch=126, cex=2)
     else points(Im(param[5]), Im(param[5]), col='black', pch=20, cex=2)
  }
}
&lt;/code&gt;&lt;/pre&gt;Other combinations of these parameters can produce such things as &lt;a href="http://en.wikipedia.org/wiki/Lissajous_curve#Examples"&gt;Lissajous&lt;/a&gt; figures, just like I used to make on my father's oscilloscope (when he wasn't using it to fix our TV). I also grew up seeing another Lissajous figure: the logo of the &lt;a href="http://www.abc.net.au/tv/"&gt;Australian Broadcasting Corporation&lt;/a&gt;. &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3228BJiMuVQ/TgbK149ZoDI/AAAAAAAAA1U/0DxUuwGixoE/s1600/Rplot-liss8.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="120" width="140" src="http://1.bp.blogspot.com/-3228BJiMuVQ/TgbK149ZoDI/AAAAAAAAA1U/0DxUuwGixoE/s200/Rplot-liss8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The vectors Cx and Cy are used in the &lt;a href="http://en.wikipedia.org/wiki/Fourier_series#Example_1:_a_simple_Fourier_series"&gt;Fourier summation&lt;/a&gt;, which I've written as a recursive function. &lt;pre class="source-code"&gt;&lt;code&gt;
fourier &lt;- function(tt,cc) {
 wt &lt;- rep(0, length(tt)) 
 fsum &lt;- function(n) {
   if (n &gt; 0) wt &lt;- wt + fsum(n-1) + Re(cc[n]) * cos(n*tt) + Im(cc[n]) * sin(n*tt)
   return(wt)
 }
 fsum(length(cc))
}
&lt;/code&gt;&lt;/pre&gt;This tells me immediately that there's no point using &lt;i&gt;fft&lt;/i&gt; in R because there, the purpose is to determine the parameter values (as &lt;b&gt;outputs&lt;/b&gt;) that produce a given periodic function. Here, the parameter values are being chosen deliberately as &lt;b&gt;inputs&lt;/b&gt; to draw a function that resembles an elephant. That's also antithetical to von Neumann's statement but let's not get too pedentic.&lt;p&gt;I also tried to find a way to use &lt;i&gt;lapply&lt;/i&gt; directly but I ran into a conflict between the size of the tt (time) vector versus the number of summation terms. In any event, I was quickly facing the prospect of writing some additional functions for &lt;i&gt;lapply&lt;/i&gt; and it all started to feel like I was overloading its intent. Worse yet, I would also have ended up with more code than the original for-loop. Ultimately, I just replaced it with the recursive routine above and declared victory. &lt;p&gt;Finally, the two frames from the &lt;i&gt;pinky&lt;/i&gt; function can be output optionally as an animated GIF, such as I've used here, or as two static plots in the standard R graphics window.  &lt;pre class="source-code"&gt;&lt;code&gt;
if (mkmovie) {
 aopt = ani.options(interval = 0, nmax = 2)
 saveMovie(pinky(), interval = 0.25, outdir = getwd(), width = 400, height = 400)
 ani.options(aopt)
} else pinky()
&lt;/code&gt;&lt;/pre&gt;Who knew that elephants could be so mathematically interesting. Animation is also a powerful tool for &lt;a href="http://groups.google.com/group/perfviz?hl=en&amp;pli=1"&gt;performance data visualization&lt;/a&gt; and I'll say more about that in the upcoming &lt;a href="http://perfdynamics.blogspot.com/2011/05/go-guerrill-r-on-your-data.html"&gt;GDAT class&lt;/a&gt;. &lt;p&gt;Thanks, Stephen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-8078899860850428688?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LFP6Li9puKToF5fWianGR2alTK0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LFP6Li9puKToF5fWianGR2alTK0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LFP6Li9puKToF5fWianGR2alTK0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LFP6Li9puKToF5fWianGR2alTK0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/VK0SeCYdUaU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/8078899860850428688/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=8078899860850428688" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/8078899860850428688?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/8078899860850428688?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/VK0SeCYdUaU/winking-pink-elephant.html" title="A Winking Pink Elephant" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7LUeDjlyHik/TgYPpUA1XBI/AAAAAAAAA1M/BDp7r64ybY4/s72-c/movie.gif" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/06/winking-pink-elephant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBSHsycSp7ImA9WhZbGEs.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-6989739417613647193</id><published>2011-06-22T22:09:00.000-07:00</published><updated>2011-06-23T15:47:39.599-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-23T15:47:39.599-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>Bit.ly Kung Fooz Itself</title><content type="html">You know Bit Ly? &lt;a href="http://en.wikipedia.org/wiki/Bruce_Lee"&gt;Bruce Lee's&lt;/a&gt; distant cousin.&lt;br /&gt;
&lt;br /&gt;
I love Twitter, but it's not for everybody and I can understand why some people don't get it or don't like it. One of the things I like is how the 140 char limit forces you to compose your tweet more carefully than you would in email or a blog. Tweeted URL links are counted as chars, so they can become a problem. Whether you use Twitter or not, there are occasions when you would like to replace some cosmologically long URL, like this &lt;tt&gt;  http://maps.google.com/maps?q=27%C2%B09%E2%80%B236.73%E2%80%B3S+70%C2%B029%E2%80%B248.4%E2%80%B3W+&amp;hl=en&amp;ie=UTF8&amp;ll=-27.268058,-70.423737&amp;spn=0.330804,0.558929&amp;sll=37.0625,-95.677068&amp;sspn=37.819897,72.158203&amp;t=h&amp;z=11&lt;/tt&gt; with this &lt;tt&gt;&lt;a href="http://j.mp/dmYEHy"&gt;&lt;b&gt;http://j.mp/dmYEHy&lt;/b&gt;&lt;/a&gt;&lt;/tt&gt;. That's where URL shorteners come in and there are many &lt;a href="http://allyouneedislists.com/technology/internet/10-best-and-shortest-url-shorteners/"&gt;shortening services&lt;/a&gt; out there.&lt;br /&gt;
&lt;br /&gt;
Until very recently, I had settled on using j.mp exclusively for Twitter because it was the first service I became aware of that produced the shortest URLs without going to &lt;a href="http://en.wikipedia.org/wiki/URL_shortening#Techniques"&gt;unicode&lt;/a&gt;. j.mp is owned by bit.ly. With the recent advent of Twitter auto-shortening, bit.ly seems to be scrambling to keep users and in that process I suddenly noticed j.mp was now being redirected to bit.ly, which is not as short.&lt;br /&gt;
&lt;br /&gt;
Moreover, j.mp was taking much more time to process a URL due to the growing JS eye-candy on their web page, not to mention "processing" your data. I can really see this with my web client bloat-detector: a 1 GHz &lt;a href="http://en.wikipedia.org/wiki/Power_Mac_G4#DDR_models"&gt;Power Mac G4&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Finally, I decided to give bit.ly the chop in favor of goo.gl. Here's why:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Not as short as j.mp but generally shorter than Tweeter's auto-shortner&lt;br /&gt;
&lt;li&gt; Tweeter auto-shortner can leave fairly explicit URL fragments&lt;br /&gt;
&lt;li&gt; Sometimes I don't want to divert attention with the longer Twitter URL string&lt;br /&gt;
&lt;li&gt; It has much lower JS overhead (Goog KISSes it) which makes for faster translation&lt;br /&gt;
&lt;li&gt; Goog doesn't need to riffle my wallet for this service&lt;br /&gt;
&lt;li&gt; Goog was tracking my data anyway :/&lt;br /&gt;
&lt;/ul&gt;So, &lt;a href="http://resources.echineselearning.com/dailybrief/dailybrief-chinese-1391.html"&gt;再见 (zàijiàn)&lt;/a&gt; bit.ly ... &lt;a href="http://www.youtube.com/watch?v=BwBKjK7Xik0"&gt;fast as lightning&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-6989739417613647193?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aG_t9y5OzjGvctQ40Q_dYL1rpbo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aG_t9y5OzjGvctQ40Q_dYL1rpbo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aG_t9y5OzjGvctQ40Q_dYL1rpbo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aG_t9y5OzjGvctQ40Q_dYL1rpbo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/R1E3MCZqV0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/6989739417613647193/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=6989739417613647193" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6989739417613647193?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6989739417613647193?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/R1E3MCZqV0E/bit-ly-kung-fooz-itself.html" title="Bit.ly Kung Fooz Itself" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/06/bit-ly-kung-fooz-itself.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBQnY6eSp7ImA9WhZbFk4.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-3318512457499280153</id><published>2011-06-20T09:10:00.000-07:00</published><updated>2011-06-20T23:05:53.811-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T23:05:53.811-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="queueing theory" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><title>Bye Bye Mr. Bar Code</title><content type="html">Last week, there was a &lt;a href="http://www.nytimes.com/2011/06/16/business/16haberman.html"&gt;New York Times obituary&lt;/a&gt; for Alan Haberman, he being the person who ushered in the &lt;a href="http://en.wikipedia.org/wiki/Barcode"&gt;barcode&lt;/a&gt;. Notice that's &lt;i&gt;usher&lt;/i&gt; and not &lt;b&gt;invent&lt;/b&gt;. That distinction goes to Norman Woodland and Bernard Silver, two graduate students at the Drexel Institute of Technology (now &lt;a href="http://en.wikipedia.org/wiki/Drexel_University"&gt;Drexel University&lt;/a&gt;), and was based&amp;mdash;perhaps not surprisingly&amp;mdash;on &lt;a href="http://"&gt;Morse code&lt;/a&gt;, which is now defunct.&lt;br /&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;img border="0" height="112" width="400" src="http://2.bp.blogspot.com/-CvT-6gylmWk/Tf9qNwxZXqI/AAAAAAAAA1E/pVcypwoiZw4/s400/groxppdq.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
Queueing at a grocery checkout [Source: &lt;a href="http://www.perfdynamics.com/iBook/ppa_new.html"&gt;Perl PDQ 2nd edn&lt;/a&gt;]&lt;/center&gt;&lt;br /&gt;
The bar code was an effort to modernize the grocery industry, which dates back to the 1940s. Woodland and Silver received a patent in 1952, but because scanning technology was rather poor at that time, their invention went largely unused. And that's where Alan Haberman comes in because he championed its adoption in actual retail stores. The first product to be purchased using a barcode, chewing gum no less, took place in 1974 at &lt;a href="http://www.marsh.net/"&gt;Marsh Supermarket&lt;/a&gt; in Troy, Ohio,&lt;br /&gt;
&lt;br /&gt;
All of which brings me to the point of this post. Not only do I tend to use the grocery store as a familiar &lt;a href="http://perfdynamics.blogspot.com/2011/06/two-heads-are-better-than-one-and-m.html"&gt;example of queueing effects&lt;/a&gt;, both in my Guerrilla CaP classes and my Perl::PDQ book, but Jim Holtman, one of our &lt;a href="http://www.perfdynamics.com/Classes/Outlines/gdata.html"&gt;GDAT instructors&lt;/a&gt;, is currently doing data analysis and simulations for &lt;a href="http://www.kroger.com/"&gt;Kroger Supermarket&lt;/a&gt; in Cincinnati, Ohio. What is it with Ohio and grocery stores?&lt;br /&gt;
&lt;br /&gt;
What started with barcodes, continues today with the application of RFID, motion capture, shelf  optimization and so forth. And all these performance improvements rely on analyzing big data sets. No doubt, Jim will recount some of this in the &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;upcoming GDAT class&lt;/a&gt;. You could do worse than &lt;a href="http://www.perfdynamics.com/rego.html"&gt;be there&lt;/a&gt; for that. You can even bring your own data to be scanned and we'll check it out for you. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-3318512457499280153?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tB5Kxlfc893_D_2G2EuteB6D1XY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tB5Kxlfc893_D_2G2EuteB6D1XY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tB5Kxlfc893_D_2G2EuteB6D1XY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tB5Kxlfc893_D_2G2EuteB6D1XY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/r-f82Y9U7hU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/3318512457499280153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=3318512457499280153" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3318512457499280153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/3318512457499280153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/r-f82Y9U7hU/bye-bye-mr-bar-code.html" title="Bye Bye Mr. Bar Code" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-CvT-6gylmWk/Tf9qNwxZXqI/AAAAAAAAA1E/pVcypwoiZw4/s72-c/groxppdq.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/06/bye-bye-mr-bar-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QHRH0_fyp7ImA9WhZbFUQ.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-6847040396450452468</id><published>2011-06-14T00:01:00.000-07:00</published><updated>2011-06-20T10:35:35.347-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T10:35:35.347-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="queueing theory" /><category scheme="http://www.blogger.com/atom/ns#" term="Mathematica" /><title>Two Heads Are Better Than One ... And m</title><content type="html">In the &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;GCaP class&lt;/a&gt;, one of the homework exercises refers to a grocery store checkout where the customer arrival rate is 1 customer every 2 minutes and the mean service time for the cashier to ring up groceries is 1.5 minutes. The first question is: What is the mean residence time for each customer? &lt;br /&gt;
&lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iocmOnBeP0I/TfbY7hodDhI/AAAAAAAAA08/1jRLqPVC_ns/s1600/Mark_Wing-Davey_as_Zaphod_Beeblebrox.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="160" width="200" src="http://4.bp.blogspot.com/-iocmOnBeP0I/TfbY7hodDhI/AAAAAAAAA08/1jRLqPVC_ns/s400/Mark_Wing-Davey_as_Zaphod_Beeblebrox.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
From Little's law, the utilization of the cashier is &amp;rho; = &amp;lambda; S = 0.5 &amp;times; 1.5 = 0.75 or 75%. The residence time is given by R&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;=&amp;nbsp;S/(1 &amp;minus; &amp;rho;) = 6.0 minutes.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;A later question asks what happens if another cashier is employed to service the same aisle under the condition that the amount of traffic in the store is also doubled? In other words, the same waiting line now has 2 servers but the arrival rate into that waiting line has also increased by a factor of 2. The result is R&lt;sub&gt;2&lt;/sub&gt; = S/(1 &amp;minus; &amp;rho;&lt;sup&gt;2&lt;/sup&gt;) = 3.4286 minutes.&lt;br /&gt;
&lt;p&gt;This result is surprising on several levels:&lt;ol&gt;&lt;li&gt; You'd expect that adding more capacity (2 servers) with the &lt;b&gt;same&lt;/b&gt; arrival rate would produce a better residence time than for a single server. And it does. In that case, R&lt;sub&gt;2&lt;/sub&gt; = 1.7455 minutes, which is smaller by better than a factor of 3.&lt;/li&gt;
&lt;li&gt; Even with &lt;b&gt;double&lt;/b&gt; the store traffic, the residence time per customer is better than the single cashier time (R&lt;sub&gt;1&lt;/sub&gt;) by almost a factor of 2. That is remarkable and unintuitive.&lt;/li&gt;
&lt;li&gt; Is there a rule of thumb (RoT) here? Something like R&lt;sub&gt;2&lt;/sub&gt; &amp;asymp; R&lt;sub&gt;1&lt;/sub&gt;/2.&lt;br /&gt;
&lt;li&gt; And if that's true, can we generalize it to arbitrary m servers: R&lt;sub&gt;m&lt;/sub&gt; &amp;asymp; R&lt;sub&gt;1&lt;/sub&gt;/m?&lt;/li&gt;&lt;/ol&gt;These questions came up in the &lt;a href="http://perfdynamics.blogspot.com/2011/05/may-2011-guerrilla-classes-light-bulb.html"&gt;most recent GCaP class&lt;/a&gt;. &lt;p&gt;The answer to (3) is a qualified &lt;i&gt;yes&lt;/i&gt;. It's like the old adage: two heads are better than one or, in this case, two cashiers. The answer to (4), however, is an unqualified &lt;i&gt;no&lt;/i&gt;. The same RoT with m heads (or cashiers) is &lt;i&gt;rot&lt;/i&gt; and does not produce a valid estimate. The following plot shows why. &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wcorf4kix7U/TfaCgBlFsSI/AAAAAAAAA00/3n0p6fsSA-c/s1600/plot.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="268" width="400" src="http://2.bp.blogspot.com/-wcorf4kix7U/TfaCgBlFsSI/AAAAAAAAA00/3n0p6fsSA-c/s400/plot.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The y-axis shows the residence time (R) normalized by the service time (S) plotted against the server load or utilization (&amp;rho;). Normalizing the residence time is a convenient way to compare across different server configurations without getting tied up in knots about the actual service time (Here, it's the same S = 1.5 minutes, anyway). &lt;p&gt;The blue curve toward the upper left is the single cashier case (aka M/M/1 in queueing parlance). The middle pair of curves (solid and dashed) pertain to the 2-cashier case (M/M/2). The third pair of curves are for 10-cashiers (M/M/10); chosen arbitrarily to represent more than 2 cashiers. &lt;p&gt;Notice first that all three solid curves approach R/S = 1 on the left side of the plot, i.e., at low cashier loads. That's because at low loads, the traffic in the store is so light that there are hardly any arrivals at the cashier, so no waiting line forms. &lt;p&gt;The dashed curve in the middle corresponds to half the M/M/1 residence time. You can see that although it's close to the actual M/M/2 residence time, it gets even closer for loads above 60% or 70%. We were considering 75% in the GCaP homework exercise above. &lt;p&gt;The dashed curve for M/M/10, however, is way off unless we are considering loads very close 100%, which is not much use for CaP predictions. Let's check that the curve itself is correct and we didn't make a mistake in calculating it. At &amp;rho; = 0.8, R/S = 5 for the M/M/1 curve and 1/10th of that value is R/S = 0.5, which is precisely on the dashed line for M/M/10. So, the dashed curve is correct. &lt;p&gt;The RoT R&lt;sub&gt;m&lt;/sub&gt; = R&lt;sub&gt;1&lt;/sub&gt;/m fails because it pushes the estimated residence time (the dashed curve) closer and closer to the x-axis as the number of cashiers (m) is increased. In other words, the estimated R/S ratio gets closer and closer to zero. Something like 100th of R&lt;sub&gt;1&lt;/sub&gt; is going to be indistinguishable from the x-axis, for example. In reality, however, as the number of m servers is increased, the actual R/S ratio remains close to 1.0 (not zero) at higher and higher loads. That's the whole point of using a multiserver M/M/m queue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-6847040396450452468?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZFkAOd5oZCgkaVklKVZ5KnU4O14/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZFkAOd5oZCgkaVklKVZ5KnU4O14/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZFkAOd5oZCgkaVklKVZ5KnU4O14/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZFkAOd5oZCgkaVklKVZ5KnU4O14/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/AKxs5-I_28Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/6847040396450452468/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=6847040396450452468" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6847040396450452468?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6847040396450452468?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/AKxs5-I_28Q/two-heads-are-better-than-one-and-m.html" title="Two Heads Are Better Than One ... And m" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-iocmOnBeP0I/TfbY7hodDhI/AAAAAAAAA08/1jRLqPVC_ns/s72-c/Mark_Wing-Davey_as_Zaphod_Beeblebrox.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/06/two-heads-are-better-than-one-and-m.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQHg_eCp7ImA9WhZVGEs.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-5515522835719316795</id><published>2011-05-31T09:20:00.000-07:00</published><updated>2011-05-31T09:41:51.640-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T09:41:51.640-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="GDAT" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>Go Guerrill-R on Your Data</title><content type="html">The &lt;a href="http://www.perfdynamics.com/Classes/Outlines/gdata.html"&gt;Guerrilla Data Analysis Techniques&lt;/a&gt; training course (GDAT) will be held during the week of &lt;b&gt;August 8-12&lt;/b&gt; this year. As usual, the focus will be on &lt;a href="http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html"&gt;applying R&lt;/a&gt; to your performance and capacity planning data, as well as how to use the &lt;a href="http://www.perfdynamics.com/Tools/PDQ-R.html"&gt;PDQ-R &lt;/a&gt; modeling tool.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;&lt;img height="265" src="http://1.bp.blogspot.com/_MPdbS9EPh5Y/SlY7bHT4cRI/AAAAAAAAAaE/eu2EJIl45So/s400/moreZ.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
(Click on the image for details)&lt;/center&gt;&lt;br /&gt;
Classes are held at our Larkspur Landing location in Pleasanton, California; a 45-minute BART ride to downtown San Francisco. For those of you coming from &lt;span style="font-weight: bold;"&gt;international&lt;/span&gt; locations, here is a table of currency &lt;a href="http://www.x-rates.com/d/USD/table.html"&gt;EXCHANGE&lt;/a&gt; rates. We look forward to seeing all of you in August!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-5515522835719316795?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SP4xWLUuxInyRjDqs0mF-brvfc4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SP4xWLUuxInyRjDqs0mF-brvfc4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SP4xWLUuxInyRjDqs0mF-brvfc4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SP4xWLUuxInyRjDqs0mF-brvfc4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/1q7X7PZCP30" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/5515522835719316795/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=5515522835719316795" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5515522835719316795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5515522835719316795?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/1q7X7PZCP30/go-guerrill-r-on-your-data.html" title="Go Guerrill-R on Your Data" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_MPdbS9EPh5Y/SlY7bHT4cRI/AAAAAAAAAaE/eu2EJIl45So/s72-c/moreZ.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/05/go-guerrill-r-on-your-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGR385fSp7ImA9WhZVFk0.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-6162107524911032272</id><published>2011-05-26T09:39:00.000-07:00</published><updated>2011-05-28T09:52:06.125-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-28T09:52:06.125-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="USL" /><title>Quantifying Scalability FTW (The Movie)</title><content type="html">The &lt;a href="http://omniti.com/surge/2010/speakers/neil-gunther#quantifying-scalability-FTW"&gt;video of my presentation&lt;/a&gt; at the &lt;a href="http://omniti.com/surge/2010/speakers"&gt;Surge 2010 conference&lt;/a&gt; on scalability and performance has finally been posted. Since it doesn't seem to be a streaming server, it may take several minutes to download the video (depending on the speed of your pipe). Also, the audio is suboptimal because it seems to have been recorded from the ambient loudspeakers rather than a direct mic. I was too busy giving the talk to remember the setup they used.&lt;br /&gt;
&lt;br /&gt;
Here's the abstract:&lt;br /&gt;
&lt;blockquote&gt;You probably already collect performance data, but data ain't information. Successfull scalability requires transforming your data so that you can quantify the cost-benefit of any architectural decisions. In other words: &lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;tt&gt;&lt;big&gt;measurement  +  models  ==  information&lt;/big&gt;&lt;/tt&gt;&lt;/center&gt;&lt;br /&gt;
So, measurement alone is only half the story; you need a method to transform your data. In this presentation I will &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;show you a method&lt;/a&gt; that I have developed and applied successfully to large-scale web sites and stack applications to quantify the benefits of proposed scaling strategies. To the degree that you don't quantify your scalability, you run the risk of ending up with WTF rather than FTW.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-6162107524911032272?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-sA-E-twLbOtQ_Xp5XXYdZ91_jE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-sA-E-twLbOtQ_Xp5XXYdZ91_jE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-sA-E-twLbOtQ_Xp5XXYdZ91_jE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-sA-E-twLbOtQ_Xp5XXYdZ91_jE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/ZLJBJor8kz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/6162107524911032272/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=6162107524911032272" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6162107524911032272?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/6162107524911032272?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/ZLJBJor8kz0/quantifying-scalability-ftw-movie.html" title="Quantifying Scalability FTW (The Movie)" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/05/quantifying-scalability-ftw-movie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUHQHk4cCp7ImA9WhRVEkw.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-5735610555961779267</id><published>2011-05-23T09:05:00.000-07:00</published><updated>2012-01-10T09:57:11.738-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T09:57:11.738-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stretch factor" /><category scheme="http://www.blogger.com/atom/ns#" term="GCaP" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="Guerrilla capacity planning" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>May 2011 Guerrilla Classes: Light Bulb Moments</title><content type="html">It's impossible to know what will constitute a light bulb moment for someone else. In the recent &lt;a href="http://perfdynamics.blogspot.com/2011/01/guerrilla-classes-for-2011.html"&gt;Guerrilla classes&lt;/a&gt; (&lt;a href="http://www.perfdynamics.com/Classes/Outlines/gboot.html"&gt;GBoot&lt;/a&gt; and &lt;a href="http://www.perfdynamics.com/Classes/Outlines/guerilla.html"&gt;GCaP&lt;/a&gt;), we seemed to be having many more than our usual quota of such moments. So much so, that I decided to keep a list.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; The first was mine. Asa H. was having trouble setting up &lt;a href="http://www.perfdynamics.com/Tools/PDQ.html"&gt;PDQ&lt;/a&gt; under &lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt; on his work-provided Windows laptop. I suddenly realized that it would have been more helpful if I had provided an example &lt;tt&gt;.bashrc&lt;/tt&gt; file in the &lt;a href="http://www.perfdynamics.com/Tools/PDQcode.html"&gt;PDQ distribution&lt;/a&gt;. I will do that but, in the meantime, I've now included a copy in the &lt;a href="http://www.perfdynamics.com/Tools/PDQcode.html#tth_sEc2.2"&gt;PDQ download notes&lt;/a&gt;.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Another problem is using &lt;a href="http://www.perfdynamics.com/Tools/PDQ-R.html"&gt;PDQ-R&lt;/a&gt; under cygwin because R is not part of the official cygwin distro. A quick search on the web uncovered &lt;a href="http://cygwinports.org/"&gt;cygwinports&lt;/a&gt;, which provides R separately.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; For people new to using &lt;a href="http://www.perfdynamics.com/Tools/PDQman.html"&gt;PDQ functions&lt;/a&gt; in R, explicit name-dependency can be very helpful. Gary L. asked if this could be done in R. The answer is, yes. Instead of just writing say, &lt;tt&gt;CreateNode(name, CEN, FCFS)&lt;/tt&gt; to define a queueing resource in PDQ, you can write &lt;tt&gt;pdq::CreateNode(name, CEN, FCFS)&lt;/tt&gt; in R. A more detailed example is presented in my blog post "&lt;a href="http://perfdynamics.blogspot.com/2011/05/applying-pdq-in-r-to-load-testing.html"&gt;Applying PDQ in R to Load Testing&lt;/a&gt;".&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; John McG. pointed out that my grocery store "price check" service-time stretching analogy for coherency delays in the &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html#tth_sEc1.1"&gt;USL model&lt;/a&gt; (i.e., the point-to-point &amp;beta; term), doesn't scale with N customers in checkout lane.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; My organizing principle of defining &lt;b&gt;Inputs and Outputs&lt;/b&gt; for queueing theory calculations, was a big hit with some students. As a trivial example, if you wanted to apply Little's law, Q = &amp;lambda; R, to some performance data, it is important to know what variables you have and which one you want to solve for. If want to solve for the mean queue length Q, then you need both the arrival rate &amp;lambda; and the mean residence time R. Supposing you do indeed have data for &amp;lambda; and R, then they constitute your &lt;b&gt;inputs&lt;/b&gt; and Q is the &lt;b&gt;output&lt;/b&gt;. More generally, after you rearrange the equation appropriately, whatever is on the right side of the equal sign are the inputs and the left side is the output. The scheme can be (should be) applied to the construction of PDQ models.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; When presenting Erlang's famous queueing formulae, I always apply the mnemonic device that the &lt;b&gt;B&lt;/b&gt; stands for a "blocked call" (an engaged signal), and &lt;b&gt;C&lt;/b&gt; stands for "call waiting' (a very modern concept). However, the Danish telephone system in the early 1900s did not offer call waiting, so what did Erlang mean in his 1917 paper when he uses the term "waiting room" (the waiting line) to define the difference between his B and C formulae? The image of a doctor's clinic comes to mind, but this could not have been implemented in telephone switches at that time. Gary L. provided us with a new insight. Telephones were still a rare resource in those days, and one can imagine that Danes who wanted to place a call did not have their own phone at home. Instead, they probably had to visit a shop or the post office to use a &lt;i&gt;communal phone&lt;/i&gt; and it's in that room that they probably had to wait.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; In reviewing one of the questions in the homework exercises, Gary L. observed that the response time R&lt;sub&gt;2&lt;/sub&gt; for an M/M/2 queue is very close to one half R&lt;sub&gt;1&lt;/sub&gt; for an M/M/1 queue if each server has the same load. We can test this in R. First we create a function to compute the response time (R) for an M/M/m queue&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
mmmR &lt;- function(m,a,S) {
   R &lt;- S/(1-(a*S)^m)
   return(R)
}
&lt;/code&gt;&lt;/pre&gt;where the respective arguments are: m the number of servers, a the mean arrival rate into the queue, and S the mean service time at the queue. Note that this is a Guerrilla approximation to the exact Erlang C formula. Now, test it out. We know that R&lt;sub&gt;1&lt;/sub&gt; should be 2S at &amp;rho; = a S = 0.5. Assuming S = 1:&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
&gt; mmmR(1,0.5,1)
[1] 2
&lt;/code&gt;&lt;/pre&gt;And R&lt;sub&gt;1&lt;/sub&gt; should be 4S at &amp;rho; = a S = 0.75:&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
&gt; mmmR(1,0.75,1)
[1] 4
&lt;/code&gt;&lt;/pre&gt;In the class exercise, we first simply added another cashier to an existing check-out lane, where the original cashier was 75% busy. So, the load is now split in two:&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
&gt; mmmR(2,0.75/2,1)
[1] 1.163636
&lt;/code&gt;&lt;/pre&gt;A clear win compared with R&lt;sub&gt;1&lt;/sub&gt; = 4. The next part of the exercise added another cashier, but make them both as busy as the original lone cashier:&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
&gt; mmmR(2,0.75,1)
[1] 2.285714
&lt;/code&gt;&lt;/pre&gt;Also a win when compared with R&lt;sub&gt;1&lt;/sub&gt; = 4, even though both cashiers are as busy as the M/M/1 case. That result is not obvious. What about the observation that R&lt;sub&gt;2&lt;/sub&gt; &amp;cong; R&lt;sub&gt;1&lt;/sub&gt;/2? The following R code will generate a table:&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
r &lt;- 0.0
cat(sprintf("%4s\t%6s\t%6s\t%6s\n", "load","M/M/1", "M/M/2", "M/M/20"))
for (i in 1:10) {
 cat(sprintf("%4.2f\t%6.2f\t%6.2f\t%6.2f\n", r, mmmR(1,r,1), mmmR(2,r,1), mmmR(20,r,1)))
 r &lt;- r + 0.1
}
&lt;/code&gt;&lt;/pre&gt;which allows us to compare both M/M/2 and M/M/20 for &amp;rho; &gt; 0.5 (heavy traffic condition):&lt;br /&gt;
&lt;pre class="source-code"&gt;&lt;code&gt;
load  M/M/1  M/M/2 M/M/20
0.00   1.00   1.00   1.00
0.10   1.11   1.01   1.00
0.20   1.25   1.04   1.00
0.30   1.43   1.10   1.00
0.40   1.67   1.19   1.00
0.50   2.00   1.33   1.00
0.60   2.50   1.56   1.00
0.70   3.33   1.96   1.00
0.80   5.00   2.78   1.01
0.90  10.00   5.26   1.14
&lt;/code&gt;&lt;/pre&gt;It looks like it holds for M/M/2 under heavy traffic, but it doesn't do so well as the number of servers is increased, e.g., m = 20 servers. Clearly, R&lt;sub&gt;20&lt;/sub&gt; &amp;ne; R&lt;sub&gt;1&lt;/sub&gt;/20, even at very high loads. See &lt;a href="http://perfdynamics.blogspot.com/2011/06/two-heads-are-better-than-one-and-m.html"&gt;this blog post&lt;/a&gt; for an explanation.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; The concept of iteratively tuning &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html#tth_sEc2.1"&gt;load-test measurements&lt;/a&gt; to try and match the theoretical &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html#tth_sEc1"&gt;USL curve&lt;/a&gt;, was a eureka moment for Asa H.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;As you can see, a good time was had &lt;a href="http://www.perfdynamics.com/Classes/comments.html"&gt;by all&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-5735610555961779267?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oAnAzrzWE-nOvKI2OkuT_bHUZV8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oAnAzrzWE-nOvKI2OkuT_bHUZV8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oAnAzrzWE-nOvKI2OkuT_bHUZV8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oAnAzrzWE-nOvKI2OkuT_bHUZV8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/_gKL4Ooi9Pw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/5735610555961779267/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=5735610555961779267" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5735610555961779267?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/5735610555961779267?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/_gKL4Ooi9Pw/may-2011-guerrilla-classes-light-bulb.html" title="May 2011 Guerrilla Classes: Light Bulb Moments" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/05/may-2011-guerrilla-classes-light-bulb.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYNQnk5fSp7ImA9WhRVEkw.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-4566790937666635971</id><published>2011-05-19T00:28:00.000-07:00</published><updated>2012-01-10T09:56:33.725-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T09:56:33.725-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stretch factor" /><category scheme="http://www.blogger.com/atom/ns#" term="PDQ" /><category scheme="http://www.blogger.com/atom/ns#" term="R" /><title>Applying PDQ in R to Load Testing</title><content type="html">PDQ is a &lt;a href="http://www.perfdynamics.com/Tools/PDQman.html"&gt;library of functions&lt;/a&gt; that helps you to express and solve performance questions about computer systems using the abstraction of queues. The queueing paradigm is a natural choice because, whether big (a web site) or small (a laptop), all computer systems can be represented as a network or circuit of buffers and a buffer is a type of queue.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
As a performance analyst, there are several things I really like about using &lt;a href="http://www.perfdynamics.com/Tools/PDQ-R.html"&gt;PDQ in R&lt;/a&gt;; as opposed to the other programming languages: &lt;a href="http://www.perfdynamics.com/Tools/PDQcode.html"&gt;C, Perl, Python, etc&lt;/a&gt;. It enables you to:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; easily import (large) data with a variety formats&lt;br /&gt;
&lt;li&gt; perform sophisticated statistical analysis&lt;br /&gt;
&lt;li&gt; extract input parameters for a PDQ model&lt;br /&gt;
&lt;li&gt; construct and execute the PDQ model within R&lt;br /&gt;
&lt;li&gt; plot the PDQ output and compare it with the original data&lt;br /&gt;
&lt;li&gt; test your ideas in the R console and save the best into a script&lt;br /&gt;
&lt;/ol&gt;In applying this approach, you could find yourself using a number of R library packages. To improve clarity in your modeling script, you might like to identify clearly which routines belong to PDQ; especially if you're new to PDQ and not familiar with &lt;a href="http://www.perfdynamics.com/Tools/PDQman.html"&gt;all the functions&lt;/a&gt;. &lt;p&gt;&lt;p&gt;R syntax for naming function dependency is the same as Perl.  The :: operator is used for explicitly exported names. It also avoids conflict between packages the export different functions with the same name. The ::: operator is used for access to functions that are &lt;a href="http://www.mail-archive.com/r-help@r-project.org/msg77742.html"&gt;not exported&lt;/a&gt; in the package namespace. &lt;p&gt;Let's look at the above steps in the context of an example based on load testing data. A key point to observe here is how the performance data and the performance model play together to provide validation of the measurements.  &lt;h4&gt;Performance data&lt;/h4&gt;We begin by importing the load test data from measurements of an application intended for a three-tier architecture.  &lt;pre class="source-code"&gt;&lt;code&gt;
library(ineq)
library(pdq)

# Read in the performance measurements
gdat &lt;- read.csv("/Users/njg/.../gcap.dat",header=TRUE)
&lt;/code&gt;&lt;/pre&gt;Even though the &lt;i&gt;ineq&lt;/i&gt; package is part of base R functionality, I've loaded it explicitly so as to name its functions explicitly. This will also provide a contrast with explicitly named functions from the PDQ package.   &lt;pre class="source-code"&gt;&lt;code&gt;
&gt; gdat
  Vusr Xgps   Rms Uweb Uapp Udbm
1    1   24  26.0 0.21 0.08 0.04
2    2   48  26.0 0.41 0.13 0.05
3    4   85  29.3 0.74 0.20 0.05
4    7  100  44.7 0.95 0.23 0.05
5   10  115  66.0 0.96 0.22 0.06
6   20  112 140.0 0.97 0.22 0.06
&lt;/code&gt;&lt;/pre&gt;The columns are respectively the client load, measured throughput, response time (in milliseconds), and system utilization on each of the three tiers.  &lt;h4&gt;Statistical analysis&lt;/h4&gt;We can now perform various kinds of statistical analysis on these data. &lt;pre class="source-code"&gt;&lt;code&gt;
&gt; summary(gdat)
      Vusr             Xgps             Rms              Uweb             Uapp       
 Min.   : 1.000   Min.   : 24.00   Min.   : 26.00   Min.   :0.2100   Min.   :0.0800  
 1st Qu.: 2.500   1st Qu.: 57.25   1st Qu.: 26.82   1st Qu.:0.4925   1st Qu.:0.1475  
 Median : 5.500   Median : 92.50   Median : 37.00   Median :0.8450   Median :0.2100  
 Mean   : 7.333   Mean   : 80.67   Mean   : 55.33   Mean   :0.7067   Mean   :0.1800  
 3rd Qu.: 9.250   3rd Qu.:109.00   3rd Qu.: 60.67   3rd Qu.:0.9575   3rd Qu.:0.2200  
 Max.   :20.000   Max.   :115.00   Max.   :140.00   Max.   :0.9700   Max.   :0.2300  
      Udbm        
 Min.   :0.04000  
 1st Qu.:0.05000  
 Median :0.05000  
 Mean   :0.05167  
 3rd Qu.:0.05750  
 Max.   :0.06000  
&lt;/code&gt;&lt;/pre&gt;More significantly, we can use R statistical functions to derive appropriate parameters for a PDQ model. &lt;pre class="source-code"&gt;&lt;code&gt;
# Apply Little's law to get mean service times + CoVs
Sweb &lt;- mean(gdat$Uweb/gdat$Xgps)
Sapp &lt;- mean(gdat$Uapp/gdat$Xgps)
Sdbm &lt;- mean(gdat$Udbm/gdat$Xgps)

Csw &lt;- ineq::var.coeff(gdat$Uweb/gdat$Xgps)
Csa &lt;- ineq::var.coeff(gdat$Uapp/gdat$Xgps)
Csd &lt;- ineq::var.coeff(gdat$Udbm/gdat$Xgps)

s1 &lt;- sprintf("System: %6s %6s %6s\n", "Web","App","DBMS")
s2 &lt;- sprintf("Mean S: %6.4f %6.4f %6.4f\n", Sweb, Sapp, Sdbm)
s3 &lt;- sprintf("CoV  S: %6.4f %6.4f %6.4f\n", Csw, Csa, Csd)
cat("\n",s1,s2,s3)
&lt;/code&gt;&lt;/pre&gt;In particular, we calculate the average service times on each tier (second row) by applying &lt;a href="http://en.wikipedia.org/wiki/Little's_law"&gt;Little's law&lt;/a&gt;. &lt;pre class="source-code"&gt;&lt;code&gt;
 System:    Web    App   DBMS
 Mean S: 0.0088 0.0024 0.0008
 CoV  S: 0.0411 0.1989 0.5271
&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;PDQ model&lt;/h4&gt;As shown in Figure 1, the service times for each of the three tiers in the load-test platform can be represented as queueing resources in PDQ.   &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7jeKzdwx_j4/TdHT_-cwfKI/AAAAAAAAA0o/40bF8trTbO0/s1600/ebizqnm2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="106" width="500" src="http://3.bp.blogspot.com/-7jeKzdwx_j4/TdHT_-cwfKI/AAAAAAAAA0o/40bF8trTbO0/s400/ebizqnm2.png" /&gt;&lt;center&gt;Fig. 1 PDQ model of load test configuration&lt;/center&gt;&lt;/a&gt;&lt;/div&gt;There is a finite number of requests allowed in the system corresponding to the load clients or virtual users that range between N = 1 and N = 20 Vusers, represented by the octagonal box in Figure 1. Using the diagram, we set up the following PDQ model.  Note the use of explicitly named functions from the PDQ library &lt;pre class="source-code"&gt;&lt;code&gt;
# Plotting variables
xc &lt;- 0  # Vuser loads
yc &lt;- 0  # PDQ throughputs
rc &lt;- 0  # PDQ response times

# Define and solve the PDQ model
for(n in 1:max(gdat$Vusr)) {
 pdq::Init("Three-Tier Model")
 
 pdq::CreateClosed("httpGETs", TERM, as.numeric(n), 0.028)
 
 pdq::CreateNode("WebServer", CEN, FCFS)
 pdq::CreateNode("AppServer", CEN, FCFS)
 pdq::CreateNode("DBMServer", CEN, FCFS)
 
 pdq::SetDemand("WebServer", "httpGETs", Sweb)
 pdq::SetDemand("AppServer", "httpGETs", Sapp)
 pdq::SetDemand("DBMServer", "httpGETs", Sdbm)

 pdq::Solve(EXACT)
 
 xc[n] &lt;- n
 yc[n] &lt;- pdq::GetThruput(TERM, "httpGETs")
 rc[n] &lt;- pdq::GetResponse(TERM, "httpGETs") * 10^3
}
&lt;/code&gt;&lt;/pre&gt;In the above PDQ model, we've selected the predicted throughput and the predicted response times to compare with the original load-test data.   &lt;h4&gt;Plot PDQ results&lt;/h4&gt;&lt;pre class="source-code"&gt;&lt;code&gt;
# Plot throughput and response time models
par(mfrow=c(2,1))
plot(xc, yc, type="l", lwd=1, col="blue", ylim=c(0,120), main="PDQ Throughput Model", xlab="Vusers (N)", ylab="Gets/s X(N)")
points(gdat$Vusr, gdat$Xgps)
plot(xc, rc, type="l", lwd=1, col="blue", ylim=c(0,220), main="PDQ Response Time Model", xlab="Vusers (N)", ylab="ms R(N)")
points(gdat$Vusr, gdat$Rms) 
&lt;/code&gt;&lt;/pre&gt;The above R code produces the following plot array:   &lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0Jsw1O9EocA/TdCjBQ89CzI/AAAAAAAAA0Y/OaEYhBMRyE8/s1600/gcap-plots.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="368" width="400" src="http://1.bp.blogspot.com/-0Jsw1O9EocA/TdCjBQ89CzI/AAAAAAAAA0Y/OaEYhBMRyE8/s400/gcap-plots.png" /&gt;/&gt;&lt;center&gt;Fig. 2 Throughput and response time data and predicted PDQ curves&lt;/center&gt;&lt;/a&gt;&lt;/div&gt;We see that the data and PDQ model are in good agreement with the throughput saturating above N = 5 vusers with the corresponding response time rising up the proverbial "hockey stick" handle.   &lt;h4&gt;PDQ report&lt;/h4&gt;Optionally, we can produce a formal PDQ report to examine the performance of each of the three tiers, even if we don't have any corresponding performance measurements from the load-test platform. This is one way by which bottlenecks can be predicted and checked before deploying into production.  &lt;pre class="source-code"&gt;&lt;code&gt;
&gt; pdq::Report()
                ***************************************
                ****** Pretty Damn Quick REPORT *******
                ***************************************
                ***  of : Sun May 15 18:26:21 2011  ***
                ***  for: Three-Tier Model          ***
                ***  Ver: PDQ Analyzer v5.0 030211  ***
                ***************************************
                ***************************************

                =======================================
                ******    PDQ Model INPUTS      *******
                =======================================

Node Sched Resource   Workload   Class     Demand
---- ----- --------   --------   -----     ------
CEN  FCFS  WebServer  httpGETs   TERML     0.0088
CEN  FCFS  AppServer  httpGETs   TERML     0.0024
CEN  FCFS  DBMServer  httpGETs   TERML     0.0008

Queueing Circuit Totals:
        Streams:      1
        Nodes:        3

WORKLOAD Parameters:
httpGETs      20.00        0.0120     0.03


                =======================================
                ******   PDQ Model OUTPUTS      *******
                =======================================

Solution Method: EXACT

                ******   SYSTEM Performance     *******

Metric                     Value    Unit
------                     -----    ----
Workload: "httpGETs"
Mean concurrency         16.8004    Users
Mean throughput         114.2725    Users/Sec
Response time             0.1470    Sec
Round trip time           0.1750    Sec
Stretch factor           12.2633

Bounds Analysis:
Max throughput          114.2725    Users/Sec
Min response              0.0120    Sec
Max Demand                0.0088    Sec
Tot demand                0.0120    Sec
Think time                0.0280    Sec
Optimal clients           4.5696    Clients


                ******   RESOURCE Performance   *******

Metric          Resource     Work              Value   Unit
------          --------     ----              -----   ----
Throughput      WebServer    httpGETs       114.2725   Users/Sec
Utilization     WebServer    httpGETs       100.0000   Percent
Queue length    WebServer    httpGETs        16.3144   Users
Waiting line    WebServer    httpGETs        15.3144   Users
Waiting time    WebServer    httpGETs         0.1340   Sec
Residence time  WebServer    httpGETs         0.1428   Sec

Throughput      AppServer    httpGETs       114.2725   Users/Sec
Utilization     AppServer    httpGETs        27.7529   Percent
Queue length    AppServer    httpGETs         0.3841   Users
Waiting line    AppServer    httpGETs         0.1066   Users
Waiting time    AppServer    httpGETs         0.0009   Sec
Residence time  AppServer    httpGETs         0.0034   Sec

Throughput      DBMServer    httpGETs       114.2725   Users/Sec
Utilization     DBMServer    httpGETs         9.2447   Percent
Queue length    DBMServer    httpGETs         0.1019   Users
Waiting line    DBMServer    httpGETs         0.0094   Users
Waiting time    DBMServer    httpGETs         0.0001   Sec
Residence time  DBMServer    httpGETs         0.0009   Sec
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-4566790937666635971?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HBGEGx80iQ8bsr9PkBffu3Hxat8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HBGEGx80iQ8bsr9PkBffu3Hxat8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HBGEGx80iQ8bsr9PkBffu3Hxat8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HBGEGx80iQ8bsr9PkBffu3Hxat8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/18Hv8BoA0MY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/4566790937666635971/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=4566790937666635971" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/4566790937666635971?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/4566790937666635971?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/18Hv8BoA0MY/applying-pdq-in-r-to-load-testing.html" title="Applying PDQ in R to Load Testing" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7jeKzdwx_j4/TdHT_-cwfKI/AAAAAAAAA0o/40bF8trTbO0/s72-c/ebizqnm2.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/05/applying-pdq-in-r-to-load-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EHSH05cCp7ImA9WhZWFkk.&quot;"><id>tag:blogger.com,1999:blog-6977755959349847093.post-4224370312960704094</id><published>2011-05-01T12:34:00.000-07:00</published><updated>2011-05-17T09:27:19.328-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-17T09:27:19.328-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="USL" /><category scheme="http://www.blogger.com/atom/ns#" term="GBoot" /><category scheme="http://www.blogger.com/atom/ns#" term="performance models" /><title>Fundamental Performance Metrics</title><content type="html">Baron Schwartz invited me to comment on his latest blog post entitled "&lt;a href="http://www.mysqlperformanceblog.com/2011/04/27/the-four-fundamental-performance-metrics/"&gt;The four fundamental performance metrics,&lt;/a&gt;" &lt;a href="http://www.mysqlperformanceblog.com/2011/04/27/the-four-fundamental-performance-metrics/comment-page-1/#comment-806129"&gt;which I did&lt;/a&gt;. Coincidentally, I happened to address this same topic in my presentation at &lt;a href="http://perfdynamics.blogspot.com/2011/03/cmg-atlanta-southbound-to-deep-south.html"&gt;CMG Atlanta&lt;/a&gt; last week. I claim there are really only 3 fundamental performance metrics (actually 2, if you want to get truly fundamental about it).&lt;br /&gt;
&lt;br /&gt;
Here are the relevant slides from that talk, which I hope you will be able to compare with Baron's perspective.&lt;br /&gt;
&lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TfhvcEkyhV4/Tb2tuQDX9GI/AAAAAAAAAyY/-M797PNNkCE/s1600/noobs1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-TfhvcEkyhV4/Tb2tuQDX9GI/AAAAAAAAAyY/-M797PNNkCE/s400/noobs1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-q2KRJQe-Usw/Tb2uQPrv29I/AAAAAAAAAyg/shjN4x_YYcU/s1600/noobs2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://3.bp.blogspot.com/-q2KRJQe-Usw/Tb2uQPrv29I/AAAAAAAAAyg/shjN4x_YYcU/s400/noobs2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--WAe8f7Oeik/Tb2ucmE7eKI/AAAAAAAAAyo/A-fH5i6B72U/s1600/noobs3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://1.bp.blogspot.com/--WAe8f7Oeik/Tb2ucmE7eKI/AAAAAAAAAyo/A-fH5i6B72U/s400/noobs3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-iHEXZj1OZCc/Tb2uldQPSVI/AAAAAAAAAyw/gJlXuKtVA6c/s1600/noobs4.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-iHEXZj1OZCc/Tb2uldQPSVI/AAAAAAAAAyw/gJlXuKtVA6c/s400/noobs4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Y4waZwQNOPM/Tb2uphSNj4I/AAAAAAAAAy4/IOD52rnx3Ws/s1600/noobs5.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://3.bp.blogspot.com/-Y4waZwQNOPM/Tb2uphSNj4I/AAAAAAAAAy4/IOD52rnx3Ws/s400/noobs5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8RS0-oCZvGs/Tb2usvaCDVI/AAAAAAAAAzA/HrGHGZacnrg/s1600/noobs6.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-8RS0-oCZvGs/Tb2usvaCDVI/AAAAAAAAAzA/HrGHGZacnrg/s400/noobs6.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sXBPKmfdJAI/Tb28T-4i5EI/AAAAAAAAAzY/jTgrWkO8WIk/s1600/noobs7.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://1.bp.blogspot.com/-sXBPKmfdJAI/Tb28T-4i5EI/AAAAAAAAAzY/jTgrWkO8WIk/s400/noobs7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LvCqigiGBFQ/Tb28XdNqcuI/AAAAAAAAAzg/jrryLmbAo9M/s1600/noobs8.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://3.bp.blogspot.com/-LvCqigiGBFQ/Tb28XdNqcuI/AAAAAAAAAzg/jrryLmbAo9M/s400/noobs8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Baron seems to be getting his cue from certain &lt;a href="http://perfdynamics.blogspot.com/2011/03/cmg-atlanta-southbound-to-deep-south.html"&gt;Linux kernel metrics&lt;/a&gt;. However, I would strongly caution against using metrics defined by Linux kernel hackers (or any other hackers, for that matter). I've seen too many examples of bastardized nomenclature, not to mention broken code that incorrectly computes said metrics. Moreover, I see no virtue in reinventing the wheel only to end up with an &lt;a href="http://www.seshat.ch/home/poly1.GIF"&gt;irregular polygon&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
With that in mind, what I think Baron is trying to elucidate is that just a small number  of simple performance metrics (4?) is all that is required to parameterize certain performance models, such as the &lt;a href="http://www.perfdynamics.com/Manifesto/USLscalability.html"&gt;USL scalability model&lt;/a&gt;. In other words, performance modeling may not be as far away from your already collected performance data as you might think, and therefore there is little excuse not to do it. &lt;a href="http://www.perfdynamics.com/Manifesto/gcaprules.html#tth_sEc1.11"&gt;Amen to that!&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I'll be discussing this topic again in my &lt;a href="http://www.perfdynamics.com/Classes/schedule.html"&gt;Guerrilla Boot Camp&lt;/a&gt; class, later this week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6977755959349847093-4224370312960704094?l=perfdynamics.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NLDsed5YTmvOIoCEGb75ZVdylqw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NLDsed5YTmvOIoCEGb75ZVdylqw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NLDsed5YTmvOIoCEGb75ZVdylqw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NLDsed5YTmvOIoCEGb75ZVdylqw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TakingThePithOutOfPerformance/~4/JVNdRcIWXfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://perfdynamics.blogspot.com/feeds/4224370312960704094/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6977755959349847093&amp;postID=4224370312960704094" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/4224370312960704094?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6977755959349847093/posts/default/4224370312960704094?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TakingThePithOutOfPerformance/~3/JVNdRcIWXfs/fundamental-performance-metrics.html" title="Fundamental Performance Metrics" /><author><name>Neil Gunther</name><uri>http://www.blogger.com/profile/11441377418482735926</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-TfhvcEkyhV4/Tb2tuQDX9GI/AAAAAAAAAyY/-M797PNNkCE/s72-c/noobs1.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://perfdynamics.blogspot.com/2011/05/fundamental-performance-metrics.html</feedburner:origLink></entry></feed>

