<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-27391056</id><updated>2012-01-04T20:30:56.638-08:00</updated><title type='text'>The Black Anvil</title><subtitle type='html'>Discussions on scalability -- load, stress, and performance testing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27391056.post-5442294597708804080</id><published>2011-12-03T14:05:00.001-08:00</published><updated>2011-12-03T16:01:43.927-08:00</updated><title type='text'>Quickstatd: A simple tool to get performance data into Graphite</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I recently wanted to start tracking OS-level performance metrics for a group of servers, and see the results charted in Graphite.  My initial thought was to do this using collectd, with the graphite plugin.  In many cases, using collectd is a great way to go -- it's been well tested and has a robust feature set.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;But collectd wasn't a good fit for my environment.  My servers do not have internet access.  I was not able to install by copying the .rpm over to the servers, due to unmet dependancies.  I decided I wanted something dead simple to install and operate, with no external dependencies.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The result was quickstatd: a small set of bash scripts, easily extendable, that forwards the performance data generated from standard system tools like vmstat, iostat, and sar, to a running instance of Graphite.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I am providing it here in the hopes that it will be useful to others.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://bitbucket.org/travis_bear/quickstatd"&gt;https://bitbucket.org/travis_bear/quickstatd&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Here are two graph examples. &amp;nbsp;Graphite generated these using data provided by quickstatd's vmstat plugin.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class="plaintext" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: 0px 50%; border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-style: initial; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-width: 0px; color: #393939; line-height: 16px; margin-bottom: 20px; margin-top: 20px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Nux92LOOhkk/Ttq1lWOHN7I/AAAAAAAAAEo/oZHJR7ZyFSQ/s1600/cpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://1.bp.blogspot.com/-Nux92LOOhkk/Ttq1lWOHN7I/AAAAAAAAAEo/oZHJR7ZyFSQ/s320/cpu.png" width="320" /&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/-AI82zI9O2Ww/Ttq1nKVfzEI/AAAAAAAAAEw/kyqb8ePaeyw/s1600/interrupts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://1.bp.blogspot.com/-AI82zI9O2Ww/Ttq1nKVfzEI/AAAAAAAAAEw/kyqb8ePaeyw/s320/interrupts.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;pre class="plaintext" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: 0px 50%; border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-style: initial; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-width: 0px; color: #393939; line-height: 16px; margin-bottom: 20px; margin-top: 20px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="plaintext" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: 0px 50%; border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-style: initial; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-width: 0px; color: #393939; line-height: 16px; margin-bottom: 20px; margin-top: 20px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: -webkit-auto; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;div style="color: black; font-family: Times; line-height: normal; white-space: normal;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span"&gt;Quickstatd has no external dependencies. Just extract the tarball, run the installer, and you're good to go. You can configure the services you want to record in&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #393939; line-height: 16px; white-space: pre-wrap;"&gt;/etc/quickstatd.conf. The tool is started and stopped via /etc/init.d/quickstatd.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: black; line-height: normal; white-space: normal;"&gt;
&lt;div style="font-family: Times;"&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #393939; font-family: Arial, Helvetica, sans-serif; line-height: 16px; white-space: pre-wrap;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: Times;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #393939; line-height: 16px; white-space: pre-wrap;"&gt;Quickstatd is tested and works on CentOS (Fedora) and Ubuntu &lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #393939; line-height: 16px; white-space: pre-wrap;"&gt;(Debian).  With small modifications it could be made to work &lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #393939; line-height: 16px; white-space: pre-wrap;"&gt;on OS X, Solaris, etc.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="plaintext" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: 0px 50%; border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-width: 0px; border-color: initial; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-style: initial; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-width: 0px; color: #393939; font-family: Times; line-height: 16px; margin-bottom: 20px; margin-top: 20px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The vmstat plugin should work on most versions of Linux, but the systat package must be installed if you wish to use the 'sar' and 'iostat' monitoring tools on Debian/Ubuntu.&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-5442294597708804080?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/5442294597708804080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=5442294597708804080' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/5442294597708804080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/5442294597708804080'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2011/12/quickstatd-simple-tool-to-get.html' title='Quickstatd: A simple tool to get performance data into Graphite'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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/-Nux92LOOhkk/Ttq1lWOHN7I/AAAAAAAAAEo/oZHJR7ZyFSQ/s72-c/cpu.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-8718561941510121910</id><published>2011-12-02T17:51:00.001-08:00</published><updated>2011-12-05T18:06:23.358-08:00</updated><title type='text'>Visualizing Grinder Data With Other External Metrics</title><content type='html'>&lt;br /&gt;
&lt;div style="background-color: transparent; text-align: left;"&gt;
&lt;b style="font-family: Arial; text-align: -webkit-auto; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;OVERVIEW&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The Grinder is a great tool for doing load and performance testing. &amp;nbsp;But there has never been a good set of tools available to integrate data generated by The Grinder with data from other sources. &amp;nbsp;For example, a reasonable thing for a performance engineer to want to see might be a chart containing the transactions per second data generated by the grinder along with the server-side CPU data generated by vmstat. &amp;nbsp;While not impossible to do, there have never been any standard tools or processes available to make this task easy.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;I recently decided to work on that problem.  I wanted to find a good way to tie Grinder data together with a wide variety of other available performance metrics.   I was willing to write new code as needed, but started with a heavy bias for using existing tools.  I came up with a solution that uses&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; three different data-collection tools, with Graphite as the unifying back end and data visualizer. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;1. GRAPHITE FOR VISUALIZATION&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Graphite is a great tool for storing and visualizing time-series data collected from a variety of different sources.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;1.1  Key Features&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; Simplicity -- Graphite is always on. &amp;nbsp;Your data collectors are always on.  You no longer have to remember to start server monitoring along with your Grinder run, or write wrapper scripts that start your Grinder agent and your server monitoring at the same time.  Just kick off your grinder test, then look at the results when you're done.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; It's easy to integrate data from a variety of sources into Graphite.  For many common forms of data, tools to move it into Graphite have been in place for a long time.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; Graph creation is flexible and simple. In the Graphite UI it's easy to build new types of graphs interactively.  And graphs can be generated programmatically using the Graphite API.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; It's possible to save dashboards with a pre-configured collection of your favorite graph types. &amp;nbsp;This is handy, since it saves you from having to reconfigure &amp;nbsp;your aggregate graphs after each Grinder run.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; Graphite is not the only tool available fo manage time series data, but it is in wide use. &amp;nbsp;Lots of shops use Graphite, which makes it more likely you can find the help (or the tools) you need.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;1.2  Why not Cacti or Ganglia?&lt;/b&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Cacti and Ganglia are both great tools.  In the place I work, our ops team uses ganglia extensively to monitor what’s going on in production, so I initially started this effort with a preference for using Ganglia as the back-end instead of Graphite.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Ganglia and Cacti are both built atop RRD. &amp;nbsp;Unfortunately, RRD assumes all its incoming data is happening in real time.  There are no good options for sending old, timestamped data to an RRD back-end. &amp;nbsp;This rules it out for processing the non-realtime data contained in logs from completed Grinder runs.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Graphite is not built on top of RRD.  It uses an alternate data storage layer named Whisper. &amp;nbsp;Whisper was specifically designed to get around this issue, and to be able to store intermittent data. &amp;nbsp;This is perfect for the Grinder, which produces data in separate blocks of time for each test.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;For more information on Graphite (including documentation, download links, setup instructions, etc.) see the Graphite web site: &lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://graphite.wikidot.com/start"&gt;http://graphite.wikidot.com/start&lt;/a&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;2. GATHERING GRINDER METRICS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Up until now, there has been no good way to get Grinder data into Graphite.  This was the piece that had no pre-existing solution, and required a new tool to be written.  What I came up with is Graphite Log Feeder, available under the GPL&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; at &lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="https://bitbucket.org/travis_bear/graphitelogfeeder"&gt;https://bitbucket.org/travis_bear/graphitelogfeeder&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Graphite Log Feeder (GLF) parses your Grinder data logs and forwards the performance data to a running instance of Graphite. &amp;nbsp;As with the existing Grinder Analyzer tool, (&lt;/span&gt;&lt;a href="http://track.sourceforge.net/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;http://track.sourceforge.net/&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;) you have the option to specify a list of response time groupings. &amp;nbsp;GLF runs in CPython, Jython, and pypy.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Once your Grinder data is imported into Graphite, you can use it to construct arbitrary graphs.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;2.1 Example Graphs&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;Here are examples of graphs I just threw together in a few minutes.  You are certainly not limited to what you see here; the number of possible ways to combine your data is vast, so with time and experimentation, you can come up with whatever presentation you need.  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;In this test load was increasing steadily over time for half an hour.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eQtHAgmXCKE/TtmCKVXzOaI/AAAAAAAAAEY/9aaKstqaYFY/s1600/tps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-eQtHAgmXCKE/TtmCKVXzOaI/AAAAAAAAAEY/9aaKstqaYFY/s1600/tps.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-P-k76xn36gI/TtmCJ3nMYkI/AAAAAAAAAEI/cZ0Eu8MiORY/s1600/responsetime.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-P-k76xn36gI/TtmCJ3nMYkI/AAAAAAAAAEI/cZ0Eu8MiORY/s1600/responsetime.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;2.2 GLF limitations&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; With GLF you have no direct visibility into the test summary data generated for you at the end of the Grinder agent out_* file. &amp;nbsp;For this, Grinder Analyzer is still your best bet.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; No easy way (that I have yet discovered) to zoom in the Graphite UI &amp;nbsp;to the specific block of time where your test has run&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; Although your OS and application-level metrics are available to Graphite in real-time (see below), GLF is only able to make your Grinder data available after your test run has completed.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;2.3   Why not use Logster?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Before writing GLF, I assumed that I would be using Logster (&lt;/span&gt;&lt;a href="https://github.com/etsy/logster"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;https://github.com/etsy/logster&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;) to transfer my Grinder data into Graphite. &amp;nbsp;Unfortunately, when I started digging into Logstster, I discovered that it &amp;nbsp;(like Cacti and Ganglia, see section 1.2, above) assumes all the data it processes is real-time. &amp;nbsp;There is no support for ingesting old or timestamped data. &amp;nbsp;This made it unsuitable for processing Grinder logs.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;3. GATHERING OS-LEVEL METRICS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;There are a variety of tools available for getting OS-level performance metrics (memory, disk use, CPU use) into Graphite. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;3.1  quickstatd&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Quickstatd is a realtime, bash-script based approach that has no external dependencies. &amp;nbsp;It’s a good match in cases where you just want to get something simple up and running quickly.  (Thus the name, quickstatd.)   For additional detail and background, see &lt;a href="http://blackanvil.blogspot.com/2011/12/quickstatd-simple-tool-to-get.html"&gt;my posting on quickstatd&lt;/a&gt;.  For downloads and other info, see &lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="https://bitbucket.org/travis_bear/quickstatd"&gt;https://bitbucket.org/travis_bear/quickstatd&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;3.2  collectd&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Collectd (with the graphite plugin) is a good choice for a production environment. &amp;nbsp;It’s well-tested, with a robust feature set. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;3.3 Example graphs&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;Here are graphs made from quickstatd metrics.  The grinder test is the same one run in section 2.1 (above).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-fVQqVILHCrU/TtmCJfrxf-I/AAAAAAAAAD4/nHbLQYfeTpc/s1600/cpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-fVQqVILHCrU/TtmCJfrxf-I/AAAAAAAAAD4/nHbLQYfeTpc/s1600/cpu.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;4. GATHERING APPLICATION-LEVEL METRICS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;4.1 JAVA / JMXTRANS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Where I work, most of our servers are running on Java in Tomcat. &amp;nbsp;Tomcat exposes a ton of information about its run state via JMX.  We expose quite a bit of information in our own application code that we'd like to track as well.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We use jmxtrans (&lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://code.google.com/p/jmxtrans/"&gt;http://code.google.com/p/jmxtrans/&lt;/a&gt;) &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;to capture these JVM-internal metrics, and forward them to Graphite. &amp;nbsp;With this approach, we can look inside our running apps to see what's happening internally any time we want.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Here are some graphs of JMX statistics captured by jmxtrans.  The examples here are of Tomcat metrics (memory use and thread counts) but they could just as easily be for anything your app exposes via JMX.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-5rmA3zOP_MY/TtmCKGG9KMI/AAAAAAAAAEQ/PKmr29ZcutU/s1600/threads.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-5rmA3zOP_MY/TtmCKGG9KMI/AAAAAAAAAEQ/PKmr29ZcutU/s1600/threads.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-xK4IJC0aMfI/TtmCJio-wzI/AAAAAAAAAEA/gGUUTXpheBA/s1600/memory.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-xK4IJC0aMfI/TtmCJio-wzI/AAAAAAAAAEA/gGUUTXpheBA/s1600/memory.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;4.2 StatsD&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I found the topics discussed in this blog post both powerful and compelling. &lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/"&gt;http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Although the place I work is primarily a Java shop, I’m investigating using StatsD for the few cases where we run apps inside other platforms like Apache HTTP Server, or Django.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: large; white-space: pre-wrap;"&gt;&lt;b&gt;5. INTEGRATING THE DATA&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;With all the separate pieces described above up and running, we can go into the Graphite UI to mix-and-match our metrics, creating graphs of data from different sources.  Here's a chart containing data from both The Grinder and vmstat.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Q-1TXHGrKAc/TtmHnXzFm9I/AAAAAAAAAEg/0LHN9MQ898o/s1600/combo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Q-1TXHGrKAc/TtmHnXzFm9I/AAAAAAAAAEg/0LHN9MQ898o/s1600/combo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;It took about ten seconds to set that graph up.  This kind of simplicity allows us to interactively correlate all kinds of different data.  We are currently only scratching the surface of what's possible, and are very excited to see where this takes us.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;6. BEST PRACTICES&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;There are a few things you can do with this collection of tools that will make your life a little easier.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;6.1 Repeatability&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;In general, repeatability is good, whereas running with a wide variety of test scripts on an ever-changing mix of hardware is asking for a headache.  Every single metric you generate, on each machine, generates a new tree-view item in the Graphite UI.  This can clutter up your UI, and make it harder to find the data you want.  When possible, avoid cycling a bunch of different hardware in and out of your environment.  And when possible, avoid changing the names of the different transactions in your Grinder scripts.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Also, each new metric results in a new Whisper database file being created on your Carbon (Graphite) server.  Depending on your data-retention settings, this can wind up a significant amount of space.  In my environment, every metric results in a Whisper file of 73 MB, with over 90 GB of disk space dedicated to my relatively-small environment of 14 machines.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;6.2 Time synchronization&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Time synchronization among all the machines in your environment (preferably with NTP) is a must!  Otherwise the data from the different machines in your charts will get out of alignment, and you won't be able to accurately visualize what's really going on.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;7. POSSIBLE FUTURE EFFORTS&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;GLF gives Grinder users abilities they have never had before.  And the setup I have described here is quite useful, today.  But there are other desirable features that will require additional work to achieve.  Depending on time and motivation, I may take a stab at implementing some of these things in the future.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;7.1 Grinder run manager&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Graphite runs as a Django app.  Another app could run in the same Django instance to help with a variety of test-management tasks:&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; let you zero you in immediately on the time range for a given test&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; save metadata (goals, hosts, test type, notes, etc.) on individual Grinder runs&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Include some way to store and display the summary data at the end of the Grinder out_* file, similar to the way this information is displayed in Grinder Analyzer, with sortable columns, etc.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="background-color: transparent;"&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;7.2 Additional GLF functionality&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;In addition to the stuff mentioned in section 2.2 (above), there's some stuff GLF doesn't do that would definitely be nice to have.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Extend the log feeder tool to include other types of logs: &amp;nbsp;Apace and Tomcat access logs, scribe logs, etc.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Support for other backends besides Graphite. (Saturnalia, etc.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;7.3 Additional Grinder functionality&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Add support in the Grinder for exposing (via JMX or StatsD) info on the number of threads that are running vs the number waiting for initial sleep to conclude&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;add support in the grinder for the agent process to report TPS and other info normally sent to the console to StatsD instead of (or in addition to) the console UI.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: large; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;8. REFERENCES&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;graphitelogfeeder&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="https://bitbucket.org/travis_bear/graphitelogfeeder"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"&gt;https://bitbucket.org/travis_bear/graphitelogfeeder&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;quickstatd&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; color: #000099; font-family: Arial, Helvetica, sans-serif; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="https://bitbucket.org/travis_bear/quickstatd"&gt;https://bitbucket.org/travis_bear/quickstatd&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://blackanvil.blogspot.com/2011/12/quickstatd-simple-tool-to-get.html"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;http://blackanvil.blogspot.com/2011/12/quickstatd-simple-tool-to-get.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;GrinderAnalyzer&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://track.sourceforge.net/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial, Helvetica, sans-serif; vertical-align: baseline; white-space: pre-wrap;"&gt;http://track.sourceforge.net/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;jmxtrans&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://code.google.com/p/jmxtrans/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial, Helvetica, sans-serif; vertical-align: baseline; white-space: pre-wrap;"&gt;http://code.google.com/p/jmxtrans/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial, Helvetica, sans-serif; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;graphite&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://graphite.wikidot.com/start"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial, Helvetica, sans-serif; vertical-align: baseline; white-space: pre-wrap;"&gt;http://graphite.wikidot.com/start&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;The Grinder&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://grinder.sourceforge.net/"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"&gt;http://grinder.sourceforge.net/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: transparent; font-family: Arial; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;b&gt;Logster&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="https://github.com/etsy/logster"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"&gt;https://github.com/etsy/logster&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-8718561941510121910?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/8718561941510121910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=8718561941510121910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/8718561941510121910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/8718561941510121910'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2011/12/integrating-grinder-performance-data.html' title='Visualizing Grinder Data With Other External Metrics'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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/-eQtHAgmXCKE/TtmCKVXzOaI/AAAAAAAAAEY/9aaKstqaYFY/s72-c/tps.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-5444382430953493952</id><published>2010-04-16T11:23:00.001-07:00</published><updated>2010-07-06T12:36:10.865-07:00</updated><title type='text'>Grinder Analyzer V2.b12 is released</title><content type='html'>There's some pretty good stuff in this one.  From the release notes:


&lt;span style="font-weight: bold;"&gt;Overview:&lt;/span&gt;
&lt;a href="http://track.sourceforge.net/analyzer.html"&gt;http://track.sourceforge.net/analyzer.html&lt;/a&gt;



&lt;span style="font-weight: bold;"&gt;New in V2.b12:&lt;/span&gt;

&lt;ul&gt;&lt;li&gt; Grinder Analyzer is now compatible with log files generated  by The Grinder 3.4&lt;/li&gt;&lt;li&gt; Much better support for scripts generated with the TCP proxy.
&lt;/li&gt;&lt;li&gt; New response time graphs are included in the generated reports.   These are stacked graphs showing the percentage of response time  spent in different areas -- resolve host time, first byte time,  etc.&lt;/li&gt;&lt;li&gt;It is now an option to define response time groups in analyzer.properties.  Grinder analyzer will calculate the  percentage of responses that complete within specified time ranges.&lt;/li&gt;&lt;li&gt; Fix for bug #2219789 -- In cases where multiple transactions have  been assigned identical names in the grinder script, append the test number to the transaction name to ensure uniqueness and prevent graphs from overwriting each other.  Thanks to Thomas Falkenberg for nudging me on this.&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Download&lt;/span&gt;
&lt;a href="http://sourceforge.net/projects/track/files/"&gt;http://sourceforge.net/projects/track/files/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-5444382430953493952?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/5444382430953493952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=5444382430953493952' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/5444382430953493952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/5444382430953493952'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2010/04/grinder-analyzer-v2b12-is-released.html' title='Grinder Analyzer V2.b12 is released'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-1516497949447571570</id><published>2008-01-30T12:57:00.000-08:00</published><updated>2008-01-30T13:25:46.040-08:00</updated><title type='text'>Grinder Analyzer is Released</title><content type='html'>In the last blog entry, I posted some examples of useful graphs that could be made from Grinder log data.   Now I've published a tool that generates graphs like these.  It analyzes data generated by The Grinder during scale runs, and outputs a series of graphs that show up in a summary table.

Since I'm always wanting to know things like "which transaction is the slowest" or "which transaction has the highest error rate, columns in the report are sortable.

Check it out.
&lt;ul&gt;&lt;li&gt;Info on the tool is here: &lt;a href="http://track.sourceforge.net/analyzer.html"&gt;http://track.sourceforge.net/analyzer.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Example output can be found here: &lt;a href="http://track.sourceforge.net/example/report.html"&gt;http://track.sourceforge.net/example/report.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Any questions or issues, let me know.

Thanks!


-Travis&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-1516497949447571570?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/1516497949447571570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=1516497949447571570' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/1516497949447571570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/1516497949447571570'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2008/01/grinder-analyzer-is-released.html' title='Grinder Analyzer is Released'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-116278316842575277</id><published>2006-11-05T19:16:00.000-08:00</published><updated>2006-11-06T11:07:32.116-08:00</updated><title type='text'>Centralized Analysis of Scale Data</title><content type='html'>The Grinder is a good tool for generating large levels of load against a server.  But after the run is over, the love ends.  There are no post-run analysis capabilities built in.  No graphs of server-side performance metrics, or clients side data.

I have begun working on an open-source data warehousing tool for test data generated by The Grinder.  This tool parses the logs generated by each agent, and feeds all the information into a database.  Once it has been centralized there, all sorts of post-run analysis becomes possible.  I have two goals for this project:

&lt;ul&gt;&lt;li&gt;Allow for simple analysis of Grinder runs:  generate summary tables, graph server-side perf data such as CPU and disk activity, graph client side data such as response times and transactions per second.&lt;/li&gt;&lt;li&gt;Allow for long-term storage of test data.  This will enable comparing performance of the server  across many different builds, and longer-term, across many different server versions.
&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Current Situation&lt;/span&gt;

Here is what is implemented today:

&lt;ul&gt;&lt;li&gt;The database -- tables&lt;/li&gt;&lt;li&gt;The database -- sql scripts to generate TPS and response time graphs
&lt;/li&gt;&lt;li&gt;The log parser and feeder classes which run on each agent&lt;/li&gt;&lt;li&gt;The grapher classes
&lt;/li&gt;&lt;/ul&gt;

This is an example of a transactions per second graph generated by the current code.  In this scale run, the load was increasing over time (using the scheduling mechanism discussed at the end of &lt;a href="http://blackanvil.blogspot.com/2006/11/grinder-addressing-warts.html"&gt;my previous blog entry&lt;/a&gt;.)
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4839/2861/1600/tps.AllTransactions.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/4839/2861/400/tps.AllTransactions.png" alt="" border="0" /&gt;&lt;/a&gt;


Here is an example of a response times graph generated by the current code:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4839/2861/1600/responseTime.AllTransactions.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/4839/2861/400/responseTime.AllTransactions.png" alt="" border="0" /&gt;&lt;/a&gt;



&lt;span style="font-weight: bold;"&gt;Future - Short Term&lt;/span&gt;

In the short term, this basic functionality must be completed.
&lt;ul&gt;&lt;li&gt;SQL code to generate reports summarizing a given scale run.  Presenting information on response times, pass/fail rates, etc. in a tabular format.
&lt;/li&gt;&lt;li&gt;Create feeders and graphers for server-side performance data, such as produced by perfmon, vmstat, sar, prstat, etc.&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Future - Medium Term&lt;/span&gt;

After the immediate needs are met, a good way of browsing the test results in the database is needed.
&lt;ul&gt;&lt;li&gt;Storing the graphs themselves in the database rather than on the filesystem.&lt;/li&gt;&lt;li&gt;Implementing a Web UI for browsing scale test info in the database
&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Future - Long Term&lt;/span&gt;

Currently, running a large-scale test with many agents is a cumbersome process.   Each agent process must be manually started and connected to the console.  In situations with, for example, 30 agent machines, this is problematic.   Shell scripts exist today that can ssh in to remote agents and start them up, but they require Linux and are not a generic, cross-platform solution.
&lt;ul&gt;&lt;li&gt;Extending the web UI to provide additional configuration management.&lt;/li&gt;&lt;li&gt;Extending the web UI to enable remote agent startup in a cross-platform manner, and the ability to drive a Grinder test in an AJAX environment via the console API.
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-116278316842575277?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/116278316842575277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=116278316842575277' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/116278316842575277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/116278316842575277'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2006/11/centralized-analysis-of-scale-data.html' title='Centralized Analysis of Scale Data'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-116263105452980316</id><published>2006-11-04T00:33:00.000-08:00</published><updated>2006-11-05T20:45:05.653-08:00</updated><title type='text'>The Grinder: Addressing the Warts</title><content type='html'>Last June, I discussed the merits of The Grinder as a Load testing tool, and &lt;a href="http://blackanvil.blogspot.com/2006/06/shootout-load-runner-vs-grinder-vs.html"&gt;compared it with Load Runner and JMeter.&lt;/a&gt;  Since then, I have been using The Grinder at work to perform load tests against our server product.  In the nearly five months since my original analysis, all of my serious complaints have been addressed.  In addition,  several of my minor ones have been addressed as well, or workarounds have been discovered.  So I thought it would be fair to revisit my original complaints, and in the cases where solutions have been found, share them.
&lt;p&gt;
&lt;span style="font-weight: bold;"&gt;Major Issues&lt;/span&gt;
&lt;p&gt;
&lt;span style="font-style: italic;"&gt;Poor performance with large downloads.
&lt;p&gt;
&lt;/span&gt;This turned out to be a memory issue driven by my poor configuration.    The Grinder does not have the option of eating the bytes of the HTTP response as it is coming in, or of spooling it off to disk.  It keeps the entire body of the response in memory until the download is complete.  In my test, I was requesting a web resource that was very large (4MB - 6MB).   With its default heap size, and many threads running simultaneously, the agent process simply could not handle this level of traffic.
&lt;p&gt;
The trick was in how to give the agent more heap.  The standard technique -- passing in heap-related arguments (-Xms, -Xmx) to the JVM when starting the agent was having no effect.  This is because the main Java process spawns new Java instances to do the actual work, and these sub-instances had no knowledge of my settings.   To pass these heap arguments to the JVM sub-processes, add a line to your grinder.properties file, and everything will work well:&lt;p&gt;
&lt;pre&gt;
grinder.jvm.arguments=-Xms300M -Xmx1600M
&lt;/pre&gt;&lt;p&gt;In the original post, there was  some discussion about using native code such as libcurl to do the heavy-lifting here, but fortunately that has proven not to be necessary..
&lt;p&gt;&lt;br /&gt;


&lt;span style="font-weight: bold;"&gt;Minor Issues&lt;/span&gt;
&lt;p&gt;
&lt;span style="font-style: italic;"&gt;Bandwidth Throttling / Slow Sockets&lt;/span&gt;
&lt;p&gt;
Bandwidth throttling, AKA slow sockets, is the name for a feature that allows each socket connection to the server to communicate at a specified bitrate, as opposed to downloading everything at wire speed as fast as possible.  This is desirable because for any given level of transactions per second, the server will be working harder if it is servicing a large number of slow connections as opposed to a small number of very fast connections.  So this allows the load tester to set up a far more realistic scenario, modeling the real-world use of many devices with varying network speeds connecting to the server.
&lt;p&gt;
And there is good news on this issue.  By request, Phil Aston, the primary developer of The Grinder, has implemented this feature.  I tested early Grinder builds with this feature, and am happy to say with confidence that the current implementation behaves correctly, is robust, and scalable.  Awesome.
&lt;p&gt;
The feaure is implemented as method HTTPPluginConnection.setBandwidthLimit -- details here:&lt;p&gt;

&lt;a href="http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/plugin/http/HTTPPluginConnection.html#setBandwidthLimit%28int%29"&gt;http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/plugin/http/HTTPPluginConnection.html#setBandwidthLimit(int)&lt;/a&gt;


&lt;p&gt;
&lt;span style="font-style: italic;"&gt;Load Scheduling&lt;/span&gt;
&lt;p&gt;
There is still not full-on load scheduler for The Grinder like there is for Load Runner.  Thread execution is all or nothing.  However, there is a neat little workaround that takes away most of the sting.  If you just want your threads to ramp in smoothly over time in a linear fashion, you can have each thread sleep for a period of time before beginning execution, with higher-numbered threads sleeping progressively longer.
&lt;p&gt;
Be sure the module containing your TestRunner class imports the grinder:

&lt;pre&gt;
from net.grinder.script.Grinder import grinder
&lt;/pre&gt;

Then put this code into the __init__ method of your TestRunner class:

&lt;pre&gt;
      # rampTime is defined outside this snippet, it is the amount
      # of time (in ms) between the starting of each thread.
      sleepTime=grinder.threadID * rampTime
      grinder.sleep( sleepTime, 0 )
&lt;/pre&gt;

&lt;p&gt;
&lt;span style="font-style: italic;"&gt;Results Reporting&lt;/span&gt;
&lt;p&gt;
The Grinder's results reporting an analysis features are weak.  I am currently working on a data-warehousing system that stores the transaction data from each run, enabling detailed post-run processing and analysis.  Details in subsequent blog entries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-116263105452980316?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/116263105452980316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=116263105452980316' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/116263105452980316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/116263105452980316'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2006/11/grinder-addressing-warts.html' title='The Grinder: Addressing the Warts'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-115035332067654999</id><published>2006-06-14T23:34:00.000-07:00</published><updated>2006-11-05T21:31:20.590-08:00</updated><title type='text'>Shootout: Load Runner vs The Grinder vs Apache JMeter</title><content type='html'>&lt;style type="text/css"&gt;&lt;br /&gt;    &lt;!--         @page { size: 8.5in 11in; margin: 0.79in }         P { margin-bottom: 0.08in }         H1 { margin-bottom: 0.08in }         H1.western { font-family: "Nimbus Sans L", sans-serif; font-size: 16pt; margin-top: 2.2em }         H1.cjk { font-size: 16pt }         H1.ctl { font-family: "Lucidasans"; font-size: 16pt }         H2 { margin-bottom: 0.08in }         H2.western { font-family: "Nimbus Sans L", sans-serif; font-size: 14pt; font-style: italic }         H2.cjk { font-family: "HG Mincho Light J"; font-size: 14pt; font-style: italic }         H2.ctl { font-family: "Lucidasans"; font-size: 14pt; font-style: italic }         H3 { margin-bottom: 0.08in }         H3.western { font-family: "Nimbus Sans L", sans-serif; font-size: 12pt }         H3.cjk { font-family: "HG Mincho Light J" }         H3.ctl { font-family: "Lucidasans" }         H4 { margin-bottom: 0.08in }         H4.western { font-family: "Nimbus Sans L", sans-serif; font-size: 11pt; font-style: italic }         H4.cjk { font-family: "HG Mincho Light J"; font-size: 11pt; font-style: italic }         H4.ctl { font-family: "Lucidasans"; font-size: 11pt; font-style: italic }         TD P { margin-bottom: 0in }         TH P { margin-bottom: 0in; font-style: italic }         PRE { font-family: "Nimbus Mono L", monospace }     --&gt;&lt;br /&gt;    &lt;/style&gt;
&lt;h1 class="western"&gt;1 INTRODUCTION&lt;/h1&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;I recently needed to recommend a tool to use for a scalability testing
project, and I was in the fortunate situation of having some time to survey the field,
and to look into the top contenders in greater depth.  From an
original list of over 40 candidates, I selected three finalists in the open-source and commercial categories.
I then took some time to look at
them in detail, to determine which tool to recommend for the ongoing
scale testing effort.  Since I have seen several questions about how
these tools compare to each other on various mailing lists, I'm sharing
my findings here in the hopes that others will find them useful.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;My three finalists were Load Runner, from Mercury Interactive;
JMeter, from the Apache foundation, and The Grinder, an open-source
project hosted on SourceForge.
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;h1 class="western" style="page-break-before: always;"&gt;2 SUMMARY OF
RESULTS&lt;/h1&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt; I
found that I could use any of them and get a reasonably good amount
of scale test coverage.  Each tool has unique things it does very
well, so in that sense, there is no “wrong answer.”  Conversely,
each of the tools I considered have unique deficiencies that will
impede or block one or more of the scenarios in our test plan.  So
there is no “right answer” either – any option selected will be
something of a trade-off.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Based on this research, I recommended The Grinder as the tool to go
forward with.  It has a simple, clean UI that clearly shows what is
going on without trying to do too much, and offers great power and
simplicity with its unique Jython-based scripting approach.  Jython
allows complex scripts to be developed much more rapidly than in more
formal languages like Java, yet it can access any Java library or
class easily, allowing us to re-use elements of our existing work.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Mercury's Load Runner had a largely attractive feature set, but I
ultimately disqualified it due to shortcomings in these make-or-break
areas:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;Very high price to license the software.&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Generating unlimited load is not permitted.  With the amount
 of load our license allows, I will be unable to effectively test important
 clustered server configurations, as well as many of our “surge”
 scenarios.&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Very weak server monitoring for Solaris environments.  No
 support for monitoring Solaris 10.
 &lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;JMeter was initially seen as an attractive contender, with its
easy, UI-based script development, as well as script management and
deployment features.  It's UI is feature-rich and this product has
the Apache branding.  It was ultimately brought down by the bugginess
of it's UI though, as several of it's key monitors gave incorrect
information or simply didn't work at all.&lt;/p&gt;
&lt;h1 class="western" style="page-break-before: always;"&gt;3 Comparison
Tables&lt;/h1&gt;
&lt;p&gt;All the items in the tables below are discussed in greater detail
in the following sections.  These tables are to give a quick overview
&lt;/p&gt;
&lt;h2 class="western"&gt;3.1 Critical Items&lt;/h2&gt;
&lt;p&gt;There are several features that are key to any scale testing
effort.  Items in this table are key to our efforts.  Not having any
of these will seriously impact our ability to generate complete scale
test coverage.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;dl&gt;
 &lt;dd&gt;
 &lt;table style="" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="587"&gt;
     &lt;col width="210"&gt;
     &lt;col width="151"&gt;
     &lt;col width="85"&gt;
     &lt;col width="107"&gt;
     &lt;thead&gt;
         &lt;tr valign="top"&gt;
             &lt;th bgcolor="#ff9966" width="210"&gt;
                 &lt;p&gt;Item&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ff9966" width="151"&gt;
                 &lt;p&gt;Load Runner&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ff9966" width="85"&gt;
                 &lt;p&gt;JMeter&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ff9966" width="107"&gt;
                 &lt;p&gt;The Grinder&lt;/p&gt;
             &lt;/th&gt;
         &lt;/tr&gt;
     &lt;/thead&gt;
     &lt;tbody&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.1." server="" monitoring="" windows="" solaris="" outline=""&gt;Solaris
                 Monitoring&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;i&gt;&lt;b&gt;-&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.2." can="" generate="" unlimited="" outline=""&gt;Unlimited
                 Load generation&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.4." can="" support="" ip="" outline=""&gt;Supports IP
                 spoofing&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.3." capacity="" of="" single="" agent="" to="" generate="" load="" particularly="" in="" bandwidth="" outline=""&gt;Large
                 download performance&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;i&gt;&lt;b&gt;- &lt;span style="color: rgb(0, 0, 0);"&gt;*&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
     &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;i&gt;* Multiple workarounds are being investigated, including
calling native (libcurl) code for the most intensive downloads.&lt;/i&gt;&lt;/p&gt;
&lt;h2 class="western"&gt;3.2 Non-Critical Items&lt;/h2&gt;
&lt;p&gt;Items in this section are not make-or-break to our test effort,
but will go a long way to making the test effort more effective.&lt;/p&gt;
&lt;h3 class="western"&gt;3.2.1 General&lt;/h3&gt;
&lt;dl&gt;
 &lt;dd&gt;
 &lt;table style="" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="587"&gt;
     &lt;col width="210"&gt;
     &lt;col width="151"&gt;
     &lt;col width="85"&gt;
     &lt;col width="107"&gt;
     &lt;thead&gt;
         &lt;tr valign="top"&gt;
             &lt;th bgcolor="#ccccff" width="210"&gt;
                 &lt;p&gt;Item&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="151"&gt;
                 &lt;p&gt;Load Runner&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="85"&gt;
                 &lt;p&gt;JMeter&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="107"&gt;
                 &lt;p&gt;The Grinder&lt;/p&gt;
             &lt;/th&gt;
         &lt;/tr&gt;
     &lt;/thead&gt;
     &lt;tbody&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.1." server="" monitoring="" windows="" solaris="" outline=""&gt;Server
                 monitoring&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;i&gt;mixed&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.3." can="" run="" in="" batch="" interactive="" outline=""&gt;Batch
                 Mode&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#3.4.1.1." outline=""&gt;Ease - Installation&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#3.4.2.2." setting="" up="" simple="" outline=""&gt;Ease –
                 Script Authoring&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;i&gt;mixed&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#3.4.1.3." running="" outline=""&gt;Ease – Running
                 Tests&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.5." results="" outline=""&gt;Results Reporting&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.6." simplicity="" of="" agent="" outline=""&gt;Agent
                 Management&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.7." tool="" is="" outline=""&gt;Cross Platform&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.8." outline=""&gt;Cost&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.9." intended="" technical="" outline=""&gt;Technical
                 Level&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.10." outline=""&gt;Stability/Bugginess&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
     &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;h3 class="western"&gt;3.2.2 Agents&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;&lt;dl&gt;
 &lt;dd&gt;
 &lt;table style="" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="587"&gt;
     &lt;col width="210"&gt;
     &lt;col width="151"&gt;
     &lt;col width="85"&gt;
     &lt;col width="107"&gt;
     &lt;thead&gt;
         &lt;tr valign="top"&gt;
             &lt;th bgcolor="#ccccff" width="210"&gt;
                 &lt;p&gt;Item&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="151"&gt;
                 &lt;p&gt;Load Runner&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="85"&gt;
                 &lt;p&gt;JMeter&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="107"&gt;
                 &lt;p&gt;The Grinder&lt;/p&gt;
             &lt;/th&gt;
         &lt;/tr&gt;
     &lt;/thead&gt;
     &lt;tbody&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.1." power="" of="" outline=""&gt;Transaction
                 power&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;i&gt;&lt;b&gt;+&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.2.Other" outline=""&gt;Custom protocols&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.2.1." which="" protocols="" are="" supported="" out="" of="" the="" outline=""&gt;Out-of-the-box
                 protocols&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.2.2." custom="" protocols="" can="" transactions="" wrap="" multiple="" http="" or="" other="" requests="" to="" the="" outline=""&gt;Transaction
                 aggregation&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.3." capacity="" of="" single="" agent="" to="" generate="" load="" particularly="" in="" bandwidth="" outline=""&gt;Scalability
                 of Agent&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.5." can="" support="" variable="" connection="" bandwidth="" outline=""&gt;Slow
                 sockets&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.6." can="" run="" arbitrary="" logic="" and="" external="" libraries="" within="" outline=""&gt;External
                 libs usable&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#5.7." outline=""&gt;Load Scheduling&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#4.8." ease="" of="" porting="" outline=""&gt;Ease of porting
                 JCS&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
     &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;h3 class="western"&gt;3.2.3 Controller&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;&lt;dl&gt;
 &lt;dd&gt;
 &lt;table style="" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="587"&gt;
     &lt;col width="210"&gt;
     &lt;col width="151"&gt;
     &lt;col width="85"&gt;
     &lt;col width="107"&gt;
     &lt;thead&gt;
         &lt;tr valign="top"&gt;
             &lt;th bgcolor="#ccccff" width="210"&gt;
                 &lt;p&gt;Item&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="151"&gt;
                 &lt;p&gt;Load Runner&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="85"&gt;
                 &lt;p&gt;JMeter&lt;/p&gt;
             &lt;/th&gt;
             &lt;th bgcolor="#ccccff" width="107"&gt;
                 &lt;p&gt;The Grinder&lt;/p&gt;
             &lt;/th&gt;
         &lt;/tr&gt;
     &lt;/thead&gt;
     &lt;tbody&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#6.1." ability="" controller="" to="" handle="" high="" volume="" of="" agent="" outline=""&gt;Scalability
                 of Controller&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p style="font-style: normal;" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#6.2." time="" monitoring="" outline=""&gt;Real-time
                 test monitoring&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p style="" align="center"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;neutral&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#6.3." time="" load="" outline=""&gt;Real-time
                 load adjustment&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#6.4." side="" script="" outline=""&gt;Script
                 management&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr valign="top"&gt;
             &lt;td width="210"&gt;
                 &lt;p&gt;&lt;a href="#6.5." can="" write="" simple="" scripts="" in="" the="" outline=""&gt;Script
                 Development Environment&lt;/a&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="151"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="85"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(61, 235, 61);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
             &lt;td width="107"&gt;
                 &lt;p align="center"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
     &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h1 class="western" style="page-break-before: always;"&gt;4 GENERAL&lt;/h1&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="4.1. Server Monitoring -- windows, Solaris, etc.|outline"&gt;&lt;/a&gt;&lt;a name="4.1. Server Monitoring -- windows, Solaris, etc.|outline"&gt;&lt;/a&gt;
4.1 Server Monitoring -- Windows, Solaris, etc.&lt;/h2&gt;
&lt;h3 class="western"&gt;4.1.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Mercury is extremely strong in this area for Windows testing.
Unfortunately, it is very weak in unix/Solaris.  For windows hosts,
Load Runner uses the native performance counters available in
perfmon.  This allows monitoring myriad information from the OS, as
well as metrics from individual applications (such as IIS) that make
their information available to perfmon.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;For Solaris hosts, Load Runner is restricted to the performance
counters available via rpc.rstatd.  This means some very basic
information on CPU and memory use, but not much else.  &lt;span style="background: rgb(255, 255, 0) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-style: normal;"&gt;Note
that Load Runner does not currently support any kind of performance
monitoring on Solaris 10.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 class="western"&gt;4.1.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter has no monitoring built in.  Thus, wrapper scripts are
required to synchronize test data with external perf monitoring data.
This is the approach I used to great effect with our previous test
harness.  The advantage of this method is I can monitor (and graph!)
any information the OS makes available to us.    Since the amount of
data to us is quite large, this is a powerful technique.&lt;/p&gt;
&lt;h3 class="western"&gt;4.1.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The same wrapper-based approach would be required here as I
detailed above for JMeter.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.2. Can generate unlimited Load|outline"&gt;&lt;/a&gt;
4.2 Can generate unlimited load&lt;/h2&gt;
&lt;p&gt;This is a make-or-break item.  There are many scenarios I just
can't cover if I can only open a few thousand socket connections to
the server.&lt;/p&gt;
&lt;h3 class="western"&gt;4.2.1 Load Runner&lt;/h3&gt;
&lt;p&gt; Load runner restricts the number of vusers you can run.  Even
large amounts of money only allow a licence for a modest number of
users.  Historically, the rate for 10,000 HTTP vusers has been
$250,000.  However, on a per agent basis, load is generated very
efficiently so it may take less hardware to generate the same amount
of load.  (But for the money you spend on the load runner license,
you could buy a LOT of load generation hardware!)&lt;/p&gt;
&lt;h3 class="western"&gt;&lt;a name="4.2.2. JMeter|outline"&gt;&lt;/a&gt;4.2.2 JMeter&lt;/h3&gt;
&lt;p&gt;Since this is Free/Open Source, you may run as many agents as you
have hardware to put them on.  You can add more and more load
virtually forever, as long as you have more hardware to run
additional agents on.  However, in specific unicast scenarios, such
as repeatedly downloading very large files (like PIPEDSCHEDULE), the
ability of agents to generate load falls off abruptly due to memory
issues.&lt;/p&gt;
&lt;h3 class="western"&gt;4.2.3 The Grinder&lt;/h3&gt;
&lt;p&gt;In this matter the Grinder's story is the same as JMeter.  The
limit is only the number of Agents.  The Grinder suffers the same
lack of ability to effectively download large files as JMeter.  A
workaround that uses native code (libcurl) to send requests is being
investigated.&lt;/p&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="4.3. Can run in batch (non-interactive) |outline"&gt;&lt;/a&gt;4.3
Can run in batch (non-interactive) mode&lt;/h2&gt;
&lt;h3 class="western"&gt;4.3.1 Load Runner&lt;/h3&gt;
&lt;p&gt;No.  Hands-free runs can be scheduled with the scheduler, but
multiple specific scenarios cannot be launched from the command line.
This may be adequate for single tests; it's not clear how this would
work if a series of automated tests was desired.&lt;/p&gt;
&lt;h3 class="western"&gt;4.3.2 JMeter&lt;/h3&gt;
&lt;p&gt;Yes, the ability to do this is supported out of the box.  However,
it can only be run from a single agent; the distributed testing
mechanism requires the UI.  So for automated nightly benchmarks it
may be ok, but for push-to-failure testing where much load is
required, the UI is needed.  It would presumably be possible to have
a wrapper script launch JMeter in batch mode at the same time on
multiple agents.  This would achieve arbitrary levels of load, but
would not have valid data for collective statistics like total
transactions per second, total transactions, etc.&lt;/p&gt;
&lt;h3 class="western"&gt;4.3.3 The Grinder&lt;/h3&gt;
&lt;p&gt;As with JMeter, a single agent can be run from the command line.
See JMeter comments, above.&lt;/p&gt;
&lt;h2 class="western"&gt;4.4 Ease of Use&lt;/h2&gt;
&lt;h3 class="western"&gt;4.4.1 Load Runner&lt;/h3&gt;
&lt;h4 class="western"&gt;4.4.1.1 Installation&lt;/h4&gt;
&lt;p&gt;Installation takes a ton of time, a lot of disk space, and a very
specific version of Windows.  But it's as simple as running a windows
installer, followed by 3 or 4 product updaters.&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.1.2 Setting up Simple tests&lt;/h4&gt;
&lt;p&gt;For HTTP tests, Load Runner is strong in this category, with it's
browser recorder and icon-based scripts.&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.1.3 Running Tests&lt;/h4&gt;
&lt;p&gt;The UI of the controller is complex and a bit daunting.  There is
great power in the UI if you can find it.&lt;/p&gt;
&lt;h3 class="western"&gt;4.4.2 JMeter&lt;/h3&gt;
&lt;h4 class="western"&gt;4.4.2.1 Installation&lt;/h4&gt;
&lt;p&gt;Be sure Sun's JRE is installed.  Unpack the tar file.  Simple.&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.2.2 Setting up Simple tests&lt;/h4&gt;
&lt;p&gt;Very quick.  Start up the console, a few clicks of the mouse, and
you are ready to generate load.  Add thread group, add a sampler, and
you have the basics.  Throw in an assertion or two on your sampler to
validate server responses.
&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.2.3 Running Tests&lt;/h4&gt;
&lt;p&gt;Both distributed and local tests can be started form the UI.  A
menu shows the available agents, and grays out the ones that are
already busy.  Standalone tests can be started from the command line.
JMeter wins this category hands down.&lt;/p&gt;
&lt;h3 class="western"&gt;4.4.3 The Grinder&lt;/h3&gt;
&lt;h4 class="western"&gt;4.4.3.1 Installation&lt;/h4&gt;
&lt;p&gt;Installation is as simple as installing java, and unpacking a tar
file.&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.3.2 Setting up Simple tests&lt;/h4&gt;
&lt;p&gt;Setting up tests, even simple tests, requires writing Jython code.
So developer experience is important.  A proxy script recorder is
included to simplify this.  In addition, there are many useful
example scripts included to help you get started.&lt;/p&gt;
&lt;h4 class="western"&gt;4.4.3.3 Running Tests&lt;/h4&gt;
&lt;p&gt;Involves configuring a Grinder.properties file, manually starting
an agent process, manually starting the console, then telling the
test to run from within the console UI.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.5. Results Reporting|outline"&gt;&lt;/a&gt;4.5
Results Reporting&lt;/h2&gt;
&lt;h3 class="western"&gt;4.5.1  Auto-generated?&lt;/h3&gt;
&lt;p&gt;Having key graphs generated at the conclusion of a scale run, such
as load over time, server CPU, transactions per second, etc, can save
a lot of tedium, since manually generating these graphs from log
files is quite time consuming.&lt;/p&gt;
&lt;h4 class="western"&gt;4.5.1.1 Load Runner&lt;/h4&gt;
&lt;p&gt;Load runner has an excellent integrated analysis tool that can
dynamically generate graphs on any of the myriad performance counters
available to it.  The downfall of this approach is that there are
only a small number of performance metrics it can gather on Solaris.
And while I can gather additional server metrics using sar, vmstat,
dtrace, iostat, mpstat, etc., integrating this information in to the
load runner framework will be difficult at best.&lt;/p&gt;
&lt;h4 class="western"&gt;4.5.1.2 JMeter&lt;/h4&gt;
&lt;p&gt;JMeter does not gather &lt;i&gt;any&lt;/i&gt; server-side performance metrics.
But it can generate a limited number of client-side graphs while the
test is in progress.  These graphs can be saved after the tes is
over.  Fortunately, all the test data is written in a standard
format.  So it probably makes more sense to generate all the desired
graphs via shell scripts during post-processing.  This is the same
approach I used with our previous test harness.&lt;/p&gt;
&lt;h4 class="western"&gt;4.5.1.3 The Grinder&lt;/h4&gt;
&lt;p&gt; Like with JMeter, there are no graphs generated out of the box,
but with the standard-format log files, scripted post-production is
reasonably straightforward, giving us a powerful and flexible view on
the results.&lt;/p&gt;
&lt;h3 class="western"&gt;4.5.2 Analysis tools?&lt;/h3&gt;
&lt;h4 class="western"&gt;4.5.2.1 Load Runner&lt;/h4&gt;
&lt;p&gt;Yes very powerful tool for doing analysis after a run.  An
infinite number of customized graphs can be generated.  These graphs
can be exported into an html report.&lt;/p&gt;
&lt;h4 class="western"&gt;4.5.2.2 JMeter&lt;/h4&gt;
&lt;p&gt;Nothing included.  I would want to transfer over some of the
scripts used in our previous test harness, or write a simple tool
that dumps test data into a DB for post-analysis.&lt;/p&gt;
&lt;h4 class="western"&gt;4.5.2.3 The Grinder&lt;/h4&gt;
&lt;p&gt;Nothing included.  See the JMeter comments, above.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.6. Simplicity of Agent management|outline"&gt;&lt;/a&gt;
4.6 Simplicity of Agent management&lt;/h2&gt;
&lt;h3 class="western"&gt;4.6.1 Load Runner&lt;/h3&gt;
&lt;p&gt;This works well in Load Runner; each agent can run as a service or
an application, simplifying management.  Test scripts are
auto-deployed to agents.&lt;/p&gt;
&lt;h3 class="western"&gt;4.6.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter is good here.  Each agent is a server that the controller
can connect to at will in real-time.  Test scripts are automatically
sent to each agent, centralizing management.&lt;/p&gt;
&lt;h3 class="western"&gt;4.6.3 The Grinder&lt;/h3&gt;
&lt;p&gt;Grinder is the weakest here. The properties files that define how
much load to apply, must be manually deployed to all agents.  A
wrapper shell script like the one used by our previous test harness
could address this by always deploying the Jython scripts to the
agents before each run.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.7. Tool is cross-platform|outline"&gt;&lt;/a&gt;
4.7 Tool is cross-platform&lt;/h2&gt;
&lt;h3 class="western"&gt;4.7.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Not really.  A subset of the complete agent functionality can be
had for agents running on Linux or Solaris.  Non-windows agents run
each vuser as a process rather than a thread, reducing the amount of
load an agent can produce.  The controller and VUGen both are
Windows-only.  And Load Runner is poor at measuring non-Windows
server statistics.&lt;/p&gt;
&lt;h3 class="western"&gt;4.7.2 JMeter&lt;/h3&gt;
&lt;p&gt;Yes. Java/Swing app is platform-agnostic.&lt;/p&gt;
&lt;h3 class="western"&gt;4.7.3 The Grinder&lt;/h3&gt;
&lt;p&gt;Yes.  This app is based on Java, Swing, and Jython.  Like JMeter,
it will run anywhere you can set up a JVM.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.8. Ease of Porting JCS|outline"&gt;&lt;/a&gt;&lt;a name="4.8. Cost|outline"&gt;&lt;/a&gt;
4.8 Cost&lt;/h2&gt;
&lt;h3 class="western"&gt;4.8.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Expect to pay in the low to mid six-figures for a license allowing
any kind of robust load-generation capacity.  But that's not all,
there are high ongoing support costs as well.  For the same kind of
money I could get over 100 powerful machines to use as scale agents,
as well as associated network switches, cabling, etc.&lt;/p&gt;
&lt;h3 class="western"&gt;4.8.2 JMeter&lt;/h3&gt;
&lt;p&gt;Free.  (Apache License)&lt;/p&gt;
&lt;h3 class="western"&gt;4.8.3 The Grinder&lt;/h3&gt;
&lt;p&gt;Free.  (Grinder License)&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="4.9. Intended audience/technical level|outline"&gt;&lt;/a&gt;
4.9 Intended audience/technical level&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h3 class="western"&gt;4.9.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner has the widest audience of all these tools; perhaps
not surprising given its maturity as a commercial product.  It's
browser-recording and icon-based script development give it the
lowest technical barriers to entry of any of the three products.  A
QA engineer with modest technical background and little to no coding
skills can still be productive with tool.  And it's ability to load
Windows .dll's and other libraries give it a power and flexibility
useful to developers and other more advanced users.&lt;/p&gt;
&lt;h3 class="western"&gt;4.9.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter does not require developer skills to perform basic tests in
any of the protocols it support out of the box.  A form-driven UI
allows the user to design their own scenario.  This scenario is then
auto-deployed to all agents during test initialization.&lt;/p&gt;
&lt;h3 class="western"&gt;4.9.3 The Grinder&lt;/h3&gt;
&lt;p&gt;While it's possible that a regular QA engineer could be used to
run the console and perform some testing, the tool is really more
aimed at developers.  This is the only tool of the three that did not
include any kind of icon-based or UI-based script development.  At a
minimum, users will need to know how to write Python/Jython code to
create simple test scripts, and the ability to write custom Java
classes may be required as well, depending on the scenario.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h2 class="western"&gt;&lt;a name="4.10. Stability/Bugginess|outline"&gt;&lt;/a&gt;4.10
Stability/Bugginess&lt;/h2&gt;
&lt;h3 class="western"&gt;4.10.1 Load Runner&lt;/h3&gt;
&lt;p&gt;The controller crashes occasionally under heavy load, but this is
infrequent and largely manageable.  Other than this, the product
seems robust enough.&lt;/p&gt;
&lt;h3 class="western"&gt;4.10.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter fares poorly in this area.&lt;/p&gt;
&lt;p&gt;TODO&lt;/p&gt;
&lt;h3 class="western"&gt;4.10.3 The Grinder&lt;/h3&gt;
&lt;p&gt;I found no issues with the Grinder, other than the
&lt;a href="#4.2.2." outline=""&gt;previously-mentioned&lt;/a&gt; memory
issue with large file downloads.&lt;/p&gt;
&lt;h1 class="western" style="page-break-before: always;"&gt;5 AGENTS&lt;/h1&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="5.1. Power of transactions|outline"&gt;&lt;/a&gt;5.1 Power of
transactions&lt;/h2&gt;
&lt;h3 class="western"&gt;5.1.1 how flexible on what can be passed/failed?&lt;/h3&gt;
&lt;h4 class="western"&gt;5.1.1.1 Load Runner&lt;/h4&gt;
&lt;p&gt;Any arbitrary criteria can be set to define if a transaction
passes.  This includes but is not limited to response time, contents
of response body, response code, or just about anything else.&lt;/p&gt;
&lt;h4 class="western"&gt;5.1.1.2 JMeter&lt;/h4&gt;
&lt;p&gt;In JMeter, samplers generate your test requests.  You can add a
wide variety of assertion types to any of your samplers.  These will
allow you assert on response code, match regular expressions against
the response body, assert on the size or md5sum of the response.&lt;/p&gt;
&lt;h4 class="western"&gt;5.1.1.3 The Grinder&lt;/h4&gt;
&lt;p&gt;As with Load Runner, pass/fail criteria has merely to be defined
within the test script.  Criteria can be whatever you want.&lt;/p&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h3 class="western"&gt;
5.1.2 user-defined transaction/statistic types?&lt;/h3&gt;
&lt;h4 class="western"&gt;5.1.2.1 Load Runner&lt;/h4&gt;
&lt;p&gt;Yes – if you get away from the icon-based view in Vugen and go
to the code level, you can wrap anything you want in a transaction to
get timing information, pass/fail data, etc.&lt;/p&gt;
&lt;h4 class="western"&gt;5.1.2.2 JMeter&lt;/h4&gt;
&lt;p&gt;Yes – done through plugins.&lt;/p&gt;
&lt;h4 class="western"&gt;5.1.2.3 The Grinder&lt;/h4&gt;
&lt;p&gt;Yes – an API exists to easily wrap any Java or Jython method in
a transaction.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="5.2.Other Protocols|outline"&gt;&lt;/a&gt;5.2
Other Protocols&lt;/h2&gt;
&lt;h3 class="western"&gt;&lt;a name="5.2.1. Which protocols are supported out of the box_|outline"&gt;&lt;/a&gt;
5.2.1 Which protocols are supported out of the box?&lt;/h3&gt;
&lt;h4 class="western"&gt;5.2.1.1 Load Runner&lt;/h4&gt;
&lt;p&gt;This varies by the type of license purchased, with each protocol
having a separate cost and a separate limit for the number of
allowable VUsers.  The potential number of protocols is extremely
high, including Java, ODBC, FTP, HTTP, and others.&lt;/p&gt;
&lt;h4 class="western"&gt;5.2.1.2 JMeter&lt;/h4&gt;
&lt;p&gt;Supports several protocols out of the box:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;jdbc&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;http&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;ftp&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;jndi&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h4 class="western"&gt;5.2.1.3 The Grinder&lt;/h4&gt;
&lt;p&gt;The Grinder only supports HTTP out of the box.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h3 class="western"&gt;&lt;a name="5.2.2. Can transactions wrap custom (non-http) protocols_  Can transactions wrap multiple (http or other) requests to the server_|outline"&gt;&lt;/a&gt;
5.2.2 Can transactions wrap custom (non-http) protocols?  Can
transactions wrap multiple (http or other) requests to the server?&lt;/h3&gt;
&lt;h4 class="western"&gt;5.2.2.1 Load Runner&lt;/h4&gt;
&lt;p&gt;Yes.  There are multiple ways to do this.  You can implement your
own protocol handler in a .dll or in Load Runner's pseudo-c.  Then
you can invoke this handler from any type of VUser that you have a
license for.  Alternately, unless your protocol is something
uncommon, you can probably buy a pre-existing implementation of your
protocol, and licenses for VUsers to run this protocol.&lt;/p&gt;
&lt;h4 class="western"&gt;5.2.2.2 JMeter&lt;/h4&gt;
&lt;p&gt;Yes.  An external Java plugin that supports your protocol must be
added in to JMeter to support this.&lt;/p&gt;
&lt;h4 class="western"&gt;5.2.2.3 The Grinder&lt;/h4&gt;
&lt;p&gt;Any protocol can be tested with the Grinder.  An HTTP plugin is
included.  In other cases, you will create a separate Java class that
implements a handler for your protocol.  In your test script, you
will wrap this Java class in a Grinder test object.  Your protocol is
used/invoked by calling any method you want from your java class via
the test wrapper.  The wrapper will pass/fail the transaction based
on response time.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;This default behavior can be overridden with additional code in
your Jython script.  For example, after invoking your protocol
method, you could inspect the state of your Java object and pass/fail
the transaction based on information there.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h2 class="western"&gt;&lt;a name="5.3. Capacity of single agent to generate load, particularly in high-bandwidth scenarios|outline"&gt;&lt;/a&gt;&lt;a name="5.3. Capacity of single agent to generate load, particularly in high-bandwidth scenarios|outline"&gt;&lt;/a&gt;
5.3 Capacity of single agent to generate load, particularly in
high-bandwidth scenarios&lt;/h2&gt;
&lt;p&gt;I have typically seen libraries like Apache's HTTPClient max out
the CPU to 100% when it's conducting high-bandwidth, large file
downloads.  The library supports high bandwidth use and many
transactions per second just fine, but has issues with repeated large
file downloads.&lt;/p&gt;
&lt;h3 class="western"&gt;5.3.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Per-agent load generation capacity is strong.  Licensing
constraints may limit actual load generated.&lt;/p&gt;
&lt;h3 class="western"&gt;5.3.2 JMeter&lt;/h3&gt;
&lt;p&gt;With the exception of the high-bandwidth case, per agent capacity
is good.&lt;/p&gt;
&lt;h3 class="western"&gt;5.3.3 The Grinder&lt;/h3&gt;
&lt;p&gt;Runs out of memory when repeatedly downloading large documents in
many threads.  Currently, there does not seem to be a workaround
inside The Grinder itself.  However, with my previous test harness I
was able to work around this same issue by calling native code, and
there is reason to believe that approach may work here as well.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="5.4. Can support IP spoofing|outline"&gt;&lt;/a&gt;
5.4 Can support IP spoofing&lt;/h2&gt;
&lt;p&gt;Assuming a large range of valid IP addresses assigned to the agent
machines, does the test harness support binding outgoing requests to
arbitrary IP addresses?  The ability to support this is critical for
out test effort.  If all broker requests come in from the same IP
address, the broker thrashes unrealistically as it continually
updates customer settings.&lt;/p&gt;
&lt;h3 class="western"&gt;5.4.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Yes. (see link in appendix 1)&lt;/p&gt;
&lt;h3 class="western"&gt;5.4.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter is weak here.  There is a new mechanism (not yet released
but available in nightly builds) where outbound requests can
round-robin on a predetermined list of local IPs.  This is not good
enough for Fat Client simulation.&lt;/p&gt;
&lt;h3 class="western"&gt;5.4.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The local IP address to bind the outbound request to can be
specified in the Jython scripts.  This is just what I need.&lt;/p&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="5.5. Can support variable connection speed/bandwidth throttling|outline"&gt;&lt;/a&gt;
5.5 Can support variable connection speed/bandwidth throttling&lt;/h2&gt;
&lt;h3 class="western"&gt;5.5.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner supports this out of the box.&lt;/p&gt;
&lt;h3 class="western"&gt;5.5.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter does not support this out of the box, but there is a slow
socket implementation in the wild, written for the Apache HTTP Client
(which JMeter uses), that should be possible to drop in fairly
easily.&lt;/p&gt;
&lt;h3 class="western"&gt;5.5.3 The Grinder
&lt;/h3&gt;
&lt;p&gt;The Grinder does not support this.  It may be possible with
additional code hacking, but the path for this is not clear.  Their
third-party HTTP implementation means writing a custom solution may
be challenging.  Perhaps it would be possible using JNI and libCurl,
although the author of the libCurl binding suggest there may be a
memory leak in the C layer.&lt;/p&gt;
&lt;pre&gt;
&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="5.6. Can run arbitrary logic and external libraries within agent|outline"&gt;&lt;/a&gt;
5.6 Can run arbitrary logic and external libraries within agent&lt;/h2&gt;
&lt;h3 class="western"&gt;5.6.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Windows .dll's may be loaded.  Home-made libraries written in Load
Runner's pseudo-C libs work fine as well.  Additionally, function
libraries can be embedded directly in the  virtual user script.&lt;/p&gt;
&lt;h3 class="western"&gt;5.6.2 JMeter&lt;/h3&gt;
&lt;p&gt;External Java libraries can be accessed via the plugin
architecture.&lt;/p&gt;
&lt;h3 class="western"&gt;5.6.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The Grinder offers lots of flexibility for loading and executing
third party libraries.  With Jython, any Java code may be called, and
most python code may be run unchanged.  And there is a decent
collection of example scripts that comes with the Grinder
distribution.&lt;/p&gt;
&lt;pre&gt;
&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="5.7. Scheduling|outline"&gt;&lt;/a&gt;5.7 Scheduling&lt;/h2&gt;
&lt;h3 class="western"&gt;5.7.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner has a powerful, UI-based scheduling tool which allows
you great flexibility to schedule arbitrary amounts of load over
time.  Load can be incrementally stepped up and stepped down, by
single threads or entire groups.  There is a graphical schedule
builder that can generate schedules of arbitrary complexity.&lt;/p&gt;
&lt;h3 class="western"&gt;5.7.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter has UI-based scheduling that allows per-thread startup
delays, as well as runs that start in the future.  JMeter tests can
run forever, for a specified time interval, or for a specified number
of iterations for each thread.&lt;/p&gt;
&lt;h3 class="western"&gt;5.7.3 The Grinder&lt;/h3&gt;
&lt;p&gt;No per-thread ramp-in. No generic scheduling tool.  Primitive
per-process (instead of per-thread) scheduling is possible but use of
this feature probably reduces an Agent's maximum load-generation
capacity, as the overhead of running a new process is far greater
than the overhead of creating a new thread.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h1 class="western" style="page-break-before: always;"&gt;6 CONTROLLER&lt;/h1&gt;
&lt;pre&gt;&lt;/pre&gt;&lt;h2 class="western"&gt;
&lt;a name="6.1. Ability of Controller to handle high volume of agent data|outline"&gt;&lt;/a&gt;
6.1 Ability of Controller to handle high volume of agent data&lt;/h2&gt;
&lt;h3 class="western"&gt;6.1.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load runner probably handles as much or more real-time data as any
product out there.  But they do it effectively.  If you give the
controller a beefy box to run on, you should have no problems.&lt;/p&gt;
&lt;h3 class="western"&gt;6.1.2 JMeter&lt;/h3&gt;
&lt;p&gt;Limited.  The amount of transaction monitors you can have running
is configurable.  If more that one or two are going and the agents
are producing a lot of transaction data, the UI takes all the CPU,
bogs down and becomes unusable.&lt;/p&gt;
&lt;h3 class="western"&gt;6.1.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The grinder does very well here, probably better than Load Runner.
By design, the agents only send a limited amount of real-time data
back to the controller during a test run.  And the sampling period is
adjustable with a big friendly slider.  This is a handy feature I
didn't fully appreciate at first – if the network bandwidth numbers
are updating too fast, it's hard to see how many digits are in the
number before it updates again.  But with the slider, you can lock
that number down for enough time to really consider it.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="6.2. Real-Time Monitoring (Controller)|outline"&gt;&lt;/a&gt;
6.2 Real-Time Monitoring (Controller)&lt;/h2&gt;
&lt;h3 class="western"&gt;6.2.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner features very strong real-time monitoring in the
controller.  Client side graphs, such as total transactions per
second, errors per second, can be displayed next to server side
graphs like CPU use and disk activity.  The user can drag and drop
from a list of dozens of graph types.&lt;/p&gt;
&lt;h3 class="western"&gt;6.2.2 JMeter&lt;/h3&gt;
&lt;p&gt;Basic, table-based monitoring similar to what is in our previous
test harness works properly.  Other monitors threw null pointer
exceptions.&lt;/p&gt;
&lt;h3 class="western"&gt;6.2.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The Grinder is good here.  It has simple, sliding performance
graphs for all transactions in one tab.  These graphs are similar to
what you see in the Windows Task Manager, where performance metrics
older than a given amount of time slide off the left side of the
graph.  In addition, as in our previous test harness or JMeter, there
is numeric data that periodically updates in a table.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="6.3. Real-Time Load Adjustment|outline"&gt;&lt;/a&gt;
6.3 Real-Time Load Adjustment&lt;/h2&gt;
&lt;p&gt;Sometimes while a test is in progress, you want to make
adjustments.  Increase the load.  Decrease the load.  Bring another
agent online.&lt;/p&gt;
&lt;h3 class="western"&gt;6.3.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner wrote the book on this topic, with its highly-flexible
ability to start and stop load in the middle of a test, with
individual agents, groups of agents, or the entire set of agents.&lt;/p&gt;
&lt;h3 class="western"&gt;6.3.2 JMeter&lt;/h3&gt;
&lt;p&gt;JMeter has the ability to interactively start and stop load on an
agent-by-agent basis.  It cannot interactively be done at the
per-thread level, but agents and thread groups can have schedulers
assigned to them.&lt;/p&gt;
&lt;h3 class="western"&gt;6.3.3 The Grinder&lt;/h3&gt;
&lt;p&gt;The Grinder console does not have the ability to dynamically
adjust the levels of load being generated by the agents.  Coupled
with its lack of a scheduler, this makes the Grinder the least
flexible of the three tools when it comes to interactively setting
load levels.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="6.4. Controller-side script management/deployment|outline"&gt;&lt;/a&gt;
6.4 Controller-side script management/deployment&lt;/h2&gt;
&lt;h3 class="western"&gt;6.4.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;h3 class="western"&gt;6.4.2 JMeter&lt;/h3&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;h3 class="western"&gt;6.4.3 The Grinder&lt;/h3&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;h2 class="western"&gt;&lt;a name="6.5. Can write simple scripts in the UI_|outline"&gt;&lt;/a&gt;
6.5 Can write simple scripts in the UI?&lt;/h2&gt;
&lt;h3 class="western"&gt;6.5.1 Load Runner&lt;/h3&gt;
&lt;p&gt;Load Runner comes with a powerful script-development tool, VUGen.
This gives the test developer the option of developing icon-based
test scripts, as well as the traditional code-view development
environment.  In addition. Load Runner can record web browser
sessions to auto-generate scripts based on the recorded actions.&lt;/p&gt;
&lt;h3 class="western"&gt;6.5.2 JMeter&lt;/h3&gt;
&lt;p&gt;Scripts are based on XML.  They can be written in your preferred
text editor, or created in an icon-based UI in the controller window.  I found this feature to be both easy to use and surprisingly flexible.
There is also a recorder feature to let you interactively create
your scripts.&lt;/p&gt;
&lt;h3 class="western"&gt;6.5.3 The Grinder&lt;/h3&gt;
&lt;p&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;The Grinder is the weakest
of the three here.  It&lt;/span&gt; does have a TCP Proxy feature that can
record browser sessions into Jython scripts.  But there is no
integrated graphical environment for script development&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h1 class="western" style="page-break-before: always;"&gt;7 CONCLUSION&lt;/h1&gt;
&lt;p&gt;I selected The Grinder due to several make-or-break issues.
However, each tool has unique strengths and weaknesses.  Which tool
is ultimately best for you depends on a number of things, such as:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;Does you budget allow for an expenditure ranging from several
 tens to hundreds of thousands of dollars?&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Will you be testing in a windows-only environment?&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;What is the technical level of your scale testers?&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Both of the open source projects have merits, but
neither one is ideal.  My approach will be to work with the
Grinder development team to resolve the most serious offenders.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p style="page-break-before: always;"&gt;


&lt;/p&gt;
&lt;h1 class="western"&gt;8 Appendix 1 – Additional information&lt;/h1&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Load Runner system requirements (controller must be on Windows!)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mercury.com/us/products/performance-center/loadrunner/requirements.html"&gt;http://www.mercury.com/us/products/performance-center/loadrunner/requirements.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Linux/Solaris server monitoring (weak)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mercury.com/us/products/performance-center/loadrunner/monitors/unix.html"&gt;http://www.mercury.com/us/products/performance-center/loadrunner/monitors/unix.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;JMeter home page&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jakarta.apache.org/jmeter/"&gt;http://jakarta.apache.org/jmeter/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;JMeter Manual&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jakarta.apache.org/jmeter/usermanual/index.html"&gt;http://jakarta.apache.org/jmeter/usermanual/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;The Grinder home page&lt;/p&gt;
&lt;p&gt;&lt;a href="http://grinder.sourceforge.net/"&gt;http://grinder.sourceforge.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;The Grinder Manual&lt;/p&gt;
&lt;p&gt;&lt;a href="http://grinder.sourceforge.net/g3/getting-started.html"&gt;http://grinder.sourceforge.net/g3/getting-started.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Windows IP address multi homing&lt;/p&gt;
&lt;p&gt;&lt;a href="http://support.microsoft.com/kb/q149426/"&gt;http://support.microsoft.com/kb/q149426/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p style="page-break-before: always;"&gt;


&lt;/p&gt;
&lt;h1 class="western"&gt;9 Appendix 2 – Distinguishing features&lt;/h1&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;These are some of the distinguishing features of each product:&lt;/p&gt;
&lt;ul&gt;
 &lt;p&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;Cool with Load Runner&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;highly developed, mature product&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;strong support&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;It is complex, but feature-rich&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Problems w/ Load Runner&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;Extreme cost, both up front and ongoing&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Limited load generation capacity based on license/key.&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Limited ability to monitor server stats outside of windows.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Cool w/ Grinder&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;Jython scripting means rapid script development&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Jython simplifies coding complex tasks&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Good real-time feedback in the UI in most tabs.&lt;/p&gt;
 &lt;/li&gt;&lt;li&gt;&lt;p&gt;Sockets based agent/controller communications.  Trouble-free
 in our testing.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;Problems w/ Grinder:&lt;/p&gt;
(Since this original article was posted, many of these issues have been addressed.  See the blog entry titled &lt;a href="http://blackanvil.blogspot.com/2006/11/grinder-addressing-warts.html"&gt;"The Grinder: Addressing the Warts."&lt;/a&gt;)

&lt;ul&gt;&lt;li&gt;&lt;p&gt;no scheduling; load is all-or-nothing&lt;/p&gt;&lt;/li&gt;
    &lt;li&gt;no slow sockets, no prospects for easily fixing this&lt;/li&gt;
   &lt;li&gt;Memory failures in a few large file download scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;Cool w/ JMeter:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Less technical expertise required&lt;/li&gt;
  &lt;li&gt;Overall more “slick” or “polished” feel –
 availability of startup scripts, more utility in the UI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;

Problems w/ JMeter:
&lt;ul&gt;
  &lt;li&gt;Limited feedback in the UI when the test is running&lt;/li&gt;
  &lt;li&gt;Memory and CPU issues when downloading very large files&lt;/li&gt;
  &lt;li&gt;The UI is buggy.  Big pieces, including monitors, just don't
 work.  Many  Null Pointer Exceptions in the log, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div type="FOOTER"&gt;
&lt;p style="margin-top: 0.2in; margin-bottom: 0in;" align="center"&gt;&lt;sdfield type="PAGE" subtype="RANDOM" format="PAGE"&gt;23&lt;/sdfield&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-115035332067654999?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/115035332067654999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=115035332067654999' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/115035332067654999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/115035332067654999'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2006/06/shootout-load-runner-vs-grinder-vs.html' title='Shootout: Load Runner vs The Grinder vs Apache JMeter'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27391056.post-114663629102407589</id><published>2006-05-02T23:01:00.000-07:00</published><updated>2006-06-14T21:21:27.343-07:00</updated><title type='text'>it's all about scalability</title><content type='html'>This blog will cover issues in scalability testing.  We will review free and open-source test tools, discuss techniques for generating your test model, test execution, interpreting your results, and other discussion-driven topics.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27391056-114663629102407589?l=blackanvil.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blackanvil.blogspot.com/feeds/114663629102407589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27391056&amp;postID=114663629102407589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/114663629102407589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27391056/posts/default/114663629102407589'/><link rel='alternate' type='text/html' href='http://blackanvil.blogspot.com/2006/05/its-all-about-scalability.html' title='it&apos;s all about scalability'/><author><name>Travis Bear</name><uri>http://www.blogger.com/profile/04646417737587545733</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></entry></feed>
