<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>William Louth's Weblog</title>
	<atom:link href="http://williamlouth.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://williamlouth.wordpress.com</link>
	<description>The Art of API Design and Performance Engineering</description>
	<lastBuildDate>Tue, 15 Nov 2011 11:00:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='williamlouth.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>William Louth's Weblog</title>
		<link>http://williamlouth.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://williamlouth.wordpress.com/osd.xml" title="William Louth&#039;s Weblog" />
	<atom:link rel='hub' href='http://williamlouth.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Out of Print</title>
		<link>http://williamlouth.wordpress.com/2011/11/14/out-of-print/</link>
		<comments>http://williamlouth.wordpress.com/2011/11/14/out-of-print/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 19:35:28 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5542</guid>
		<description><![CDATA[I will be discontinuing this blog with a change in the scope of my research and interests. If there is anything of interest please print now because it will be out of print shortly.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5542&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I will be discontinuing this blog with a change in the scope of my <em>research</em> and <em>interests</em>. If there is anything of interest please print now because it will be <em>out of print</em> shortly.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5542/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5542/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5542/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5542&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/11/14/out-of-print/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>
	</item>
		<item>
		<title>APM at Velocity Berlin 2011: The wrong advice, wrong approach and wrong agent.</title>
		<link>http://williamlouth.wordpress.com/2011/11/11/apm-at-velocity-berlin-2011-the-wrong-advice-wrong-approach-and-wrong-agent/</link>
		<comments>http://williamlouth.wordpress.com/2011/11/11/apm-at-velocity-berlin-2011-the-wrong-advice-wrong-approach-and-wrong-agent/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 16:36:45 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5488</guid>
		<description><![CDATA[At the Velocity Conf this week in Berlin (which had a very good turnout in terms of audience and speakers) I was stunned to hear NewRelic during their 5 minute lighting presentation claim that other tools to be &#8220;crappy&#8221;. Yes from the product/engineering team that gave us Wily Introscope which in itself completely redefined what crappy means [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5488&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>At the <a href="http://opencore.jinspired.com/?p=6687" target="_blank">Velocity</a> Conf this week in Berlin (<em>which had a very good turnout in terms of audience and speakers</em>) I was stunned to hear <a href="http://newrelic.com" target="_blank">NewRelic</a> during their 5 minute lighting <a href="http://www.youtube.com/watch?v=Suu33DKp3qc">presentation</a> claim that other tools to be &#8220;crappy&#8221;. Yes from the product/engineering team that gave us Wily Introscope which in itself completely redefined what <em>crappy</em> means in the enterprise space and who then went on to show that Crappy 2.0 (<em>Lew Cirne&#8217;s second attempt at trying to code</em>) can repeat its success with those with very little in the way of performance management knowledge, expertise and awareness &#8211; in the cloud. Then on the second day we had the &#8220;DevOps&#8221; team from http://guardian.co.uk advocate the use of logging (<em>excessively that is with log4j)</em> as a means to monitor and manage Java applications. Apparently no amount of logging could impact application response times which says a whole lot about the performance itself. Two huge WTF moments in two days. <em>It seems we can&#8217;t seem to get over logging and we can&#8217;t seem to calibrate our own tools.</em></p>
<p>Allow me to kill two birds with one benchmark test. Here is the clean version.</p>
<p><img class="alignnone" title="opencore.code" src="http://williamlouth.files.wordpress.com/2011/11/opencore-code.jpg?w=397&#038;h=214" alt="" width="397" height="214" /></p>
<p>Using JXInsight/OpenCore&#8217;s agent the code was instrumented dynamically at load time. No code changes needed. I ran with two different configurations. One that simply meters in memory and the second one that along with metering performs binary logging of the <em>begin</em> and <em>end</em> metering events, the <em>meter</em> readings as well as the name of the <em>probe</em> and <em>thread</em> context.</p>
<p>Here is the manual instrumentation needed to have a comparable test with log4j logging approach.</p>
<p><img title="log4j.code" src="http://williamlouth.files.wordpress.com/2011/11/log4j-code1.jpg?w=494&#038;h=80" alt="" width="494" height="80" /></p>
<p>With <a href="http://newrelic.com" target="_blank">NewRelic</a>&#8216;s Java agent there is no means to transparently instrument code that falls outside the few frameworks they support. You are forced to use a NewRelic specific @Trace annotation.</p>
<p><img title="newrelic.code" src="http://williamlouth.files.wordpress.com/2011/11/newrelic-code.jpg?w=207&#038;h=45" alt="" width="207" height="45" /></p>
<p>Here is a comparison of the average clock time cost reported after executing each test 100 million to 1 billion times.</p>
<p><img title="log4j.newrelic.opencore.chart" src="http://williamlouth.files.wordpress.com/2011/11/log4j-newrelic-opencore-chart.jpg?w=292&#038;h=365" alt="" width="292" height="365" /></p>
<p>You might initially think that <a href="http://newrelic.com" target="_blank">NewRelic</a> does not fair so bad compared to the log4j approach but bear in mind that NewRelic <strong>does not</strong> actually do any file IO. Instead it aggregates the data (<em>losing all trace history in our case</em>) and then dispatches it as a small packet to their web site service in 1 minute intervals.</p>
<p><em>None of our customers could tolerate the overhead incurred by the log4j and NewRelic with transaction latency as low as 200-300 microseconds and with 10 or more measurement points within such.</em></p>
<p>OpenCore without the <a href="http://opencore.jinspired.com/?page_id=3538" target="_blank">recorder</a> probes provider enabled and using the following configuration had an average clock time overhead of 130 ns with more than 50% of that attributed to the two clock time access reads.</p>
<p><code>j.s.p.strategy.enabled=false</code><br />
<code>j.s.p.meter.clock.time.include=false</code><br />
<code>j.s.p.meter.jvm.clock.time.include=true</code><br />
<code>j.s.p.aggregates.enabled=false</code><br />
<code>j.s.p.global.enabled=false</code></p>
<p>With the recorder enabled as follows the overhead increased to 710 ns and thats for two metering event IO writes. That&#8217;s 10x better than log4j but considering this is mostly IO on a slow hard disk the efficiency differences are hugely bigger. I can&#8217;t imagine what the other 7 microseconds is being spent on by log4j.</p>
<p><code>j.s.p.recorder.enabled=true</code></p>
<p>Below is a slice of the CPU usage monitoring during each of the benchmark test runs. OpenCore is not only so much faster it also uses far much less system resources.</p>
<p><em>There is a reason why cloud platform vendors like Heroku (Salesforce) and CloudBees offer NewRelic subscriptions but don&#8217;t actually use it themselves internally to monitor and manage their own critical systems and services. They are not in the business of conserving your resource consumption (or cost).</em></p>
<p><img title="log4j.newrelic.opencore.cpu" src="http://williamlouth.files.wordpress.com/2011/11/log4j-newrelic-opencore-cpu.jpg?w=435&#038;h=625" alt="" width="435" height="625" /></p>
<p>Relatively speaking log4j and NewRelic are pretty darn expensive and for the value they offer it puzzles me why anyone would ever consider such for Java application monitoring. Granted not everyone or application operates at such speeds and resolutions but bear in mind that today we advise our customers that the <a href="http://opencore.jinspired.com/?page_id=3538" target="_blank">recorder</a> be used mainly in development and focused performance testing, yet it is 10 times faster than these solutions promoted/advised as production solutions.</p>
<p>Yes you can find low hanging fruit with whatever &#8220;crappy&#8221; approach and agent you choose but if you are still using Crappy 2.0 after resolving such issues then you must question whether you are truly trying hard enough to be good if not better (<em>than the rest</em>).</p>
<p><em>Clearly what I consider &#8220;crappy&#8221; and what Brain Doll over at NewRelic considers &#8220;crappy&#8221; are light years apart and in different time/space dimensions.</em></p>
<p>Apart from these two blips the Velocity EU conference was a resounding success. Lots of great discussions in the corridors and in the speakers room and not forgetting some really thought provoking talks from <a href="http://velocityconf.com/velocityeu/public/schedule/speaker/1351" target="_blank">John Allspaw</a>, <a href="http://velocityconf.com/velocityeu/public/schedule/speaker/4103">Theo Schlossnagle</a>, <a href="http://velocityconf.com/velocityeu/public/schedule/speaker/41670">Jeff Veen</a>, <a href="http://velocityconf.com/velocityeu/public/schedule/speaker/30011">Johannes Mainusch</a>, and the WTF&#8217;er of the year <a href="http://velocityconf.com/velocityeu/public/schedule/speaker/1744">Artur Bergman</a>.</p>
<p><strong>Hardware</strong><br />
Model Name: iMac<br />
Model Identifier: iMac11,1<br />
Processor Name: Intel Core i7<br />
Processor Speed: 2.8 GHz<br />
Number Of Processors: 1<br />
Total Number Of Cores: 4<br />
L2 Cache (per core): 256 KB<br />
L3 Cache: 8 MB<br />
Memory: 8 GB<br />
Processor Interconnect Speed: 4.8 GT/s</p>
<p><strong>log4j.properties</strong><br />
log4j.rootLogger=warn, root<br />
log4j.appender.root=org.apache.log4j.FileAppender<br />
log4j.appender.root.File=log4j.log<br />
log4j.appender.root.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.root.layout.ConversionPattern=%p %t %c &#8211; %m%n</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5488/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5488/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5488/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5488&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/11/11/apm-at-velocity-berlin-2011-the-wrong-advice-wrong-approach-and-wrong-agent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/11/opencore-code.jpg" medium="image">
			<media:title type="html">opencore.code</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/11/log4j-code1.jpg" medium="image">
			<media:title type="html">log4j.code</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/11/newrelic-code.jpg" medium="image">
			<media:title type="html">newrelic.code</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/11/log4j-newrelic-opencore-chart.jpg" medium="image">
			<media:title type="html">log4j.newrelic.opencore.chart</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/11/log4j-newrelic-opencore-cpu.jpg" medium="image">
			<media:title type="html">log4j.newrelic.opencore.cpu</media:title>
		</media:content>
	</item>
		<item>
		<title>Get Ready for O&#8217;Reilly Velocity (EU) Conf 2011 Berlin, Germany</title>
		<link>http://williamlouth.wordpress.com/2011/11/03/get-ready-for-oreilly-velocity-eu-conf-2011-berlin-germany/</link>
		<comments>http://williamlouth.wordpress.com/2011/11/03/get-ready-for-oreilly-velocity-eu-conf-2011-berlin-germany/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 12:21:58 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Conferences]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5485</guid>
		<description><![CDATA[Velocity, the Web Performance and Operations conference from O&#8217;Reilly Media, is coming to Europe!  I will be attending the conference for the 2 days including (if travel plans permit) the Unconference on the Monday. I expect my session on QoS for Web Applications to be challenging, entertaining and inspiring especially as I frame Quality of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5485&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://velocityconf.com/velocityeu" target="_blank">Velocity</a>, the Web Performance and Operations conference from O&#8217;Reilly Media, is coming to Europe!  I will be attending the conference for the 2 days including (<em>if travel plans permit</em>) the <a href="http://veubof2011.eventbrite.co.uk/" target="_blank">Unconference</a> on the Monday. I expect my session on <a href="http://velocityconf.com/velocityeu/public/schedule/detail/21636" target="_blank">QoS for Web Applications</a> to be challenging, entertaining and inspiring especially as I frame Quality of Service within the context of self adaptive software (<em>self aware, self regulated, self healing,&#8230;</em>) and sketch out how the future of application management involves us managing by proxy by way of controllers, models, plans, goals and policies built directly in applications, containers and runtimes.</p>
<p>I hope to see you there. If you have not registered please consider doing so <a href="https://en.oreilly.com/velocityeu/public/register" target="_blank">now</a>. It looks like a great line-up and to be an important conference in the European calendar for performance and operations of web and cloud services.</p>
<p>And if you see me wandering around don&#8217;t be shy I promise not to bite <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5485/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5485&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/11/03/get-ready-for-oreilly-velocity-eu-conf-2011-berlin-germany/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>
	</item>
		<item>
		<title>Evaluating Java Application Performance Management Solutions?</title>
		<link>http://williamlouth.wordpress.com/2011/09/26/evaluating-java-application-performance-management-solutions/</link>
		<comments>http://williamlouth.wordpress.com/2011/09/26/evaluating-java-application-performance-management-solutions/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 20:54:50 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5472</guid>
		<description><![CDATA[If you are currently evaluating Java application performance management (APM) solutions from vendors such as Compuware/dynaTrace, AppDynamics, and NewRelic then you owe it to yourself, your team members and company to read the following articles which pull back the curtains on the marketing shenanigans, trickery and lies that comes with claims of low overhead, accurate [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5472&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you are currently evaluating Java application performance management (APM) solutions from vendors such as Compuware/dynaTrace, AppDynamics, and NewRelic then you owe it to yourself, your team members and company to read the following articles which pull back the curtains on the marketing shenanigans, trickery and lies that comes with claims of <em>low overhead</em>, <em>accurate reporting</em>, <em>comprehensive coverage</em>, <em>scalability</em> and not forgetting <em>superhero intelligence</em> (<em>sadly that last one&#8217;s not a joke</em>).</p>
<p><a href="http://opencore.jinspired.com/?p=6263" target="_blank">From Mgmt Dashboards &amp; Consoles to Mgmt Code &amp; Control</a></p>
<p><a href="http://opencore.jinspired.com/?p=5890" target="_blank">If you’re not metering you’re not trying hard enough to be the best – Part 3 of 3</a> (JXInsight/OpenCore, AppDynamics)<br />
<a href="http://opencore.jinspired.com/?p=5459" target="_blank">If you’re not metering you’re not trying hard enough to be the best – Part 2 of 3</a> (JXInsight/OpenCore, DTrace, NetBeans Profiler/VisualVM)<br />
<a href="http://opencore.jinspired.com/?p=5179" target="_blank">If you’re not metering you’re not trying hard enough to be the best – Part 1 of 3</a></p>
<p><a href="http://opencore.jinspired.com/?p=6217" target="_blank">Online &amp; Offline Intelligence in Java Application Performance Measurement</a> (JXInsight/OpenCore, AppDynamics)</p>
<p><a href="http://williamlouth.wordpress.com/2011/02/08/jxinsightopencore-vs-appdynamics-dynatrace-newrelic/" target="_blank">JXInsight/OpenCore Competitive Comparison</a> (JXInsight/OpenCore, AppDynamics, dynaTrace, NewRelic)</p>
<p><a href="http://williamlouth.wordpress.com/2011/03/17/which-ruby-vm-consider-monitoring/" target="_blank">Which Ruby VM? Consider Monitoring!</a> (JXInsight/OpenCore, NewRelic)</p>
<p><a href="http://williamlouth.wordpress.com/2010/05/25/the-java-application-performance-management-vendor-showdown/" target="_blank">The Java Application Performance Management Vendor Showdown</a> (AppDynamics, dynaTrace, NewRelic)</p>
<p><a href="http://opencore.jinspired.com/?p=6001" target="_blank">The Good and B(AD) of Application Performance Management Measurement</a> (JXInsight/OpenCore, AppDynamics)</p>
<p><em>Don&#8217;t spend thousands if not millions licensing such products if at the end of the day they are only suitable for one type of application &#8211; an extremely slow performing web app that makes hundreds of remote database and web service calls in servicing a single request like it was emitting neutrinos that defy the laws of physics (latency).</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5472/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5472&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/09/26/evaluating-java-application-performance-management-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>
	</item>
		<item>
		<title>A Pass on PaaS</title>
		<link>http://williamlouth.wordpress.com/2011/08/23/a-pass-on-paas/</link>
		<comments>http://williamlouth.wordpress.com/2011/08/23/a-pass-on-paas/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 14:28:08 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5396</guid>
		<description><![CDATA[Watching Amazon AWS continue to deliver new services, this week ElastiCache, and enhance the robustness of it existing services at a scale that no one else seems to be anywhere close too it is becoming clearer to me that for the time being it is much wiser for customers and vendors to Pass on PaaS [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5396&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Watching Amazon <a href="http://aws.amazon.com/" target="_blank">AWS</a> continue to deliver new services, this week <a href="http://aws.typepad.com/aws/2011/08/amazon-elasticache-distributed-in-memory-caching.html" target="_blank">ElastiCache</a>, and enhance the robustness of it existing services at a scale that no one else seems to be anywhere close too it is becoming clearer to me that for the time being it is much wiser for customers and vendors to <strong><em>Pass on PaaS</em></strong> and instead focus on consuming and building <em>AWS like</em> cloud services that scale, perform and are themselves far more resilient than any of todays technologies, frameworks, libraries, components and most importantly operational processes.<span id="more-5396"></span></p>
<p>Coming from a CORBA/J2EE background (<em>@ Inprise/Borland</em>) I can very well understand the allure of a container like approach (<em>or glorified process launcher aka CloudFoundry</em>) to architecting and deploying a new cloud application or service. But the problem I have with this is that I&#8217;m not convinced that an integrated container is the best option and should be the interaction point for services. The more a service gets integrated the more likely its falls within the control and execution domain of the cloud application or service itself which is probably the weakest link in the service delivery (<em>or service supply chain</em>). Containers can still serve as useful bootstrap constructs for application code but I think we need for them to be as lightweight (<em>bare metal</em>) as possible, to merely act as a telephone booth that connects callers (<em>applications</em>) and indirectly user conversations/interactions to the grid/cloud and its services and data ports/pools. Phone booths can come in various colors and shapes but at the end of the day they should do very little but do it sufficiently good &#8211; getting your code connected at the appropriate point on the grid (<em>service provider market</em>). Eventually such containers will merely serve as loader or launchers that pipe the application task/flow/job code and data context back and forth over the grid to remote service interaction points that offer miniature execution worlds (<em>or containers</em>) for interacting with local/collocated data.</p>
<p><em>I can see Trinity making such a call to and from the Matrix.</em></p>
<p><em>One might argue that containers could potentially offer enhancements (smart proxies) to such service exchanges but this argument falls over when you consider the rate at which cloud services are likely to evolve (if we don&#8217;t lock in the future to the present with PaaS). Containers and PaaS platforms are unlikely to keep up with the rate and scale of a healthy cloud software service economy until standardization which is not about less choice &#8220;whats on the menu&#8221; as some vendors would have you believe. Applications should be designed to merely orchestrate interactions with services not manage (scale up and out) them directly. <em>Don&#8217;t PaaS, instead Push. If it does not differentiate then delegate it. The more this is done at all layers and service interaction points the more homogenous it becomes at each local delivery point allowing for greater efficiencies, cost reductions and value creation.</em></em></p>
<p>Amazon AWS has the right approach. For now we need to focus on the service infrastructure creating possible additional levels of abstractions. We need to encourage the creation of a service economy with multiple suppliers per service type leading to increased competition and improved quality &amp; reliability. We need to encourage the usage of services not just across applications but across service themselves. All services should be encouraged to support delegation of some aspect of their delivery and execution to other services (<em>in particular storage</em>) were economically (<em>for both customer &amp; supplier</em>) and technically feasible.</p>
<p><em>Amazon is already doing this somewhat today with many of its services using other services in its portfolio in particular CloudWatch. What Amazon does not do today is allow for this delegation to be intercepted and redirected to another service implementation and provider.</em></p>
<p>We need to encourage some degree of standardization (<em>even if just at the contractual or conceptual level</em>) in the interaction and exchanges between applications and services and across services such as <em>metering, QoS, usage billing, security, service delegation &amp; <em>routing, execution </em>mobility &amp; location, and resource management &amp; reservation.</em> This should be possible at the account (<em>or application</em>) level or on a per interaction (<em>caller or user</em>) basis. Let the service providers optimize and manage the cross service interactions that we direct and drive through our edge point service interactions which will carry a service(s) context within request playloads.</p>
<p><em>Cloud is not just about pulling down computing resources in a on-demand fashion but pushing execution and cost from out of our code, application, runtimes, containers even computing resources (on-demand or not). The greatest change will always be in the application tier. Lets cleanly separate that from what we need to be much more reliable and that does not mean hiding it behind some container interface but having it run in a completely different execution &amp; management domain that is beyond our reach (out of harms way) because clearly the vast majority of software engineers and operations staff can&#8217;t operate at the level we have come to (unrealistically) expect of our infrastructure.</em></p>
<p>The last thing we need at the moment is a black box container for the edge execution node that restricts the service world to that of a particular PaaS vendor, service provider, technology, runtime or language. Lets create much more compatibility, coordination and robustness in the infrastructure and services making the edge nodes (<em>devices or containers</em>) as unrestricted and diverse as possible until we have gained a greater understanding and appreciation of the cloud and its possibilities which could very well invalidate our current application architecture and deployment approaches (i.e. <em>webapps / containers</em>) today.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/08/goodiaasvsbadpaas2.jpg"><img class="aligncenter size-full wp-image-5470" title="goodiaasvsbadpaas" src="http://williamlouth.files.wordpress.com/2011/08/goodiaasvsbadpaas2.jpg?w=335&#038;h=456" alt="" width="335" height="456" /></a></p>
<p><em><strong>Update [2011-08-24 13:00]</strong> A number of PaaS marketeers &amp; evangelists (marketeers with a little bit of knowledge) tried to disparage the opinion expressed here due to funnily enough my experience in metering and QoS which one would expect to be a <a href="http://opencore.jinspired.com/?p=3039" target="_blank">cortex</a> of any PaaS offering. Krishnan Subramanian over at <a href="http://www.cloudave.com/" target="_blank">CloudAve</a> did seem to agree with my points in that PaaS eliminates much of the <strong>visibility</strong> and <strong>control</strong> that is needed to deliver a cloud class, Amazon like scale &amp; reliability, service. One reason for my discounting of PaaS <strong>at present</strong> which I touched on above is that I believe companies should ensure they have as much visibility and control into the parts that differentiate their services and/or applications. This differentiation is generally closer to the user (and processing pipeline) and layered onto of services and infrastructure. The very same area that most PaaS solutions target and want to turn into some black box that could potentially be shared. This runs counter to my view that we should control &amp; change what differentiates a service delegating &amp; orchestrating the REST to other services and infrastructure components. I believe so strongly in the separation &amp; control of this differentiation that I expect all services to allow delegation of some aspects of their execution &amp; delivery. I should be able to call to a service and in the service context pass my storage end point (or that of the user consuming my service and the called service indirectly) as well as my metering/charge end points just like a company issuing a purchase order with a shipping and billing address. Eventually with code mobility and more intelligent service/data routing this can be extended to allow </em><em>a service consumer to pass along a context to a compute pool to be used by the service provider in the fulfillment of a request. The only parts of an application or service that should be auto-scaled is that which distinguishes you from the rest who are probably also using the same service suppliers. Leave the scaling of other services and software that you have not developed to experts that have designed and successfully operated it at a much greater scale than your own particular workload.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5396/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5396&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/08/23/a-pass-on-paas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/08/goodiaasvsbadpaas2.jpg" medium="image">
			<media:title type="html">goodiaasvsbadpaas</media:title>
		</media:content>
	</item>
		<item>
		<title>Value Based QoS Prioritization of Applications</title>
		<link>http://williamlouth.wordpress.com/2011/06/28/value-based-qos-prioritization-of-applications/</link>
		<comments>http://williamlouth.wordpress.com/2011/06/28/value-based-qos-prioritization-of-applications/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 21:15:33 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[QoS]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5328</guid>
		<description><![CDATA[In my last posting, Winning in Low Latency Environments with OpenCore’s QoS for Apps, I demonstrated how to apply QoS prioritization in low latency environments using service based priority level configuration and in a previous posting, OpenCore 6.1.M8 – QoS Reservation Lanes, I used the metering profile of a probe and banded reservation lanes to similarly achieve this but [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5328&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my last posting, <a title="Permalink to Winning in Low Latency Environments with OpenCore’s QoS for Apps" href="http://williamlouth.wordpress.com/2011/06/23/winning-in-low-latency-environments-with-opencores-qos-for-apps/" rel="bookmark" target="_blank">Winning in Low Latency Environments with OpenCore’s QoS for Apps</a>, I demonstrated how to apply <a href="http://opencore.jinspired.com/?page_id=3058" target="_blank">QoS</a> prioritization in low latency environments using service based priority level configuration and in a previous posting, <a href="http://williamlouth.wordpress.com/2010/12/31/opencore-6-1-m8-qos-reservation-lanes/" target="_blank">OpenCore 6.1.M8 – QoS Reservation Lanes</a>, I used the metering profile of a probe and banded reservation lanes to similarly achieve this but with more dynamics. But in both postings <a href="http://opencore.jinspired.com/?page_id=3058" target="_blank">QoS</a> prioritization was driven by the differences in the location (<em>namespace</em>) of the executing code and only then its dynamic metering consumption profile (<em>in the case of reservation lanes</em>).<span id="more-5328"></span></p>
<p>But what if the code were the same but the context associated with a particular execution (<em>method invocation</em>) was different and represented the driver for <a href="http://opencore.jinspired.com/?page_id=3058" target="_blank">QoS</a> prioritization. For example the value of a financial trade or the expected profit from a transaction or order.</p>
<p>Lets revisit the sample code in my <a href="http://williamlouth.wordpress.com/2011/06/23/winning-in-low-latency-environments-with-opencores-qos-for-apps/" target="_blank">last</a> posting changing the same <code>Worker</code> class to accept a different <code>value</code> parameter in its constructor depending on whether its an odd or even numbered loop.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-11.jpg"><img class="alignnone size-full wp-image-5349" title="qos.valuebased.prioritization.code.1" src="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-11.jpg?w=431&#038;h=344" alt="" width="431" height="344" /></a></p>
<p>In the <code>Worker</code> class below a thread specific metering counter, <code>value</code>, is repeatedly incremented with the <code>$</code> parameter, that was passed into its constructor, before every call to <code>doWork()</code>.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-2.jpg"><img class="alignnone size-full wp-image-5330" title="qos.valuebased.prioritization.code.2" src="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-2.jpg?w=407&#038;h=544" alt="" width="407" height="544" /></a></p>
<p>Here is a sample output without any dynamic QoS runtime enhancement.</p>
<p><code>big=59,543,287</code><br />
<code>small=59,535,999</code></p>
<p>What needs to happen now is for the QoS system to dynamically prioritize the execution of <code>Worker.doWork()</code> across the 16 threads based on the change in the value counter with every loop execution and within the metering context of the enclosing <code>Worker.run()</code> method. Here are the configuration entries required to achieves this with OpenCore&#8217;s metering runtime.</p>
<p>First disable the <code>clock.time</code> meter and create a meter mapped to a counter named <code>value</code>.</p>
<p><code>jxinsight.server.probes.meter.clock.time.include=false</code><br />
<code>jxinsight.server.probes.meter.counters=value</code></p>
<p>Disable the default enabled <code>strategy</code> probes provider as we don&#8217;t want the <code>hotspot</code> metering strategy disabling our low latency <code>Worker.doWork()</code> method.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code></p>
<p>We need metering to be performed but not at a process or aggregated group level.</p>
<p><code>jxinsight.server.probes.global.enabled=false</code><br />
<code>jxinsight.server.probes.aggregates.enabled=false</code></p>
<p>Now enable the optional QoS probes provider extension.</p>
<p><code>jxinsight.server.probes.qos.enabled=true</code></p>
<p>Lets define a resource named <code>$</code> with priority queuing on resource reservations which happens at the time a method begins to execute.</p>
<p><code>jxinsight.server.probes.qos.resources=$</code><br />
<code>jxinsight.server.probes.qos.resource.$.queue.priority.enabled=true</code></p>
<p>The reservation method used in determining the required reserve value is <code>lease</code> which needs for a <code>meter</code> to be associated with the resource.</p>
<p><code>jxinsight.server.probes.qos.resource.$.reservation=lease</code><br />
<code>jxinsight.server.probes.qos.resource.$.meter=value</code></p>
<p>A <code>fast</code> lane is now defined with a lower bound of <code>100</code> on each individual reservation matching and passing through it.</p>
<p><code>jxinsight.server.probes.qos.resource.$.lanes=fast</code><br />
<code>jxinsight.server.probes.qos.resource.$.lane.fast.lower=100</code></p>
<p>Reservations passing through the <code>fast</code> lane get a priority level <code>promotion</code> of 1. The default is 0 for all services without an explicit priority level defined.</p>
<p><code>jxinsight.server.probes.qos.resource.$.lane.fast.priority.level.promotion=1</code></p>
<p>The QoS policing is now applied to all probes matching one or more metering groups listed against our <code>worker</code> service which by default is automatically associated with our global resource <code>$</code>.</p>
<p><code>jxinsight.server.probes.qos.services=worker</code><br />
<code>jxinsight.server.probes.qos.service.worker.name.groups=QoS$Worker</code></p>
<p>Running the sample code again but this time with the above entries added to a <code>jxinsight.override.config</code> file results in the following output.</p>
<p><code>big=110,406,039</code><br />
<code>small=1,100,306</code></p>
<p>Same code but different execution behavior driven by a value measurement!!!</p>
<p><em><strong>Note</strong>: I used OpenCore 6.2.M19.1 during testing which has a minor fix for the lease reservation method.</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5328/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5328/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5328/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5328&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/06/28/value-based-qos-prioritization-of-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-11.jpg" medium="image">
			<media:title type="html">qos.valuebased.prioritization.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/qos-valuebased-prioritization-code-2.jpg" medium="image">
			<media:title type="html">qos.valuebased.prioritization.code.2</media:title>
		</media:content>
	</item>
		<item>
		<title>Winning in Low Latency Environments with OpenCore&#8217;s QoS for Apps</title>
		<link>http://williamlouth.wordpress.com/2011/06/23/winning-in-low-latency-environments-with-opencores-qos-for-apps/</link>
		<comments>http://williamlouth.wordpress.com/2011/06/23/winning-in-low-latency-environments-with-opencores-qos-for-apps/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 17:49:25 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[QoS]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5285</guid>
		<description><![CDATA[Over the last 3 weeks I have visited Moscow, Hong Kong and Tokyo delivering presentations and workshops on performance measurement and performance management (acting on measurements in realtime), using OpenCore &#8216;s metering and metrics engines, to teams developing, testing and managing applications with extreme low latency constraints at very high throughput levels that dwarf anything with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5285&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Over the last 3 weeks I have visited Moscow, Hong Kong and Tokyo delivering presentations and workshops on performance measurement and performance management (<em>acting on measurements in realtime),</em> using <a href="http://opencore.jinspired.com/" target="_blank">OpenCore</a> &#8216;s metering and metrics engines, to teams developing, testing and managing applications with extreme low latency constraints at very high throughput levels that dwarf anything with a &#8220;webscale&#8221; label in a short timespan &#8211; financial trading engines and platforms.<span id="more-5285"></span></p>
<p>One question that came up a number of times was &#8220;Could OpenCore&#8217;s <a href="http://opencore.jinspired.com/?page_id=3058" target="_blank">QoS for Apps</a> technology be used in such environments and if so does metering need always be performed?&#8221;. Well with the release of <a href="http://opencore.jinspired.com/?p=4020" target="_blank">OpenCore 6.2.M19</a> today I am delighted to be able answer YES and NO to each part respectively.</p>
<p style="text-align:center;"><em><strong>Note</strong>: Not only are we the only viable performance <strong>measurement</strong> solution provider in low latency Java environments we are also the only <strong>active</strong> performance <strong>management</strong> solution provider.</em></p>
<p>To demonstrate this I have created a small sample application which performs a busy processing loop making calls to two possible <code>Callable</code> implementations &#8211; <code>VIP</code> and <code>Guest</code>. In its main thread it spawns a number of threads each calling repeatedly into one of the two <code>Callable</code> implementations.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-1.jpg"><img class="alignnone size-full wp-image-5286" title="qos.lowlatency.prioritization.code.1" src="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-1.jpg?w=438&#038;h=695" alt="" width="438" height="695" /></a></p>
<p>Here is the implementation of both <code>Callable</code>&#8216;s. Yes they are exactly the same and with an execution cost of approximately 1 microsecond.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-2.jpg"><img class="alignnone size-full wp-image-5287" title="qos.lowlatency.prioritization.code.2" src="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-2.jpg?w=426&#038;h=191" alt="" width="426" height="191" /></a></p>
<p>Here are the outputs from an instrumented run without any meters included and hence no activity metering.</p>
<p><code>vips=118,790,243</code><br />
<code>guests=119,123,397</code></p>
<p>Fairly evenly distributed.</p>
<p>Now if you were asked to make <code>VIP</code> perform more work than <code>Guest</code> in a heavy loaded environment with some level of CPU resource contention/starvation without changing the processing loop or number of threads apportioned you would probably change the <code>Thread</code> creation code to call <code>Thread.setPriority(int)</code> with different values for <code>VIP</code> and <code>Guest</code> workers. Here are the results setting <code>VIP</code> threads to <code>MAX_PRIORITY</code> and <code>Guest</code> threads to <code>MIN_PRIORITY</code>.</p>
<p><code>vips=157,162,800</code><br />
<code>guests=80,044,896</code></p>
<p>The different thread priority levels did make a difference (2:1) but what if it is not enough of a difference required to justify <code>VIP</code> status?</p>
<p>Here is how to achieve a similar prioritization using OpenCore&#8217;s <code><a href="http://opencore.jinspired.com/?page_id=981#p:qos" target="_blank">qos</a></code> probes provider extension by creating a logical resource, <code>cpu</code>, in our QoS model representing execution/processor time with unlimited capacity but with prioritization enabled and classifying each <code>Callable.call</code> implementation with a different QoS service and priority level. More importantly no software metering is performed.</p>
<p style="text-align:center;"><em><strong>Note</strong>: By default if a QoS service does not define a list of QoS resources it consumes then it uses the global QoS resource list.</em></p>
<p><code>jxinsight.server.probes.qos.enabled=true</code><br />
<strong><code>jxinsight.server.probes.qos.forwarding.enabled=false</code></strong><br />
<code>jxinsight.server.probes.qos.resources=cpu</code><br />
<strong><code>jxinsight.server.probes.qos.resource.cpu.queue.priority.enabled=true</code></strong><br />
<code>jxinsight.server.probes.qos.services=vip,guest</code><br />
<code>jxinsight.server.probes.qos.service.vip.name.groups=QoS$VIP.call</code><br />
<strong><code>jxinsight.server.probes.qos.service.vip.priority.level=1</code></strong><br />
<code>jxinsight.server.probes.qos.service.guest.name.groups=QoS$Guest.call</code><br />
<strong><code>jxinsight.server.probes.qos.service.guest.priority.level=0</code></strong></p>
<p>Below are the results from running the above code again this time with QoS enabled <em>and no code changes other than dynamic byte code instrumentation</em>.</p>
<p><code>vips=210,552,741</code><br />
<code>guests=1,283,421</code></p>
<p>An impressive 210:1 ratio!! Admittedly a little bit extreme though this is a contrived but very demanding proof test involving single digit microsecond level QoS policing.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5285/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5285/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5285/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5285&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/06/23/winning-in-low-latency-environments-with-opencores-qos-for-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-1.jpg" medium="image">
			<media:title type="html">qos.lowlatency.prioritization.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/qos-lowlatency-prioritization-code-2.jpg" medium="image">
			<media:title type="html">qos.lowlatency.prioritization.code.2</media:title>
		</media:content>
	</item>
		<item>
		<title>What we can learn from Amazon&#8217;s AWS Service Disruptions</title>
		<link>http://williamlouth.wordpress.com/2011/06/20/what-we-can-learn-from-amazons-aws-service-disruptions/</link>
		<comments>http://williamlouth.wordpress.com/2011/06/20/what-we-can-learn-from-amazons-aws-service-disruptions/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 10:25:28 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Cost Aware Runtimes & Services]]></category>
		<category><![CDATA[QoS]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5263</guid>
		<description><![CDATA[Amazon AWS has posted a post-mortem analysis of another significant service outage this time with its SimpleDB service. What is of great interest in these post-mortems is the next steps that are planned to address areas of less resilience in the monitoring and regulation of the services by themselves as well as by external controllers [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5263&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://aws.amazon.com/">Amazon AWS</a> has posted a <a href="http://aws.amazon.com/message/65649/" target="_blank">post-mortem</a> analysis of <a href="http://aws.amazon.com/message/65648/" target="_blank">another</a> significant service outage this time with its <a href="http://aws.amazon.com/simpledb/" target="_blank">SimpleDB</a> service. What is of great interest in these post-mortems is the next steps that are planned to address areas of less resilience in the monitoring and regulation of the services by themselves as well as by external controllers and supervisory routines.<span id="more-5263"></span></p>
<p>The last time I talked with <a href="http://www.allthingsdistributed.com/" target="_blank">Werner Vogels</a> at the <a href="http://www.cloudconnectevent.com/" target="_blank">CloudConnect</a> 2011 conference he mentioned that this area of concern accounted for as much as 50% of the code base and was a significant differentiator in the design, development and deployment of their services &#8211; <em>distinguishing the men from the boys in the cloud computing space</em>. If you look at many of the upcoming PaaS offerings such as VMware&#8217;s CloudFoundry/OpenPaas/vFrabic, CloudBees RUN@cloud and RedHat&#8217;s OpenShift, you will be challenged to find any hard evidence indicating a similar level of investment in self-observation and self-regulation. In fact you are more than likely to find nothing (<em>or nothing of worth</em>) other than sugar laced management dashboards appealing to newcomers needing some false sense of security, comfort and control running counter to an important driver of cloud computing adoption which can be summed up with <em>&#8220;if we need to look at a dashboard it&#8217;s already far too late&#8221; </em>or<em> &#8220;web scale != human scale&#8221;.</em></p>
<p>Clearly what is needed is to make the cut in the cloud and ensure some degree of longevity, scalability and hopefully financial success is for more attention to be given to self-observation and self-regulation of software within the runtime themselves and at each layer in the execution stack and across applications and services (<em>collocated or not</em>).</p>
<p>Whilst it might be wishful thinking hoping for a standard mechanism/interface/protocol/library to be agreed upon and implemented across all runtimes and services (<em>avoding a reinvention splurge and wasted effort</em>) I do hope that the Java community might look to <a href="http://opencore.jinspired.com/" target="_blank">JXInsight/OpenCore</a>&#8216;s extensible activity based metering engine as the basis for this new era in software resilience engineering and runtime execution adaptation and control.</p>
<p><em><strong>Note</strong>: We have pushed for a standardization around OpenCore&#8217;s metering &amp; metric technology with IBM, Sun, and <strong>even</strong> Oracle though with much less success than we had hoped for but we are still confident this might change in time</em>.</p>
<p><a href="http://opencore.jinspired.com/" target="_blank">OpenCore</a> would deliver many of the much needed capabilities, and more, to applications without having to invest vast amounts of engineering time in polluting &amp; possibly incorrectly altering existing codebases and application processing logic.</p>
<p><strong>QoS for Apps</strong><br />
<strong></strong><a href="//opencore.jinspired.com/?page_id=3058" target="_blank">http://opencore.jinspired.com/?page_id=3058</a></p>
<p><strong>CARS</strong><br />
<a href="http://opencore.jinspired.com/?page_id=3063" target="_blank">http://opencore.jinspired.com/?page_id=3063</a></p>
<p><strong>I.AM</strong><br />
<strong></strong><a href="http://opencore.jinspired.com/?page_id=3843" target="_blank">http://opencore.jinspired.com/?page_id=3843</a></p>
<p><strong>OpenCore &#8211; A Cloud Cortex for PaaS</strong><br />
<strong></strong><a href="http://opencore.jinspired.com/?p=3039" target="_blank">http://opencore.jinspired.com/?p=3039</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5263/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5263&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/06/20/what-we-can-learn-from-amazons-aws-service-disruptions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>
	</item>
		<item>
		<title>Calibrating OpenCore&#8217;s Metering Engine</title>
		<link>http://williamlouth.wordpress.com/2011/06/08/calibrating-opencores-metering-engine/</link>
		<comments>http://williamlouth.wordpress.com/2011/06/08/calibrating-opencores-metering-engine/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 19:46:33 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Performance Engineering]]></category>
		<category><![CDATA[Performance Testing]]></category>
		<category><![CDATA[Profiling]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5191</guid>
		<description><![CDATA[Understanding the runtime performance overhead (cost model) of a performance measurement tool should be one of the first tasks any software performance engineer performs when given a new environment and/or toolset. This is especially important when using an incredibility flexible and versatile measurement solution such as OpenCore&#8217;s intelligent metering runtime which offer numerous options in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5191&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Understanding the runtime performance overhead (<em>cost model</em>) of a performance measurement tool should be one of the first tasks any software performance engineer performs when given a new environment and/or toolset. This is especially important when using an incredibility flexible and versatile measurement solution such as <a href="http://opencore.jinspired.com/" target="_blank">OpenCore&#8217;s</a> <a href="http://opencore.jinspired.com/?p=3887" target="_blank">intelligent metering</a> runtime which offer numerous options in how, when, and what is measured and collected.<span id="more-5191"></span></p>
<p>Using OpenCore&#8217;s <a href="http://opencore.jinspired.com/?page_id=715" target="_blank">Open API </a>one can very quickly estimate the cost of various options and extensions to metering runtime without having to go through a lot of trial and error in pre-production and production.</p>
<p>Here is a top section of a code listing which I am going to use in estimating the latency cost for two key performance components of the metering runtime &#8211; <em>meters</em> and <em>probes</em>.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-1.jpg"><img class="alignnone size-full wp-image-5193" title="opencore.metering.calibration.code.1" src="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-1.jpg?w=422&#038;h=447" alt="" width="422" height="447" /></a></p>
<p>In the first part of the code listing the list of meters installed are iterated and individually calibrated <em>in the sense that we are determining the degree of <a href="http://en.wikipedia.org/wiki/Instrument_error" target="_blank">instrument error</a></em>.</p>
<p>In the second part of the code listing above 5 different named probes are calibrated with each subsequent one having an extended name which in our metering runtime translates into a hierarchy of metering groups for metering (<em>cost, latency</em>) assignment.</p>
<p>The third part is pretty much the same as the second part except for a change in the probe name prefix and the usage of a <code>disabled</code> label which will be explained later.</p>
<p>Here is the method used to calibrate a <code>Probes.Meter</code>. Pretty straight forward calling <code>Probes.Measure.getValue()</code> repeatedly.</p>
<blockquote>
<p style="text-align:center;"><em>Note: Any metering of a probe will result in at least two <code>getValue()</code> calls.</em></p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-2.jpg"><img class="alignnone size-full wp-image-5194" title="opencore.metering.calibration.code.2" src="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-2.jpg?w=462&#038;h=157" alt="" width="462" height="157" /></a></p>
<p>To calibrate a <code>Probes.Probe</code> the <code>Probes.Context</code>, representing the calling thread, is used to create an instance returned via the <code>begin()</code> method. The <code>end()</code> method is then immediately called on the instance.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-3.jpg"><img class="alignnone size-full wp-image-5195" title="opencore.metering.calibration.code.3" src="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-3.jpg?w=336&#038;h=171" alt="" width="336" height="171" /></a></p>
<p>This last <code>calibrate()</code> method is near identical to the last method except for the disablement check that is performed before the <code>begin()</code> and <code>end()</code> methods are called if at all.</p>
<blockquote>
<p style="text-align:center;"><em>Note: Our AOP extension library performs a similar check but in a much more efficient manner that makes it become an <a href="http://williamlouth.wordpress.com/2011/02/01/opencore-openjdk-zero-sum-game/" target="_blank">no-op</a> once the probe has been disabled.</em></p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-4.jpg"><img class="alignnone size-full wp-image-5196" title="opencore.metering.calibration.code.4" src="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-4.jpg?w=361&#038;h=200" alt="" width="361" height="200" /></a></p>
<p>Now all that needs to be done is to run up the <code>Calibrate</code> class with our OpenCore metering runtime.</p>
<p><code>java -agentpath:/OpenCore/bin/osx-32/libjxinsight.jnilib=prod -cp /OpenCore/lib/opencore.jar:. Calibrate</code></p>
<p>Here is a sample output of an execution.</p>
<p><code>clock.time=44ns</code></p>
<p><code>com=18ns</code><br />
<code>com.acme=18ns</code><br />
<code>com.acme.app=15ns</code><br />
<code>com.acme.app.sys=15ns</code><br />
<code>com.acme.app.sys.comp=15ns</code></p>
<p><code>org=0ns</code><br />
<code>org.acme=0ns</code><br />
<code>org.acme.app=0ns</code><br />
<code>org.acme.app.sys=0ns</code><br />
<code>org.acme.app.sys.comp=0ns</code></p>
<p>You might be surprised with the probe results considering the latency cost of the wall clock time access (44ns x 2) but what has happened is the <code>hotspot</code> metering <code>strategy</code> enabled by default has disabled the metering of the firing probes because of their cost profile. This also explains why the cost overhead drops to zero (<em>naturally with rounding</em>) in the second probe <code>calibrate()</code> method.</p>
<p>Lets disable the hotspot metering strategy altogether by adding the following to our <code>jxinsight.override.config</code> file.</p>
<blockquote>
<p style="text-align:center;"><em>Note: With this disabled I will not present the output the second probe metering calibrate results.</em></p>
</blockquote>
<p><strong><code>jxinsight.server.probes.strategy.enabled=false</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>clock.time=44ns</code></p>
<p><code>com=143ns</code><br />
<code>com.acme=150ns</code><br />
<code>com.acme.app=164ns</code><br />
<code>com.acme.app.sys=174ns</code><br />
<code>com.acme.app.sys.comp=187ns</code></p>
<p>We can now experiment with different type of meters. Lets disable the default <code>clock.time</code> meter and used the alternative <code>jvm.clock.time</code> meter which calls to <code>System.nanoTime()</code>.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<strong><code>jxinsight.server.probes.meter.clock.time.include=false</code></strong><br />
<strong><code>jxinsight.server.probes.meter.jvm.clock.time.include=true</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>jvm.clock.time=40ns</code></p>
<p><code>com=140ns</code><br />
<code>com.acme=146ns</code><br />
<code>com.acme.app=156ns</code><br />
<code>com.acme.app.sys=164ns</code><br />
<code>com.acme.app.sys.comp=174ns</code></p>
<p>Lets now turn off aggregate group metering.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.meter.clock.time.include=false</code><br />
<code>jxinsight.server.probes.meter.jvm.clock.time.include=true</code><br />
<strong><code>jxinsight.server.probes.aggregates.enabled=false</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>jvm.clock.time=39ns</code></p>
<p><code>com=139ns</code><br />
<code>com.acme=126ns</code><br />
<code>com.acme.app=123ns</code><br />
<code>com.acme.app.sys=123ns</code><br />
<code>com.acme.app.sys.comp=123ns</code></p>
<p>We can even turn off the global (consolidated) metering if all we care about is thread level metering information.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.meter.clock.time.include=false</code><br />
<code>jxinsight.server.probes.meter.jvm.clock.time.include=true</code><br />
<code>jxinsight.server.probes.aggregates.enabled=false</code><br />
<strong><code>jxinsight.server.probes.global.enabled=false</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>jvm.clock.time=39ns</code></p>
<p><code>com=108ns</code><br />
<code>com.acme=107ns</code><br />
<code>com.acme.app=107ns</code><br />
<code>com.acme.app.sys=107ns</code><br />
<code>com.acme.app.sys.comp=107ns</code></p>
<p>We can also see the impact in adding optional data collectors to the metering runtime. Here I am enabling the <code>stack</code> probes provider which allows efficient capturing and inspection of the probe stack across all metered threads at any moment in time.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.meter.clock.time.include=false</code><br />
<code>jxinsight.server.probes.meter.jvm.clock.time.include=true</code><br />
<code>jxinsight.server.probes.aggregates.enabled=false</code><br />
<code>jxinsight.server.probes.global.enabled=false</code><br />
<strong><code>jxinsight.server.probes.stack.enabled=true</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>jvm.clock.time=39ns</code></p>
<p><code>com=125ns</code><br />
<code>com.acme=124ns</code><br />
<code>com.acme.app=124ns</code><br />
<code>com.acme.app.sys=123ns</code><br />
<code>com.acme.app.sys.comp=123ns</code></p>
<p>We can even eliminate metering entirely but still have the ability to inspect the probe stack at any time from a console or within the runtime itself.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.meter.clock.time.include=false</code><br />
<code>jxinsight.server.probes.meter.jvm.clock.time.include=true</code><br />
<code>jxinsight.server.probes.aggregates.enabled=false</code><br />
<code>jxinsight.server.probes.global.enabled=false</code><br />
<code>jxinsight.server.probes.stack.enabled=true</code><br />
<strong><code>jxinsight.server.probes.stack.forwarding.enabled=false</code></strong></p>
<p>Here is a sample output of an execution.</p>
<p><code>jvm.clock.time=39ns</code></p>
<p><code>com=33ns</code><br />
<code>com.acme=33ns</code><br />
<code>com.acme.app=24ns</code><br />
<code>com.acme.app.sys=21ns</code><br />
<code>com.acme.app.sys.comp=21ns</code></p>
<p>With <a href="http://opencore.jinspired.com/" target="_blank">OpenCore&#8217;s</a> metering runtime you have complete cost transparency along with unprecedented control!!!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5191&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/06/08/calibrating-opencores-metering-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-1.jpg" medium="image">
			<media:title type="html">opencore.metering.calibration.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-2.jpg" medium="image">
			<media:title type="html">opencore.metering.calibration.code.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-3.jpg" medium="image">
			<media:title type="html">opencore.metering.calibration.code.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/06/opencore-metering-calibration-code-4.jpg" medium="image">
			<media:title type="html">opencore.metering.calibration.code.4</media:title>
		</media:content>
	</item>
		<item>
		<title>BTM 2.0 &#8211; Behavioral Trait Metering &amp; Metrics</title>
		<link>http://williamlouth.wordpress.com/2011/05/13/btm-2-0-behavioral-trait-metering-metrics/</link>
		<comments>http://williamlouth.wordpress.com/2011/05/13/btm-2-0-behavioral-trait-metering-metrics/#comments</comments>
		<pubDate>Fri, 13 May 2011 14:00:43 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Business Transaction Management]]></category>
		<category><![CDATA[Code Execution Analysis]]></category>
		<category><![CDATA[Metering]]></category>
		<category><![CDATA[Metrics]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5115</guid>
		<description><![CDATA[At this stage most are in agreement that Business Transaction Management (BTM 1.0) has largely failed to transform the Application Performance Management space and with the coming of the Cloud this tag-and-trace technology is now heading for the sunset club. There are a number of reasons for this but probably the most common is that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5115&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>At this stage most are in agreement that Business Transaction Management (BTM 1.0) has largely failed to transform the Application Performance Management space and with the coming of the Cloud this tag-and-trace technology is now heading for the sunset club.<span id="more-5115"></span></p>
<p>There are a number of reasons for this but probably the most common is that the vast majority of BTM products are basically APM products re-branded and re-marketed (<em>nearly always overnight</em>). This is especially obvious in products when the definition of a business transaction constitutes of <strong>1.</strong> a simple relabeling of code namespaces (<em>packages, classes and methods</em>) to something more (<em>business</em>) user friendly, <strong>2.</strong> limiting performance measurement to just entry (<em>and sometimes exit points</em>) across processing tiers and<em> </em><strong>3.</strong> applying expensive state inspection of the call arguments at the entry point of a what is basically a trace path.</p>
<p>Rarely is there any actual business context or measurement such as the value or cost associated with the request/workflow processing. All such solutions are still largely focused on measuring latency. Which granted is critical for most businesses though not complete or comprehensive at least in a business context.</p>
<p>In a previous article, <a href="http://williamlouth.wordpress.com/2010/06/16/business-transaction-management-to-business-transaction-metering/" target="_blank">Business Transaction Management to Business Transaction Metering</a>, I showed how to add such business context. In this article I am going to show how the business classification aspect can be solved using <a href="http://opencore.jinspired.com" target="_blank">OpenCore&#8217;s</a> metering engine extensions and exposing such classifications as Behavioral Trait Metering Metrics (BTM 2.0).</p>
<p>To make this a little bit difficult (<em>for other vendors</em>) the behavioral trait classification will only be possible at the point of completion of the request code execution. The following code mocks a business transaction which can successfully complete all required processing steps or fail in only partially executing all required steps (<em>ignoring ordering concerns</em>).</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-11.jpg"><img class="alignnone size-full wp-image-5139" title="opencore.btmetrics.code.1" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-11.jpg?w=255&#038;h=578" alt="" width="255" height="578" /></a></p>
<p>Below is a snapshot of a metering model that was taken during the metered execution of the above code using the following <code>jxinsight.override.config</code> properties file.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.console.enabled=true</code></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes1.jpg"><img class="alignnone size-full wp-image-5141" title="opencore.btmetrics.console.probes" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes1.jpg?w=457&#038;h=191" alt="" width="457" height="191" /></a></p>
<p>From the metering table above it can be seen that 28,715 &#8220;business transactions&#8221; were processed. But how many actually completed successfully, which in our behavioral trait definition means executing all 3 steps, can&#8217;t be determined because the code above allowed for steps to be executed repeatedly or skipped on a per request basis.</p>
<p>All that can be said is that the maximum possible number of requests processed completely is at most 14,260 &#8211; the number of <code>doTearDown</code> metered probe firings. But this number is likely to well overstated because in the code above it was possible to execute <code>doTearDown</code> without ever executing <code>doSetup</code> or <code>doWork</code>.</p>
<p>To turn the metering information into metrics sampled at fixed intervals all that is required is to add the following to the <code>jxinsight.override.config</code> file.</p>
<p><code>jxinsight.server.probes.metrics.enabled=true</code><br />
<code>jxinsight.server.metrics.console.enabled=true</code></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes-metrics.jpg"><img class="alignnone size-full wp-image-5142" title="opencore.btmetrics.console.probes.metrics" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes-metrics.jpg?w=477&#038;h=430" alt="" width="477" height="430" /></a></p>
<p>With the metrics extension to the metering runtime enabled we get 4 metrics for every process level metering with a metering created for each probe and meter pairing. Considering that <a href="http://opencore.jinspired.com" target="_blank">OpenCore</a> can very easily create 10,000-100,000 metering objects per process this is likely to be overkill by no stretch of the imagination and still its not possible to answer our previous question.</p>
<p>Lets create two behavioral trait based metrics that are more business aligned (<em>and actionable</em>). One metric that tracks the number of requests that completed all steps. Another metric that tracks the number that partially execute the required steps.</p>
<p>There are a number of ways this can be achieved via the many extension points in the <a href="http://opencore.jinspired.com" target="_blank">OpenCore</a> metering runtime. Here I elected to use the optional <code><a href="http://opencore.jinspired.com/?page_id=981#p:interceptor" target="_blank">interceptor</a></code> probes providers and implement both <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/interceptor/ProbesInterceptorFactory.html" target="_blank">ProbesInterceptorFactory</a></code> and <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/interceptor/ProbesInterceptor.html" target="_blank">ProbesInterceptor</a></code> interfaces.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-21.jpg"><img title="opencore.btmetrics.code.2" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-21.jpg?w=423&#038;h=334" alt="" width="423" height="334" /></a><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-2.jpg"><br />
</a></p>
<p>Here is were the behavioral analysis is done in the <code>Interceptor.end(...)</code> method called by the runtime on completion of a metered probe which in our case translates to a Java method.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-32.jpg"><img class="alignnone size-full wp-image-5182" title="opencore.btmetrics.code.3" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-32.jpg?w=431&#038;h=729" alt="" width="431" height="729" /></a></p>
<p>When the <code>Traits.process()</code> method is initially invoked a <code>SavePoint</code> is created of the current threads metering data. This <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.SavePoint.html" target="_blank">SavePoint</a></code> is then used to generate a <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.ChangeSet.html" target="_blank">ChangeSet</a></code> when the <code>Traits.process()</code> method completes containing all the metering changes that occurred between the start and end points within the current thread. The <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.ChangeSet.html" target="_blank">ChangeSet</a></code> is then searched for <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.ChangePoint.html" target="_blank">ChangePoint</a></code>&#8216;s matching the name of each process step. If all steps are present then we can be sure that the process completed its entire execution flow. If one or more for the step&#8217;s can&#8217;t be found in the <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.ChangeSet.html" target="_blank">ChangeSet</a></code> then that particular invocation is deemed to have failed.</p>
<p>Here is the configuration I used to automatically install our behavioral trait interception routine and automatically register counters as same named metrics with the <a href="http://opencore.jinspired.com" target="_blank">OpenCore</a> metric runtime.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.interceptor.enabled=true</code><br />
<code>jxinsight.server.probes.interceptors=traits</code><br />
<code>jxinsight.server.probes.interceptor.traits.factory.class=\</code><br />
<code> com.jinspired.opencore.sample.traits.InterceptorFactory</code></p>
<p><code>jxinsight.server.metrics.counters=\</code><br />
<code> behavioral.trait.success.count,behavioral.trait.failure.count</code><br />
<code>jxinsight.server.probes.console.enabled=true</code><br />
<code>jxinsight.server.metrics.console.enabled=true</code></p>
<p>Finally a much more simplified sampled metrics table listing.</p>
<blockquote>
<p style="text-align:center;">Note: The final figure was 1,613 successful executions out of a total of 28,715 executions.</p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-metrics1.jpg"><img class="alignnone size-full wp-image-5144" title="opencore.btmetrics.console.metrics" src="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-metrics1.jpg?w=426&#038;h=650" alt="" width="426" height="650" /></a></p>
<p>The above is only the tip of the iceberg to what&#8217;s possible with <a href="http://opencore.jinspired.com" target="_blank">OpenCore&#8217;s</a> metering runtime that puts all this data within hands (<em>local call</em>) reach. There are simply no limits to how software behavior and its resource consumption can be classified unlike other solutions which offer simplistic dialogs in defining business transaction matching criteria.</p>
<p>Check-out these links to see what lies beyond the door once you push ahead with <a href="http://opencore.jinspired.com" target="_blank">OpenCore&#8217;s</a> revolutionary approach to real-time software analytics and management.</p>
<p><a href="http://opencore.jinspired.com/?p=2709" target="_blank">Automated Performance Management starts with Software’s Self Observation</a></p>
<p><a href="http://opencore.jinspired.com/?page_id=890#p" target="_blank">OpenCore Open API Samples</a></p>
<p><a href="http://williamlouth.wordpress.com/2010/10/10/opencore-probes-data-in-real-time-dirt/" target="_blank">OpenCore Probes – Data in Real Time (DIRT)</a></p>
<p><a href="http://williamlouth.wordpress.com/2010/10/04/cars-cost-aware-runtimes-and-services/" target="_blank">CARS = Cost Aware Runtimes and Services</a></p>
<p><a href="http://williamlouth.wordpress.com/2010/06/09/architectural-enforcement-with-opencore-probes/" target="_blank">Architectural Enforcement with OpenCore Probes</a></p>
<p><a href="http://williamlouth.wordpress.com/2009/01/22/listening-to-software-as-it-executes/" target="_blank">Listening to Software as it Executes</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5115&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/05/13/btm-2-0-behavioral-trait-metering-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-11.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes1.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.console.probes</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-probes-metrics.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.console.probes.metrics</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-21.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.code.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-code-32.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.code.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/opencore-btmetrics-console-metrics1.jpg" medium="image">
			<media:title type="html">opencore.btmetrics.console.metrics</media:title>
		</media:content>
	</item>
		<item>
		<title>A Comparison of Beautiful Metering Tree Visualizations</title>
		<link>http://williamlouth.wordpress.com/2011/05/05/a-comparison-of-beautiful-metering-tree-visualizations/</link>
		<comments>http://williamlouth.wordpress.com/2011/05/05/a-comparison-of-beautiful-metering-tree-visualizations/#comments</comments>
		<pubDate>Thu, 05 May 2011 15:49:54 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Visualization]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5090</guid>
		<description><![CDATA[After signing off the next milestone release of OpenCore 6.2, which will be published very soon, I have been perusing software resource metering models generated by the current default hotspot metering strategy and the new &#38; very exciting dynamic overhead budget management probes provider extension. During the course of this work I was pleasantly surprised [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5090&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>After signing off the next milestone release of <a href="http://opencore.jinspired.com/" target="_blank">OpenCore</a> 6.2, which will be published very soon, I have been perusing software resource metering models generated by the current default <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> metering <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy">strategy</a></code> and the new &amp; very exciting dynamic overhead budget management probes provider extension. During the course of this work I was pleasantly surprised by a side benefit of an innovative &amp; highly stylized (<em>themed</em>) <a href="http://www.jinspired.com/videos/opencore/opencore.6.2.m11.console.metering.tree.overview.mov" target="_blank">tree visualization</a> that was <a href="http://opencore.jinspired.com/?p=2906" target="_blank">recently</a> added into our metering and metrics monitoring console visualizing the relationship between the metering total and the inherent (<em>self</em>) metering total of a hierarchical cost assignment structure in a very concise and compact manner with minimal navigation effort.<span id="more-5090"></span></p>
<p>Before I present the visualization in context lets look a the metering models in tabular form generated by the default <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> strategy and <code>budget</code> probes provider. The first one up is <code>hotspot</code>.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-1.jpg"><img class="alignnone size-full wp-image-5091" title="hotspot.budget.table.compare.1" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-1.jpg?w=441&#038;h=257" alt="" width="441" height="257" /></a><br />
Here is the second metering model generated by the new <code>budget</code> probes provider which operates similar to <code>hotspot</code> but with additional minimum overhead guarantees needed in performance monitoring of extremely low latency applications such as financial trading platforms.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-2.jpg"><img class="alignnone size-full wp-image-5092" title="hotspot.budget.table.compare.2" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-2.jpg?w=441&#038;h=259" alt="" width="441" height="259" /></a></p>
<p>If you look at the tree root you&#8217;ll see that the overall <code>count</code> of fired probes that were metered has been reduced slightly within this new option to the metering runtime (<em>which is good but to be explained in another posting</em>). This seems to be the case for the metering totals. So it&#8217;s looking good but could it be more beautiful and immediate without resorting to generating a comparison tree table of every inner and outer tree node especially when the expanded tree structure is wide and deep and most totals will deviate to some degree.</p>
<p>Well during my perusal of both snapshots I became very confident in my initial test assessment because of a striking and memorable visual pattern that was depicted repeatedly in the console as I navigated both model hierarchies. Here is the <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> metering table this time with the tree visualization not cropped in the screenshot.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-3.jpg"><img class="alignnone size-full wp-image-5093" title="hotspot.budget.table.compare.3" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-3.jpg?w=441&#038;h=175" alt="" width="441" height="175" /></a><br />
And here is the <code>budget</code> metering table with its tree visualization. For me nothing could be more immediate and helpful than the repeating of this pleasing and emotive visual pattern.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-4.jpg"><img class="alignnone size-full wp-image-5094" title="hotspot.budget.table.compare.4" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-4.jpg?w=441&#038;h=174" alt="" width="441" height="174" /></a></p>
<p>Here is another nested part of the <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> metering visualized.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-5.jpg"><img class="alignnone size-full wp-image-5095" title="hotspot.budget.table.compare.5" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-5.jpg?w=480&#038;h=71" alt="" width="480" height="71" /></a></p>
<p>Again without looking at names and numbers I see the very same visual pattern in the <code>budget</code> version confirming the similarity of the models which is great from the point of view of our testing.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-6.jpg"><img class="alignnone size-full wp-image-5096" title="hotspot.budget.table.compare.6" src="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-6.jpg?w=480&#038;h=71" alt="" width="480" height="71" /></a></p>
<p>Want to see more? Check out the visualization in <a href="http://www.jinspired.com/videos/opencore/opencore.6.2.m11.console.metering.tree.overview.mov" target="_blank">action</a>. We think its pretty amazing and very original.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5090/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5090/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5090/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5090&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/05/05/a-comparison-of-beautiful-metering-tree-visualizations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.jinspired.com/videos/opencore/opencore.6.2.m11.console.metering.tree.overview.mov" length="4025376" type="video/quicktime" />
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-1.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-2.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-3.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-4.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.4</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-5.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.5</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/05/hotspot-budget-table-compare-6.jpg" medium="image">
			<media:title type="html">hotspot.budget.table.compare.6</media:title>
		</media:content>
	</item>
		<item>
		<title>How to Meter Anything: Focus on Change</title>
		<link>http://williamlouth.wordpress.com/2011/04/28/how-to-meter-anything-focus-on-change/</link>
		<comments>http://williamlouth.wordpress.com/2011/04/28/how-to-meter-anything-focus-on-change/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 13:26:19 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Code Execution Analysis]]></category>
		<category><![CDATA[Metering]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Performance Engineering]]></category>
		<category><![CDATA[Performance Testing]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5072</guid>
		<description><![CDATA[Following my posting last week on exception cost metering I was asked how metering could be used to approximate a maximum stack depth for software service entry points. I could have easily used the event probes provider to listen in on the software execution recording the maximum delta between two counters on a per thread basis. One [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5072&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Following my posting last week on <a href="http://williamlouth.wordpress.com/2011/04/20/how-to-meter-anything-an-exceptional-start/" target="_blank">exception cost metering</a> I was asked how metering could be used to approximate a maximum stack depth for software service entry points. I could have easily used the <code><a href="http://opencore.jinspired.com/?page_id=981#p:event" target="_blank">event</a></code> probes provider to <a href="http://williamlouth.wordpress.com/2009/01/22/listening-to-software-as-it-executes/" target="_blank">listen</a> in on the software execution recording the maximum delta between two counters on a per thread basis. One counter recording the number of <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Event.html#BEFORE_BEGIN" target="_blank">BEFORE_BEGIN</a></code> event call backs and another counter the number of <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Event.html#AFTER_END" target="_blank">AFTER_END</a></code> events but I would still need a way to associate these with entry points which might not be known or fixed at the time of development. Whilst this approach is possible by way of the metering engine extension hooks it is not actually metering per se.<span id="more-5072"></span></p>
<p>But how can the depth of a call stack be modeled as a meter when meters are basically thread specific cumulative counters and the depth of a call stack goes up and down. Once we hit the maximum stack depth the meter would never change and thus no further metering assignment would be made against those activities on the metering stack that did have a stack depth but not one that exceeded a previous maximum recorded for the thread. The trick is not to see the current value of a meter as the stack depth &#8211; but the delta from some starting point.</p>
<p>Metering is primarily focused on the change that occurs between the beginning and ending of a metered activity. The meter readings themselves are largely irrelevant &#8211; at most secondary. What is required is that the maximum stack depth be tracked within the current execution context of a service entry point call.</p>
<p>Here is how this can be achieved using <a href="http://opencore.jinspired.com/" target="_blank">OpenCore&#8217;s</a> optional <code>interceptor</code> probes provider and its<a href="http://opencore.jinspired.com/?page_id=715" target="_blank"> Open API</a> extension point <a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/interceptor/package-summary.html" target="_blank">interfaces</a>. The code only ever increases the underlying value of the resource measure registered, accessed by the <code>getValue()</code> method, when the stack depth has been exceeded. The current <code>depth</code> in terms of metered activities exceeds the <code>max</code> recorded. Both the <code>depth</code> and <code>max</code> are reset following the completion of the outer most method which is the only method that is metered as indicated by the boolean expression in the <code>return</code> statement of the <code>begin()</code> method. The <code>value</code> field in fact represent the number of changes (increments) in the <code>max</code> field within and across multiple outer most method invocations.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-code-1.jpg"><img class="alignnone size-full wp-image-5073" title="stack.depth.metering.code.1" src="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-code-1.jpg?w=462&#038;h=741" alt="" width="462" height="741" /></a></p>
<p>Here are the system properties I added to a <code>jxinsight.override.config</code> file to install the extension point and map the registered resource measure to a meter named <code>"stack.depth"</code>.</p>
<p><code>jxinsight.server.probes.strategy.enabled=false</code><br />
<code>jxinsight.server.probes.interceptor.enabled=true</code><br />
<code>jxinsight.server.probes.interceptors=stack.depth</code><br />
<code>jxinsight.server.probes.interceptor.stack.depth.factory.class=\</code><br />
<code>com.jinspired.opencore.probes.meter.stack.depth.InterceptorFactory</code><br />
<code>jxinsight.server.probes.meter.resources=stack.depth</code></p>
<p>Below is a metering model collected following the completion of a JBoss 6.0 server startup and some simple web request to their noticeably slow responding web based mgmt console. Only the outer most method invocations are metered with the stack depth recorded for those methods not metered but called directly and indirectly from such metered points. From the metering model we can see that greatest stack depth recorded was 120 and this was during the invocation of <code>process()</code> method listed first. The minimum of 48 is smallest maximum stack depth for an invocation of the <code>process()</code> method.</p>
<blockquote>
<p style="text-align:center;">Note: A benefit in modeling the stack depth as a meter is that we get additional statistical data including <code>min</code>, <code>max</code> and <code>avg</code> out of the box and that is before we enable more exotic statistical measurements afforded by OpenCore&#8217;s metering runtime which by default is configured with a bare-metal and extremely efficient runtime stack.</p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-1.jpg"><img class="alignnone size-full wp-image-5074" title="stack.depth.metering.console.1" src="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-1.jpg?w=471&#038;h=293" alt="" width="471" height="293" /></a></p>
<p>Typically one wants to limit the metering until a particular method appears on the stack representing the actual service rather than the underlying request dispatching middleware. This can be achieved using the <code><a href="http://opencore.jinspired.com/?page_id=981#p:entrypoint" target="_blank">entrypoint</a></code> probes provider along with the custom extension point. The following additional properties ensure that metering does not occur until a method is called within the <code>org.jboss.seam</code> package or its sub-packages.</p>
<p><code>jxinsight.server.probes.entrypoint.enabled=true</code><br />
<code>jxinsight.server.probes.entrypoint.name.groups=org.jboss.seam</code></p>
<p>And here is the revised metering model. I did say that <strong>anything</strong> can be <strong>metered</strong>!! All that is required is a change in thinking.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-2.jpg"><img class="alignnone size-full wp-image-5075" title="stack.depth.metering.console.2" src="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-2.jpg?w=471&#038;h=227" alt="" width="471" height="227" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5072/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5072/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5072/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5072&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/04/28/how-to-meter-anything-focus-on-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-code-1.jpg" medium="image">
			<media:title type="html">stack.depth.metering.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-1.jpg" medium="image">
			<media:title type="html">stack.depth.metering.console.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/stack-depth-metering-console-2.jpg" medium="image">
			<media:title type="html">stack.depth.metering.console.2</media:title>
		</media:content>
	</item>
		<item>
		<title>How To Meter Anything: An Exceptional Start</title>
		<link>http://williamlouth.wordpress.com/2011/04/20/how-to-meter-anything-an-exceptional-start/</link>
		<comments>http://williamlouth.wordpress.com/2011/04/20/how-to-meter-anything-an-exceptional-start/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:42:36 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Code Execution Analysis]]></category>
		<category><![CDATA[Metering]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Performance Engineering]]></category>
		<category><![CDATA[Performance Testing]]></category>
		<category><![CDATA[Profiling]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=5015</guid>
		<description><![CDATA[I was encouraged by a recent discussion thread on TheServerSide.com regarding the cost of exception throwing, in particular stack trace collection, to write about a technique we have used internally for a long time in the creation and maintenance of a quick lookup table listing the execution cost of various micro-like operations performed by the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5015&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was encouraged by a recent discussion thread on <a href="http://www.theserverside.com/" target="_blank">TheServerSide.com</a> regarding the cost of exception throwing, in particular stack trace collection, to write about a technique we have used internally for a long time in the creation and maintenance of a quick lookup table listing the execution cost of various micro-like operations performed by the Java runtime and its libraries. The technique has proven to mitigate many of the problems with micro-benchmarking especially when executed in a just-in-time compilation and dynamic optimization environment in which dead code is eliminated, calls inlined, and loops unrolled. The technique also aims to eliminate overly optimistic costings due to shortened memory access paths in test harnesses. Instead of defining a single cost value for an execution block the technique produces an estimated cost range. The technique does not completely replace well designed micro-benchmarking but instead augments it as its important to be able to measure under much stricter controlled environment, even when unrealistic, in order to detect anomalies across releases which then need to be further investigated.<span id="more-5015"></span></p>
<p>I have created the following graphics to better explain the techniques which I will then apply to the original measurement problem that was raised in the discussion thread. Lets first start with the typical micro-benchmark. Its consists of a very simple test harness/driver class that repeatedly executes a code block that needs to be measured. The call stack is extremely small and only a single call-site is defined from which the code to be tested is called. Nothing could be simpler for a dynamic compiler and adaptive optimization execution engine and generally the memory bus is not taxed at all.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-1.jpg"><img class="alignnone size-full wp-image-5031" title="htma.est.time.graph.1" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-1.jpg?w=165&#038;h=164" alt="" width="165" height="164" /></a></p>
<p>But real applications have much more call paths with much greater depths.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-2.jpg"><img class="alignnone size-full wp-image-5032" title="htma.est.time.graph.2" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-2.jpg?w=221&#038;h=271" alt="" width="221" height="271" /></a></p>
<p>An obvious solution would be to try to recreate some of the real-world aspects of this execution in the test harness itself. Unfortunately this is time consuming and the results never as realistic.</p>
<p>Our novel approach is to bring the code over into some arbitrary host application environment. It&#8217;s incredibly cost effective and introduces that realism and randomness lacking in our contrived but still very useful micro-benchmarks. We achieve this by using the same engine that is used to meter and monitor the host application in development, test or production &#8211; <a href="http://opencore.jinspired.com/" target="_blank">OpenCore</a>. When the metering engine is asked to meter the execution of code specific to the host application our micro test code is executed and measured. Then using the numerous metering <a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank">strategies</a> and optional dynamic metering probes <a href="http://opencore.jinspired.com/?page_id=981#p" target="_blank">providers</a> we can control the mechanism and degree of randomness in the execution of the test.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-3.jpg"><img class="alignnone size-full wp-image-5033" title="htma.est.time.graph.3" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-3.jpg?w=227&#038;h=272" alt="" width="227" height="272" /></a></p>
<p>Lets now see how this works in practice and applied to the measurement of <code>Exception</code> throwing overhead which is driven by the stack depth at which the <code>Exception</code> is created and the call stack accessed. Here is a simple micro-benchmark test harness that calls a method named <code>call${n}</code> which forwards the call onto another method named <code>call${n-1}</code>.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1.jpg"><img class="alignnone size-full wp-image-5016" title="htma.est.time.code.1" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1.jpg?w=289&#038;h=123" alt="" width="289" height="123" /></a></p>
<p>At the every end of the call path an <code>Exception</code> is constructed and an expensive call is made to acquire the call stack as an <code>array</code> of <code>StackTraceElement</code> instances.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1a.jpg"><img class="alignnone size-full wp-image-5017" title="htma.est.time.code.1a" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1a.jpg?w=407&#038;h=125" alt="" width="407" height="125" /></a></p>
<p>Running the test harness with different <code>call{n}</code> invoked from the <code>main</code> methods for-loop I get the following average overhead costings. The stack depth is certainly the key performance indicator for the cost profile which is as one would expect considering what is performed when <code>getStackTrace()</code> is called.</p>
<p>50 =&gt; 43 μs<br />
100 =&gt; 85 μs<br />
200 =&gt; 173 μs<br />
300 =&gt; 260 μs</p>
<p>But how representative is this of the real-world unit cost? Lets package up the code for injection into some real-world host application environment.</p>
<p>Below I have created custom <a href="http://opencore.jinspired.com/" target="_blank">OpenCore</a> <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/plugin/package-summary.html" target="_blank">ProbesPluginFactory</a></code> which registers a new named <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Measure.html" target="_blank">Probes.Measure</a></code> instance with each thread specific <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Context.html" target="_blank">Probes.Context</a></code> created by the metering runtime.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-2.jpg"><img class="alignnone size-full wp-image-5018" title="htma.est.time.code.2" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-2.jpg?w=354&#038;h=697" alt="" width="354" height="697" /></a></p>
<p>Every time an arbitrary block of code within the host application is executed and metered the <code>getValue()</code> method will be called <strong>twice</strong> &#8211; before and after the code&#8217;s execution. I only want to measure the cost (wall clock time) once so I use the metering count of another meter, <code>clock.time</code>, to determine whether I should perform the micro-benchmark measurement and then update the thread specific measurement counter.</p>
<p>After packaging up the above class into a jar named, <code>opencore-ext-est-time-meter.jar</code>, and placing it on the classpath alongside <code>opencore.jar</code> I added the following system properties to a <code>jxinsight.override.config</code> file.</p>
<p>First I disabled the default enabled <code>strategy</code> probes provider as I am going to use an alternative dynamic metering probes provider.</p>
<p><code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank">jxinsight.server.probes.strategy.enabled=false</a></code></p>
<p>I then enabled the <code>plugin</code> probes provider and registered the custom  <code><a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/plugin/package-summary.html" target="_blank">ProbesPluginFactory</a></code> class.</p>
<p><code><a href="http://opencore.jinspired.com/?page_id=981#p:plugin" target="_blank">jxinsight.server.probes.plugin.enabled=true</a></code><br />
<code>jxinsight.server.probes.plugins=est.time</code><br />
<code>jxinsight.server.probes.plugin.est.time.factory.class=\<br />
org.opencore.meter.est.PluginFactory</code></p>
<p>Next I mapped a <a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Meter.html" target="_blank"><code>Probes.Meter</code></a> to the custom <a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Measure.html" target="_blank"><code>Probes.Measure</code></a> registered in the <a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/plugin/ProbesPlugin.html#apply(com.jinspired.jxinsight.probes.Probes.Context)" target="_blank"><code>ProbesPlugin.apply()</code></a> method with the <a href="http://docs.jinspired.com/opencore/api/com/jinspired/jxinsight/probes/Probes.Context.html" target="_blank"><code>Probes.Context</code></a>.</p>
<p><code>jxinsight.server.probes.meter.resources=est.time</code></p>
<p>Because I want to control the point at which probe metering occurs in terms of stack depth I enabled our recently released <code><a href="http://opencore.jinspired.com/?p=2897">depth</a></code> probes provider and set the range to be 50(inclusive)-51(non-inclusive).</p>
<p><code>jxinsight.server.probes.depth.enabled=true</code><br />
<code>jxinsight.server.probes.depth.lower=50</code><br />
<code>jxinsight.server.probes.depth.upper=51</code></p>
<p>I then ran up a JBoss server instance in which the plugin was registered and clicked repeatedly on a few web pages in a Seam application &#8211; our host. Here is the <code>est.time</code> metering profile for those methods that were metered at depth 50.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-50.jpg"><img class="alignnone size-full wp-image-5019" title="htma.est.time.metering.depth.50" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-50.jpg?w=474&#038;h=121" alt="" width="474" height="121" /></a></p>
<p>From the table above I can see the average clock time cost is between 151-176 which is more than 4 times that of my micro-benchmark results. Lets try with a depth of 100.</p>
<p><code>jxinsight.server.probes.depth.lower=100</code><br />
<code>jxinsight.server.probes.depth.upper=101</code></p>
<p>Looking at the revised metering table below I can see that the average has increased in line with previous increases in the depth within our micro-benchmark but still the unit cost is more than 4 times the base unit cost recorded.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-100.jpg"><img class="alignnone size-full wp-image-5020" title="htma.est.time.metering.depth.100" src="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-100.jpg?w=476&#038;h=139" alt="" width="476" height="139" /></a></p>
<p>So what&#8217;s the average cost of a stack trace collection for a single thread with a call stack depth of 300. Its between 260 μs and 1,000 μs (1 ms). Now multiply that by a large number of threads and you can see why call stack sampling and exception logging are not suitable in production.</p>
<p><a href="http://williamlouth.wordpress.com/2008/11/18/an-exceptionally-bad-start/">http://williamlouth.wordpress.com/2008/11/18/an-exceptionally-bad-start/</a><br />
<a href="http://williamlouth.wordpress.com/2009/10/21/java-call-sampling-overhead-in-the-wild/" target="_blank"> http://williamlouth.wordpress.com/2009/10/21/java-call-sampling-overhead-in-the-wild/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/5015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/5015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/5015/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=5015&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/04/20/how-to-meter-anything-an-exceptional-start/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-1.jpg" medium="image">
			<media:title type="html">htma.est.time.graph.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-2.jpg" medium="image">
			<media:title type="html">htma.est.time.graph.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-graph-3.jpg" medium="image">
			<media:title type="html">htma.est.time.graph.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1.jpg" medium="image">
			<media:title type="html">htma.est.time.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-1a.jpg" medium="image">
			<media:title type="html">htma.est.time.code.1a</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-code-2.jpg" medium="image">
			<media:title type="html">htma.est.time.code.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-50.jpg" medium="image">
			<media:title type="html">htma.est.time.metering.depth.50</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/htma-est-time-metering-depth-100.jpg" medium="image">
			<media:title type="html">htma.est.time.metering.depth.100</media:title>
		</media:content>
	</item>
		<item>
		<title>How to Meter Anything: A Prelude</title>
		<link>http://williamlouth.wordpress.com/2011/04/12/how-to-meter-anything-a-prelude/</link>
		<comments>http://williamlouth.wordpress.com/2011/04/12/how-to-meter-anything-a-prelude/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 14:00:57 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>
		<category><![CDATA[Code Execution Analysis]]></category>
		<category><![CDATA[Metering]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Profiling]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=4959</guid>
		<description><![CDATA[For a while I&#8217;ve been considering writing a book on software activity monitoring and resource consumption measurement in the context of application performance optimization, quality of service (QoS), self-regulation and resource management. After reading the book &#8220;How to Measure Anything&#8221; and reviewing a recent customer dialog on the subject of &#8220;How to Meter &#8230;.&#8221; I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=4959&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For a while I&#8217;ve been considering writing a book on software activity monitoring and resource consumption measurement in the context of application performance optimization, <a href="http://opencore.jinspired.com/?p=2257#6:1:qos" target="_blank">quality of service (QoS)</a>, <a href="http://opencore.jinspired.com/?p=2709" target="_blank">self-regulation</a> and <a href="http://opencore.jinspired.com/?p=2257#6:1:supervisors" target="_blank">resource management</a>. After reading the book <a href="http://www.amazon.com/How-Measure-Anything-Intangibles-Business/dp/0470539399" target="_blank">&#8220;How to Measure Anything&#8221;</a> and reviewing a recent customer dialog on the subject of &#8220;How to Meter &#8230;.&#8221; I might have finally been given the push I&#8217;ve long needed. I&#8217;m not going to review Douglas W. Hubbard&#8217;s inspiring book here but instead give you a blow-by-blow account of the customer interaction in question.<span id="more-4959"></span></p>
<p><em><strong>Customer</strong>: How can I configure <a href="http://opencore.jinspired.com/" target="_blank">OpenCore&#8217;s</a> metering runtime to only meter activities which directly or indirectly cause other activities to be subsequently executed. I need to make this decision, via the metering <a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank"><code>strategy</code></a>, at the point of execution of the &#8220;causing&#8221; activity and before the &#8220;resulting&#8221; activity is executed. In fact I am interested in applying this metering rule along the entire path of execution leading up to the resulting activity. I can&#8217;t know this at the time of the execution of the &#8220;causing&#8221; activity because of the many layers of indirection, the huge number of possible paths in our code base, and the amount of change that occurs with each release of the application metered&#8230;..Here are some metering [snapshots] we have collected&#8230;.</em></p>
<p><em><strong>Support</strong>: Looking over the metering models I can make out a typical 3-tier application workflow: [service] entry points -&gt; [business] execution points -&gt; [services, resources] exit points. To make this easier for both of us I&#8217;ve created a small simplified test application and made an metering <a href="http://opencore.jinspired.com/?p=2257#6:1:recorder" target="_blank">recording</a> (see attachment) of its execution which we can both <a href="http://opencore.jinspired.com/?p=2257#6:1:recorder" target="_blank">playback</a> at either end under different configurations of the metering runtime. </em></p>
<p><em><strong>Customer</strong>: I assume I need the Java classes. Can you send them please?</em></p>
<p><em><em><strong>Support</strong>: </em>Using the recording log there&#8217;s no real need to share or execute the original test code and we can be sure the meter reading values will always be the same no matter which one of us executes it. Only the [cost] assignment of the meter reading will change with each playback we&#8217;ll execute&#8230;..Here is the code for 3 classes each representing a tier within the application&#8230;.Again we are never going to use these classes as I have already recorded the calls made into OpenCore&#8217;s <a href="http://opencore.jinspired.com/?page_id=715" target="_blank">Open API </a>by the instrumentation applied by the agent when I ran it up here locally.</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-1.jpg"><img class="alignnone size-full wp-image-4961" title="howtometeranything.prelude.code.1" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-1.jpg?w=282&#038;h=433" alt="" width="282" height="433" /></a></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-2.jpg"><img class="alignnone size-full wp-image-4962" title="howtometeranything.prelude.code.2" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-2.jpg?w=247&#038;h=302" alt="" width="247" height="302" /></a></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-3.jpg"><img class="alignnone size-full wp-image-4963" title="howtometeranything.prelude.code.3" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-3.jpg?w=215&#038;h=192" alt="" width="215" height="192" /></a></p>
<p><em><strong>Customer</strong>: Thanks. The code pattern looks quite similar to what we have. Just needed to some see code&#8230;.. Still not sure of the &#8220;magic&#8221; recording &amp; playback bit but I am sure I&#8217;m in for an interesting ride <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </em></p>
<p><em><strong>Support</strong>: Lets first playback the metering recording with the <code>console</code> probes provider enabled so we can both explore the metering model in the OpenCore metering and metrics console and explore aspects of its execution flow and metering measurement.</em></p>
<p><em><strong>Customer</strong>: Cool!</em></p>
<p><em><strong>Support</strong>: To playback the metering recording you need to execute the following command line changing the native library part to the platform on which on the playback is being performed. You can actually record on one platform and playback on another.</em></p>
<p><code>java -classpath ${OPENCORE}/lib/opencore.jar -agentpath:${OPENCORE}/bin/[solaris|osx|linux|aix|hpux|zlinux]-[x86|sparc|ppc|parisc|ia64]-[31|32|64]/libjxinsight.[so|sl|jnilib]=prod com.jinspired.jxinsight.server.probes.RecorderPlayback ${recording.log}</code></p>
<p>or</p>
<p><code>java -classpath %OPENCORE%\lib\opencore.jar -agentpath:%OPENCORE%\bin\windows-[x86-[32|64]|ia64]\jxinsight.dll=prod com.jinspired.jxinsight.server.probes.RecorderPlayback %LOG%</code></p>
<p><em><strong>Support</strong>: Before doing that create a <code>jxinsight.override.config</code> in the directory in which you will execute the above adding the following line to enable the console.</em></p>
<p><code>jxinsight.server.probes.console.enabled=true</code></p>
<p>&nbsp;</p>
<p><em><strong>Support</strong>: When the playback is completed a file ending with <code>"-probes.ocs"</code> will be exported. Mount the directory in the console and open up the model snapshot. It should look exactly like the following screenshot except for any sorting you might have in your local <code>preferences.jdb</code> file.</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-1.jpg"><img class="alignnone size-full wp-image-4965" title="howtometeranything.prelude.console.1" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-1.jpg?w=462&#038;h=430" alt="" width="462" height="430" /></a></p>
<p><em><strong>Customer</strong>: Exactly the same.</em></p>
<p><em><strong>Support</strong>: Great. Now lets do another playback of the recording this time with the <code>tracking</code> probes provider enabled so you can more easily call out the execution behavior that its much more interesting in production for your reporting purposes. Here are the lines in my jxinsight.override.config file.</em></p>
<p><code>jxinsight.server.probes.console.enabled=true</code><br />
<code><a href="http://opencore.jinspired.com/?page_id=981#p:tracking" target="_blank">jxinsight.server.probes.tracking.enabled=true</a></code></p>
<p><em><strong>Customer</strong>: Looking at the tracking table in the console here I can see the path of execution which I would like to meter exclusively. Its <code>EntryPoint.[main()-&gt;doWork()-&gt;delegate()]-&gt;ExecPoint.[doWork()-&gt;delegate()]-&gt;ExitPoint.doWork()</code>. Of course this needs to be applied to different paths, classes and methods names but with similar packaging in our codebase.</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-2.jpg"><img class="alignnone size-full wp-image-4966" title="howtometeranything.prelude.console.2" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-2.jpg?w=464&#038;h=310" alt="" width="464" height="310" /></a></p>
<p><em><strong>Support</strong>: So the metering <em> <a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank"><code>strategy</code></a></em> needs to be configured to not meter activities which do not call into, directly or indirectly, the <code>ExecPoint.doWork()</code> method?</em></p>
<p><em><strong>Customer</strong>: Yes and no. We don&#8217;t want to meter any activity that does not call into any method in the <code>opencore.outbound.*</code> package.</em></p>
<p><em><strong>Support</strong>: I see. Lets create a custom meter, <code>exit.count</code>, that is based on the <code>clock.time</code> metering of any metered method in <code>opencore.outbound.*</code> package. <strong>We are going to meter the metering itself.</strong> Here are the entries in my <code>jxinsight.override.config</code> file</em></p>
<p><code>jxinsight.server.probes.meter.probes=exit</code><br />
<code>jxinsight.server.probes.meter.probe.exit.group=opencore.outbound</code><br />
<code>jxinsight.server.probes.meter.probe.exit.meter=clock.time</code><br />
<code>jxinsight.server.probes.meter.probe.exit.name=exit.count</code><br />
<code>jxinsight.server.probes.meter.probe.exit.statistic=count</code></p>
<p><em><strong>Customer</strong>: Looking at the metering for the <code>exit.count</code> meter in my model I can now clearly point out which metered activities [methods] do not call into the <code>opencore.outbound.*</code> package. Those with a blank [zero] in their <code>Total</code> column. Yes?</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-3.jpg"><img class="alignnone size-full wp-image-4967" title="howtometeranything.prelude.console.3" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-3.jpg?w=437&#038;h=430" alt="" width="437" height="430" /></a></p>
<p><em><strong>Support</strong>: Exactly. Now lets configure the metering <em> <a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank"><code>strategy</code></a> </em>to base is decision making on this new custom meter and not the default one of <code>clock.time</code>. We are going to us the past metering behavior to alter the future metering behavior at runtime. No developer guesswork here &#8211; based entirely on actual behavior. Please add the following to your existing configuration.</em></p>
<p><code>jxinsight.server.probes.strategy.hotspot.meter=exit.count</code><br />
<code>jxinsight.server.probes.strategy.hotspot.threshold=1</code><br />
<code>jxinsight.server.probes.strategy.hotspot.statistic=avg</code></p>
<p><em><strong>Customer</strong>: In my new metering model, generated by the playback, I see that the overall metering count has dropped because the <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> metering <em> <a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank"><code>strategy</code></a></em> has disabled a number of probes that never made calls into the <code>opencore.openbound</code> package.</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-4.jpg"><img class="alignnone size-full wp-image-4968" title="howtometeranything.prelude.console.4" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-4.jpg?w=437&#038;h=428" alt="" width="437" height="428" /></a></p>
<p><em><strong>Support</strong>: Yes. You are basically parameterizing the training of the metering runtime.</em></p>
<p><em><strong>Customer</strong>: Tracking is looking good!</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-5.jpg"><img class="alignnone size-full wp-image-4969" title="howtometeranything.prelude.console.5" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-5.jpg?w=464&#038;h=208" alt="" width="464" height="208" /></a></p>
<p><em><strong>Customer</strong>: And my <code>clock.time</code> metering model looks much better. Fantastic!</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-6.jpg"><img class="alignnone size-full wp-image-4970" title="howtometeranything.prelude.console.6" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-6.jpg?w=462&#038;h=427" alt="" width="462" height="427" /></a></p>
<p><em><strong>Customer</strong>: So once this is up and running for a much longer period of time in production <strong>only</strong> those methods that consistently make outbound (based on mapping to our package structure) calls will continue to be metered and costed?</em></p>
<p><em><strong>Support</strong>: Correct. By default after <strong>every</strong> 1,000 metered firings of a probe <em>the <code><a href="http://opencore.jinspired.com/?page_id=981#p:strategy:hotspot" target="_blank">hotspot</a></code> metering <em><a href="http://opencore.jinspired.com/?page_id=981#p:strategy" target="_blank"><code>strategy</code></a></em> </em>will decide whether to continue to meter a named activity or not. You can change this with the following system property if you wish to make this determination much sooner or later in the course of your production monitoring.</em></p>
<p><code>jxinsight.server.probes.strategy.hotspot.warmup=100</code></p>
<p><em><strong>Customer</strong>: Looking over the tracking table again I realized we are not really interested in metering the methods in the <em> <code>opencore.outbound.*</code> </em> that are not invoked directly by external packages. I only really need the <code>ExitPoint.doWork()</code> to be metered. It would be great if we could exclude <code>prepare()</code>, <code>delegate()</code> and c<code>leanup()</code>. Again these methods would not be easily discernible from our large and complex codebase even in just this package &#8211; that&#8217;s if everything remained constant for just one day ;-(.</em></p>
<p><em><strong>Support</strong>: No problem. We can use the optional <code><a href="http://opencore.jinspired.com/?page_id=981#p:tierpoint" target="_blank">tierpoint</a></code> probes provider to solve this without you having to attempt to list every single possible surface point in this package. Here is what I added to my local configuration to create a tier which restricts metering at runtime to only the tier&#8217;s surface points:</em></p>
<p><code><a href="http://opencore.jinspired.com/?page_id=981#p:tierpoint" target="_blank">jxinsight.server.probes.tierpoint.enabled=true</a></code><br />
<code>jxinsight.server.probes.tierpoint.tiers=exit</code><br />
<code>jxinsight.server.probes.tierpoint.tier.exit.name.groups=opencore.outbound</code></p>
<p><em><strong>Customer</strong>: Wow. The <code>prepare()</code>, <code>delegate()</code> and <code>cleanup()</code> methods in the <code>ExitPoint</code> class are not metered any more. Is there anything this thing can&#8217;t do?</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-7.jpg"><img class="alignnone size-full wp-image-4971" title="howtometeranything.prelude.console.7" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-7.jpg?w=457&#038;h=432" alt="" width="457" height="432" /></a></p>
<p><em><strong>Support</strong>: If it was not able to do something today it would probably be able to do it tomorrow <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . It is incredibly extensible.</em></p>
<p><em><strong>Customer</strong>: One of our engineers here was wondering whether this same technique could be applied to only meter those methods that call <strong>directly</strong> into the <em> <code>opencore.outbound.*</code> </em> package and the methods called themselves. We can&#8217;t always determine this because of the use of reflection and some other layers on indirection that we don&#8217;t instrument today. In the recording this would be <code>ExecPoint.delegate()</code> and <code>ExitPoint.doWork()</code>. We tried changing the <code>hotspot</code> statistic to to <code>inherent.avg</code> but that did not work. Am I pushing it to its limit?</em></p>
<p><em><strong>Support</strong>: That is because the metering <code>"Total (I)"</code> column for the <code>exit.count</code> meter is blank [zero] for all other probes except those in the <code>opencore.outbound.*</code> package. Not to worry lets change the definition of our custom meter, <code>exit.count</code>, keeping everything else pretty much the same. The following maps our meter to a metering queue which increments a [thread specific] running count on every non-reentrant call into a metering group which can represent a package, class or method in our model.</em></p>
<p><code>jxinsight.server.probes.strategy.hotspot.statistic=inherent.total</code><br />
<code><a href="http://opencore.jinspired.com/?page_id=981#p:queue" target="_blank">jxinsight.server.probes.queue.enabled=true</a></code><br />
<code>jxinsight.server.probes.meter.queues=exit.count</code><br />
<code>jxinsight.server.probes.meter.queue.exit.count.group=opencore.outbound</code></p>
<p><em><strong>Customer</strong>: Strange. That change seems to have disabled the <code>ExitPoint.doWork()</code> method and re-enabled the <code>ExitPoint.[prepare(),work(),prepare()]</code> methods.</em></p>
<p><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-8.jpg"><img class="alignnone size-full wp-image-4972" title="howtometeranything.prelude.console.8" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-8.jpg?w=432&#038;h=432" alt="" width="432" height="432" /></a></p>
<p><em><strong>Support</strong>: Oops. I forgot to exclude those probes in the <code>opencore.outbound.*</code> package from being enhanced by the <code>strategy</code> probes provider. Since the enqueuing happens before they are metered they will never see a change in the <code>exit.count</code> meter. The reason for some probes being re-enabled is because once the <code>ExitPoint.doWork()</code> probe is disabled those methods previously called by it now become surface points in the tier. This is why they are not disabled and why they have a count of 1000. I did say this is all dynamic. The only thing being pushed to its limit here is both of our mental capacities <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> . To OpenCore its a stroll in the park. Add the following.</em></p>
<p><code>jxinsight.server.probes.strategy.filter.enabled=true</code><br />
<code>jxinsight.server.probes.strategy.filter.exclude.name.groups=opencore.outbound</code></p>
<p><em><em><strong>Customer</strong>: I am in awe&#8230;..</em></em></p>
<p><em><a href="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-91.jpg"><img class="alignnone size-full wp-image-5000" title="howtometeranything.prelude.console.9" src="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-91.jpg?w=456&#038;h=429" alt="" width="456" height="429" /></a><br />
</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/4959/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/4959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/4959/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=4959&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/04/12/how-to-meter-anything-a-prelude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-1.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.code.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-2.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.code.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-code-3.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.code.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-1.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-2.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-3.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-4.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.4</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-5.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.5</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-6.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.6</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-7.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.7</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-8.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.8</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/04/howtometeranything-prelude-console-91.jpg" medium="image">
			<media:title type="html">howtometeranything.prelude.console.9</media:title>
		</media:content>
	</item>
		<item>
		<title>Which Ruby VM? Consider Monitoring!</title>
		<link>http://williamlouth.wordpress.com/2011/03/17/which-ruby-vm-consider-monitoring/</link>
		<comments>http://williamlouth.wordpress.com/2011/03/17/which-ruby-vm-consider-monitoring/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 00:02:43 +0000</pubDate>
		<dc:creator>williamlouth</dc:creator>
				<category><![CDATA[Application Performance Management]]></category>
		<category><![CDATA[OpenCore]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://williamlouth.wordpress.com/?p=4864</guid>
		<description><![CDATA[There are a few negatives associated with benchmarking but in general benchmarks help engineering teams get time and resources from product management to focus on this important aspect of software. The continued innovation in VMs for languages such as Java, Ruby and JavaScript is a testament to this. But one thing that has always struck [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=4864&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:left;">There are a few negatives associated with benchmarking but in general benchmarks help engineering teams get time and resources from product management to focus on this important aspect of software. The continued innovation in VMs for languages such as Java, Ruby and JavaScript is a testament to this. But one thing that has always struck me as odd is that most of the non-microbenchmarks seem to ignore a fundamental concern of operational management &#8211; <strong>production monitoring</strong>. Benchmarks are designed and run completely oblivious to this. The stakes are high and it would seem the risks are even higher in benchmarks that are meant to be representative of real-world usage. In the context of Ruby VM selection this oversight can be detrimental to the performance and cost of monitored applications as there are significant differences in the underlying monitoring capabilities, the associated overhead, and tooling.<span id="more-4864"></span></p>
<p>At the moment there are two major Ruby VM camps. Those VM&#8217;s written in C/C++ versus a single one written in Java which itself is executed by a runtime written primarily in C/C++. Each camp has its own performance gains and losses but for the most part its a pretty close race except until it comes to production monitoring in which there is a clear winner.</p>
<p>Below is a Ruby class I am going to use to determine and compare the unit cost of New Relic, which is the most touted and overrated (<em>you&#8217;ll soon see why</em>) monitoring solution for C/C++ based Ruby VM&#8217;s though its written in Ruby, with JINSPIRED&#8217;s OpenCore, which is the highest performing metering/monitoring solution in Java with unique native JRuby-to-Ruby integration.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_1.jpg"><img class="alignnone size-full wp-image-4879" title="newrelic_vs_opencore_code_1" src="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_1.jpg?w=232&#038;h=291" alt="" width="232" height="291" /></a></p>
<p>New Relic offers two means in which to instrument a Ruby class for performance measurement and monitoring purposes. Here is our Ruby class sprinkled with instrumentation calls to the first of these. Both <code>Loop.call()</code> and <code>Loop.run()</code> are instrumented.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_2.jpg"><img class="alignnone size-full wp-image-4880" title="newrelic_vs_opencore_code_2" src="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_2.jpg?w=284&#038;h=411" alt="" width="284" height="411" /></a></p>
<p>The second way of collecting performance data with New Relic is using a transaction tracer. This generally collects much more detailed information related to invocation patterns than the simple metric aggregating method tracer though in our test case it has very little work to do because its only applied to the empty <code>Loop.call()</code> method.</p>
<blockquote>
<p style="text-align:center;"><em>This is the best, best case for such a collector. In fact when it comes to more contextual traces such as SQL queries the overhead is substantially higher but this overhead can be masked if your database is slow performing.</em></p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_31.jpg"><img class="alignnone size-full wp-image-4882" title="newrelic_vs_opencore_code_3" src="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_31.jpg?w=472&#038;h=376" alt="" width="472" height="376" /></a></p>
<p>Here are the New Relic &#8220;very best case&#8221; <strong>overhead costs per call</strong> invocation running the two instrumented versions of our <code>Loop</code> Ruby class on two different Ruby VM&#8217;s after subtracting the cost in executing a non-instrumented version of the <code>Loop.call()</code> method. Clearly your choice of instrumentation technique has a bearing on the winning Ruby VM though I would question whether any application could afford such excessive overhead.</p>
<blockquote>
<p style="text-align:center;"><em>It took less than 1 sec to perform a single <code>Loop.run()</code> call without any instrumentation. With transaction tracing it took <strong>67 minutes!!!</strong></em></p>
</blockquote>
<p><a href="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_0.jpg"><img class="alignnone size-full wp-image-4910" title="newrelic_vs_opencore_chart_0" src="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_0.jpg?w=286&#038;h=224" alt="" width="286" height="224" /></a></p>
<p>For the OpenCore comparison benchmark run no code changes are required. All that&#8217;s needed is the setting of the environment variable, <code>JRUBY_OPTS</code>, to</p>
<p><code>-J-agentpath:/OpenCore/bin/osx-32/libjxinsight.jnilib=prod -J-javaagent:/OpenCore/bundle/jruby/shell/opencore-ext-aj-javaagent.jar</code></p>
<p>and <code>VERIFY_JRUBY</code> to <code>true</code>.</p>
<p>I performed two test runs with OpenCore&#8217;s metering engine. The first run had our dynamic cost aware <code>hotspot</code> strategy enabled, which is the default setting for production, and the second run with it disabled. The difference between both OpenCore test runs is that after a number of <code>Loop.call()</code> invocations the <code>hotspot</code> strategy would effectively disable all further metering of the instrumented method because of its runtime cost profile. The instrumentation would be still present but short-circuited.</p>
<p><a href="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_11.jpg"><img class="alignnone size-full wp-image-4918" title="newrelic_vs_opencore_chart_1" src="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_11.jpg?w=467&#038;h=196" alt="" width="467" height="196" /></a></p>
<p>The overhead difference is huge giving <a href="http://www.jruby.org" target="_blank">JRuby</a> a significant lead over all Ruby VM implementations in being able to perform between 4,000 and 83,000 more OpenCore metered call invocations for every <strong>single</strong> traced call invocation performed by New Relic.</p>
<p>OpenCore + JRuby offers Ruby developers deploying applications into production with greater code coverage, lower overhead, less risk, as well as savings in computing costs and resource consumption. More importantly it eliminates the guess work in deciding what should be instrumented and measured via the built-in cost awareness and self regulation of the metering runtime.</p>
<blockquote>
<p style="text-align:center;"><em>Here is a screen <a href="http://www.jinspired.com/videos/opencore/opencore.console.jruby.shell.mov" target="_blank">video</a> showing how to use both the JRuby built-in profiler and OpenCore&#8217;s JRuby-to-Ruby metering extension.</em></p>
</blockquote>
<p><strong><code>Software</code></strong><br />
<code>JINSPIRED OpenCore 6.2.M7</code><br />
<code>New Relic RPM 2.13.5.beta4</code></p>
<p><strong><code>java version "1.6.0_22"</code></strong><br />
<code>Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)</code><br />
<code>Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)<br />
</code></p>
<p><strong><code>Environment</code></strong><br />
<code>Model Name: iMac</code><br />
<code>Model Identifier: iMac11,1</code><br />
<code>Processor Name: Intel Core i7</code><br />
<code>Processor Speed: 2.8 GHz</code><br />
<code>Number Of Processors: 1</code><br />
<code>Total Number Of Cores: 4</code><br />
<code>L2 Cache (per core): 256 KB</code><br />
<code>L3 Cache: 8 MB</code><br />
<code>Memory: 8 GB</code><br />
<code>Processor Interconnect Speed: 4.8 GT/s</code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/williamlouth.wordpress.com/4864/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/williamlouth.wordpress.com/4864/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/williamlouth.wordpress.com/4864/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=williamlouth.wordpress.com&amp;blog=4209026&amp;post=4864&amp;subd=williamlouth&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://williamlouth.wordpress.com/2011/03/17/which-ruby-vm-consider-monitoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.jinspired.com/videos/opencore/opencore.console.jruby.shell.mov" length="4496777" type="video/quicktime" />
	
		<media:content url="http://1.gravatar.com/avatar/fc0e0e0b6cd94c7c31748cd5d96e8a13?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">williamlouth</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_1.jpg" medium="image">
			<media:title type="html">newrelic_vs_opencore_code_1</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_2.jpg" medium="image">
			<media:title type="html">newrelic_vs_opencore_code_2</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_code_31.jpg" medium="image">
			<media:title type="html">newrelic_vs_opencore_code_3</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_0.jpg" medium="image">
			<media:title type="html">newrelic_vs_opencore_chart_0</media:title>
		</media:content>

		<media:content url="http://williamlouth.files.wordpress.com/2011/03/newrelic_vs_opencore_chart_11.jpg" medium="image">
			<media:title type="html">newrelic_vs_opencore_chart_1</media:title>
		</media:content>
	</item>
	</channel>
</rss>
