<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>/dev/websphere</title><link>http://www.devwebsphere.com/devwebsphere/</link><description>My rambling on WebSphere and J2EE. All opinions are my own and don't reflect those of my employer, IBM.</description><language>en</language><lastBuildDate>Tue, 27 Oct 2009 15:01:27 PDT</lastBuildDate><generator>TypePad http://www.typepad.com/</generator><media:copyright>2007 (C) Trackpedia Inc</media:copyright><media:keywords>websphere,java,j2ee,objectgrid,xd</media:keywords><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Software How-To</media:category><itunes:owner><itunes:email>bnewport@us.ibm.com</itunes:email><itunes:name>Billy Newport</itunes:name></itunes:owner><itunes:author>Billy Newport</itunes:author><itunes:explicit>no</itunes:explicit><itunes:keywords>websphere,java,j2ee,objectgrid,xd</itunes:keywords><itunes:subtitle>Billy Newport discussing WebSphere, XD and ObjectGrid issues.</itunes:subtitle><itunes:summary>Billy Newport discussing WebSphere, XD and ObjectGrid issues.</itunes:summary><itunes:category text="Technology"><itunes:category text="Software How-To" /></itunes:category><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/dev/websphere" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Memory usage/sizing in IBM WebSphere eXtreme Scale</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/dlmem2Avsnk/memory-usage-in-ibm-websphere-extreme-scale.html</link><category>nosql</category><category>WebSphere eXtreme Scale</category><category>WebSphere Performance</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Wed, 28 Oct 2009 08:32:01 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a67d4fc3970c</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p><strong>UPDATED to include compressed 64 bit numbers.</strong></p><p>I figured this was worth doing quickly so here are some numbers for the overhead in WebSphere eXtreme Scale for storing 1m objects in a grid. I'm using a single JVM grid in this case but this applies no matter how many JVMs.</p><p>I'm storing 1 million Person objects with the following structure:</p><p></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Courier New'">    String <span style="color: #2600ca">firstName</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Courier New'">    String <span style="color: #2600ca">surname</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Courier New'">    String <span style="color: #2600ca">street</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Courier New'">    String <span style="color: #2600ca">city</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Courier New'">    String <span style="color: #2600ca">zipcode</span>;</p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">I'm populating these strings with some small sample strings. I'm using a key which is just a person# string.</span></span></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">I did the test with 32 bit and 64 bit Sun Java 6 server JVMs on my macbook. I pulled heap usage using the <a href="http://www.devwebsphere.com/personal/2009/10/enabling-jconsole-and-jmap-etc-on-java-6-with-snow-leopard.html">jmap</a> utility supplied with the JDK (jmap -histo:live pid).</span></span></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">WebSphere eXtreme Scale can store object values in two ways, as POJOs or as a compact serialized form (more efficient than normal serialization, like a byte packed version of the data in the value, only available in 7.0+). The byte mode is enabled by having a copyMode="COPY_TO_BYTES" on the backingmap definition in objectgrid.xml. Lets look at the heap size after a system GC in 64 bit JVM mode:</span></span></p><p></p><ul>
<li><span style="font-family: 'Courier New', Verdana, sans-serif; font-size: 12px; line-height: normal; ">64 bit POJO    782.7MB</span></li>
<li><span style="font-family: 'Courier New', Verdana, sans-serif; font-size: 12px; line-height: normal; ">64 bit BYTE    381.0MB</span></li>
</ul>
<p></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">So, you can see the BYTE representation is much more compact than the POJO version, about double the density.</span></span></p><p style="font-size: 12px; "><font size="3"><span style="font-size: 12px; line-height: normal;"><span style="font-size: 12px; ">Lets look at when we use </span><span style="font-size: 10px; "><span style="font-size: 11px; ">-XX:+UseCompressedOops</span></span></span></font></p><p></p><ul>
<li><span style="font-size: 10px; line-height: normal; "><span style="font-size: 11px; font-family: Helvetica, Verdana, sans-serif; ">64 bit POJO</span><span class="Apple-tab-span" style="white-space:pre"><span style="font-size: 11px; font-family: Helvetica, Verdana, sans-serif; ">		</span></span><span style="font-size: 11px; "><span style="font-size: 12px; ">592.0M</span></span></span></li>
<li><font size="2"><span style="font-size: 10px; line-height: normal;"><span style="font-size: 12px; ">64 bit BYTE</span><span class="Apple-tab-span" style="white-space:pre"><span style="font-size: 11px; ">		</span></span><span style="font-size: 11px; ">299.4M</span></span></font></li>
</ul>
<p></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">You can see that compressed mode significantly reduces the 64 bit overhead by about 25%.</span></span></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">If we do the same thing with 32 bit JVM (-d32 on Mac) then we see</span></span></p><p></p><ul>
<li><span style="font-family: 'Courier New', Verdana, sans-serif; font-size: 12px; line-height: normal; ">32 bit POJO    523.6MB</span></li>
<li><span style="font-family: 'Courier New', Verdana, sans-serif; font-size: 12px; line-height: normal; ">32 bit BYTE    261.0MB</span></li>
</ul>
<p></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">You can see 64 bit has quite a large overhead on Sun. Compressed 64 bit isn't so bad but still isn't as good as straight 32 bit. This is why we recommend 32 bit JVMs with heap sizes under 2.5Gb. It's just most efficient from a memory point of view.</span></span></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;">In 32 bit mode, here is a break down for the POJO mode:</span></span></p><p><span size="3;" style="font-family: 'Courier New', Verdana, sans-serif"><span style="font-size: 12px; line-height: normal;"></span></span></p><p></p><ul>
<li> num     #instances         #bytes  class name</li>
<li>----------------------------------------------</li>
<li>   1:       6016578      230933320  [C</li>
<li>   2:       6017049      144409176  java.lang.String</li>
<li>   3:       1000000       80000000  com.ibm.ws.objectgrid.plugins.CacheEntryHeapFactory$HeapEntry</li>
<li>   4:       1000000       32000000  sample.bench.Person</li>
<li>   5:        342796       19860816  [Lcom.ibm.ws.xs.util.AbstractMapEntry;</li>
</ul>
<p></p><p></p>
The WebSphere eXtreme Scale runtime uses around 80 bytes for each cache entry and we use a optimized hybrid multi-level hash map taking 19MB total or 19 bytes per entry. So, thats 99 bytes per entry.<p></p><p>The BYTES model looks like:</p><p></p><p></p><ul>
<li> num     #instances         #bytes  class name</li>
<li>----------------------------------------------</li>
<li>   1:       1005960      108283256  [B</li>
<li>   2:       1000000       80000000  com.ibm.ws.objectgrid.plugins.ByteArrayCacheEntryFactory$ByteArrayEntry</li>
<li>   3:       1016742       25359464  [C</li>
<li>   4:       1017199       24412776  java.lang.String</li>
<li>   5:        342802       19861344  [Lcom.ibm.ws.xs.util.AbstractMapEntry;</li>
</ul>
<p></p><p></p><p>So, our overhead here is 80 bytes per byte array entry, the values are stored as byte[]s in the 108MB chunk and the hybrid hash map takes again 19MB. So, the overhead is still 99 bytes per entry but each entry is stored more efficiently than in POJO mode and it is this saving which makes the big difference in the heap sizes seen above.</p><p>Applications interacting with the grid remotely typically use byte mode. Applications running collocated with the grid for highest performance typically use POJO mode in combination with other features but thats another blog entry.</p><p>The WXS code about to be released drops the overhead down further to 64 bytes rather than 80 and that will be available soon.</p><p>Each partition primary/replica shard is kept in its own area and we've had that design from the beginning because if we kept all data in all shards in a JVM in the same hash map then splitting them is expensive so we never did it that way.</p><p></p><p>Hopefully, this helps customers size heaps and memory. Obviously, we are continuously working to improve memory density so we can change this when ever we choose to so individual class names we use are not guaranteed at any time.</p><p></p><p></p></div><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/dlmem2Avsnk" height="1" width="1"/>]]></content:encoded><description>UPDATED to include compressed 64 bit numbers. I figured this was worth doing quickly so here are some numbers for the overhead in WebSphere eXtreme Scale for storing 1m objects in a grid. I'm using a single JVM grid in...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/10/memory-usage-in-ibm-websphere-extreme-scale.html</feedburner:origLink></item><item><title>KV Programming with a column per entry versus entity per entry</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/c05uIpmKqe8/kv-programming-with-a-column-per-entry-versus-entity-per-entry.html</link><category>nosql</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Thu, 15 Oct 2009 06:08:46 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a5e8a388970b</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>It looks like memcached and redis users typically store data in column oriented style. This means that rather than store a Person object using the person key, they instead store each attribute of the person as a seperate key, for example:</p><p>&lt;P:123:FirstName,Billy&gt;</p><p>&lt;P:123:Surname,Newport&gt;</p><p>&lt;P:123:Country,USA&gt;</p><p>So, if the object had 3 attributes then there are 3 entries. This is flexible in that it's easy to add attributes when they are needed. The store object approach makes that more difficult as the value has a type and it's not easy to add a new attribute. You could store a HashMap as the value which means adding an attribute is easy.</p><p>So, you get flexibility with the entry per attribute approach but you pay a heavy performance cost. If a page uses a Person data entry then you may need to make several remote calls to the cache to get this one person. If there is a list of friends then you'd do this for each person. The number of RPCs per page starts to add up pretty fast. I'm pretty sure this is why you see blog entries etc on why memcached needs crazy fast response times, it's simply because one page calls it so often. So, while for environments where extreme schema flexibility is needed, it's an option. You pay a heavy price in terms of performance.</p><p>An entity based approach where you store the object at the key uses less memory on the server simply because there are fewer entries per object, i.e. there is one versus one per attribute. Fetching a single entity is cheaper because it's one RPC and you have it all rather than one per attribute. This means that if a page has ten Person objects to be rendered and each Person has 10 attributes then the column approach uses 100 RPCs while the object approach uses 10.</p><p>The other issue here is memcached does not offer transactions. Attributes for a single 'object' may hash to different memcached servers and with UDP especially, updates are not guaranteed to work. So, consistency is definitely a problem. Updates may half work. This isn't acceptable to many and the entry per object approach avoids this issue even without transactions because sometimes, all or nothing is better than half way.</p><p>I don't think there is a one is better than the other here. For extreme flexibility on schema the attribute per entry model OR the hashmap per entry model is most flexible but it definitely has a cost in terms of performance and consistency. Fetching only exactly the subset of the attributes that you need may be a benefit but the RPC cost cannot be ignored.</p><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/c05uIpmKqe8" height="1" width="1"/>]]></content:encoded><description>It looks like memcached and redis users typically store data in column oriented style. This means that rather than store a Person object using the person key, they instead store each attribute of the person as a seperate key, for...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/10/kv-programming-with-a-column-per-entry-versus-entity-per-entry.html</feedburner:origLink></item><item><title>memcached versus DataGrid, dumb server versus smart server...</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/T1jhdh33zfg/memcached-versus-datagrid-dumb-server-versus-smart-server.html</link><category>Cloud</category><category>High Availability</category><category>nosql</category><category>Persistence</category><category>Web/Tech</category><category>WebSphere eXtreme Scale</category><category>XTP</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Wed, 14 Oct 2009 11:22:04 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a63c2ae1970c</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Memcached is a pretty popular free open source distributed cache. It's pretty unique compared with the commercial data grids in that it has a completely unique design.</p><p>Memcached is basically a dumb server. This means it's a process running on a Linux box typically which accepts client requests for keys and returns the data. Updates and deletes are also supported. This is ALL the function in the server, hence, dumb server. The client is the only piece which is 'distributed' or even knows about other servers. The clients typically get a collection of host:ip addresses (they all NEED to use the same list) and the clients hash the key over the set of online servers. If there were 4 servers running then all clients will hash data for a key over these 4 servers. Clients will write data for a key K to a particular server using this hash algorithm. One server.</p><p>Now, thats what memcached does out of the box. Note, there is no replication on the server side. If a server fails then the clients will hash keys over 3 servers but this changes everything from a hashing point of view so it's likely you'll get a very high miss rate as it's unlikely keys still hash to the same server as before given the modulo part of the hashing is now 3 instead of 4.</p><p>Clients work around this by adding a <a href="http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/" target="_blank">consistent hashing</a> layer on top of the normal client. This works better and writes may be written to a server and the next server in the hash ring. This slows down writes by 2x but allows some recoverability when a server fails. The next server in the ring has the data from the dead server so it's not as bad as before BUT if this server also fails then now the cache has lost the data. It's not replicated remember, it's just written twice. After the first server failed, the clients write changes to the next server and the following server in the hash ring. The new next server in the ring does not have a copy of all the data. It was never written there. It will just have new changes since the failure. There is no active replication going on here.</p><p>Most of the materiel on the web shows various workarounds to try to make memcached 'reliable'. A lot of the<a href="http://www.facebook.com/note.php?note_id=114979233919" target="_blank"> facebook engineering blog entries</a> focus on this aspect. What they had to do to make it reliable. This works for facebook but won't work in general because I don't think the majority of customers are structured like they are from a build your own mentality. I was talking to someone from one of the big internet shops last week and they always run two memcached clusters for HA. If a server in cluster A fails then they stop using cluster A and switch to B. This works but thats a 50% loss in hardware because of a single failure.</p><p><strong>Smart servers</strong></p><p>Commercial data grids like IBM WebSphere eXtreme Scale are very different. They handle making the data fault tolerant on the server side with built-in replication and elastic scale out and scale in. Their clients understand the server side data layout or routing. If a server fails with WebSphere eXtreme Scale then no data is lost. The software actively maintains replicas on other servers. Clients that stored an entry with a key K before will still find it. It just works. You don't need consistent hashing on the client, our client does it using routing tables instead. Adding more server processes causes the product to automatically redistribute the minimum amount of data to leverage the new memory/CPU and network available through the new JVMs.</p><p>The smart servers allow proper replication which means that the cache isn't as brittle as the memcached cache when servers come and go. If nothing ever fails then the memcached approach works but the potential cache hit rates over time if multiple failures occur mean it can be a liability. The last facebook entry I read on this showed them crawling the logs to try to recover lost data to make the 'next server' more complete. They get this issue and are jumping through hoops to handle it but again, most commercial customers won't do this. They expect the product to do this sort of stuff like replication and they view it as table steaks.</p><p>So, memcached for sure has its uses but it's got some limitations which need a fair bit of work by its users to handle correctly if its not exactly what you want or risk some bad scenarios as the cache hit rate climbs. It's very, very fast but you gotta remember, it's not doing much either... No transactions, no consistency, no replication, no isolation and so on. If you don't need these features then it's pretty fast but if you do need this stuff then it starts to slow as you add code on the client side to try and compensate for the limitations.</p><p></p><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/T1jhdh33zfg" height="1" width="1"/>]]></content:encoded><description>Memcached is a pretty popular free open source distributed cache. It's pretty unique compared with the commercial data grids in that it has a completely unique design. Memcached is basically a dumb server. This means it's a process running on...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/10/memcached-versus-datagrid-dumb-server-versus-smart-server.html</feedburner:origLink></item><item><title>Interview: JAOO Today @ Aarhus, Denmark</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/z4klmYEllik/interview-jaoo-today-aarhus-denmark.html</link><category>interview</category><category>jaoo</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Tue, 06 Oct 2009 02:17:47 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a61979d2970c</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I was interviewed on Monday after my KV Programming Model Evolve session. Here is a <a href="http://today.jaoo.dk/2009/10/05/brain-hardwired-to-code/">link</a>:</p><p></p><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/z4klmYEllik" height="1" width="1"/>]]></content:encoded><description>I was interviewed on Monday after my KV Programming Model Evolve session. Here is a link:</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/10/interview-jaoo-today-aarhus-denmark.html</feedburner:origLink></item><item><title>Moving from disk offload caching to using WebSphere eXtreme Scale based caching</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/JPtTnHKjoYQ/moving-from-disk-offload-caching-to-using-websphere-extreme-scale-based-caching.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Tue, 22 Sep 2009 13:26:05 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a58e6cb0970b</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[I've just uploaded slides with audio to the WXS video blog. You can see it <a href="http://www.devwebsphere.com/websphere_extreme_scale/2009/09/replacing-dynacache-disk-offload-with-dynacache-using-ibm-websphere-extreme-scale.html">here</a>.<img src="http://feeds.feedburner.com/~r/dev/websphere/~4/JPtTnHKjoYQ" height="1" width="1"/>]]></content:encoded><description>I've just uploaded slides with audio to the WXS video blog. You can see it here.</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/09/moving-from-disk-offload-caching-to-using-websphere-extreme-scale-based-caching.html</feedburner:origLink></item><item><title>Why you shouldn't overcommit memory on virtualized servers running Java</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/k8u6X83YWLI/why-you-shouldnt-overcommit-memory-on-virtualized-servers-running-java.html</link><category>J2SE</category><category>virtualization</category><category>java</category><category>performance</category><category>virtualization</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Thu, 08 Oct 2009 15:35:27 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a5490409970c</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica">Virtualization takes multiple physical machines, virtualizes them and then runs them concurrently on a single server. The argument is that they are normally using little CPU so it's ok to run them all on a single box which will then run with a much higher CPU utilization, say 70/80%. The main issue is memory. Most boxes which are targets for consolation are usually older servers with slow CPUs. 5% on such a box might be 1% on a modern box. This means that many such older machines can be consolidated on to a newer more powerful server. However, while CPU is usually plentiful and cheap, the real issue is memory. That much memory can be expensive. DRAM cost goes through the roof when larger capacity DIMMs are required. This means that virtualization vendors typically recommend over committing the server memory. This basically means they are recommending swapping at the hypervisor level. This dramatically cuts the amount of memory required and lowers the TCO of the solution correspondingly.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica">C programs or scripts tend to respond well to paging. They typically have small working sets (active memory pages) and then rest of the process or virtual machine can be paged out without dramatically impacting the performance of the virtual machine. They typically don't regularly sweep the contents of their address space. Java, however, is a completely different animal. Java Virtual Machines only have one working set size, the whole virtual machine heap. The objects used by a Java application are typically randomly spread all over the address space of a process. Any timers which fire can cause much of the JVM to be paged in by the hypervisor and if a garbage collection is triggered then the whole JVM heap must be paged in from disk as the garbage collector sweeps ALL the memory, a very slow operation. This page in will cause other virtual machines to be paged out then they garbage collect and we get a ping pong effect. This behavior can cause major variances in response times for users of the applications hosted in the JVM. A garbage collection which normally completes in hundreds of milliseconds might take minutes to complete in such an environment and the applications within that JVM are frozen during this time. Many Java applications utilize timers for JDBC connection pooling, time outs, heart beating for cluster management and so on. The paging activity wreaks havoc on these kinds of time sensitive operations and will cause most Java applications to behave very erratically if not fail completely. Any kind of clustering framework will not survive a paging environment due to the timing sensitive nature of heart beating and similar code.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica">Java Virtual Machine technology needs to be improved to that it can cooperate with the host operating system or hypervisor to minimize its working set which should allow it to be paged more efficiently but garbage collection will likely still remain a tough problem to beat in an environment that is actively paging. Any virtualization vendor will struggle to keep a customer happy in an over committed memory virtualized system. These systems are frequently sold to customers with the assurance that over committing the memory is ok but this usually results in the customer being unsatisfied and then complaining to the Java application vendor about poor performance or unstable behavior. The response to these questions will likely be "Don't overcommit your memory!". The response is usually "But, the virtualization vendor said it was ok otherwise the system becomes very expensive…" and the final response from the application server vendor will be "Yep, thats right…"</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica">Solid state disks for paging might help with the situation. But, any stateful application server with timing sensitive code will likely still encounter some issues in such as environment because of the jitter introduced by paging. WebSphere includes code to check for such jittery environments. It's a simple alarm which fires periodically and simply checks that it is fired when it expected to be fired. If the timer discovers that its several seconds later than it expected then it logs a message indicating CPU starvation is occurring. This only happened in the past on machines whose operating systems were paging OR on machines running hundreds of JVMs which suddenly all get busy and overwhelm the CPU capacity of the server. Imagine 500 threads that are all CPU bound running on a 8 core box. If each thread runs for 200ms when it gains the CPU then one second can service about 40 threads. This means around 12 seconds will elapse for any given thread before it even RUNS again. This is unacceptable for any timeout style operations with resolutions lower than that. We are seeing customers now reporting problems in virtualized servers where they have overcommitted the memory and while the local operating system is not paging, the hypervisor is. The result is the same. Erratic behavior.</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica">In summary, this kind of behavior is not new. It's been seen before on systems which page or are simply overloaded. Either way the system was either out of CPU or out of memory or BOTH. Customers running virtualized systems need to be very careful when overcommitting either resource if predictable application behavior is required.</p></div><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/k8u6X83YWLI" height="1" width="1"/>]]></content:encoded><description>Virtualization takes multiple physical machines, virtualizes them and then runs them concurrently on a single server. The argument is that they are normally using little CPU so it's ok to run them all on a single box which will then...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/08/why-you-shouldnt-overcommit-memory-on-virtualized-servers-running-java.html</feedburner:origLink></item><item><title>Why Java is important to VMware but may not matter long term</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/amXE4UzNG4o/why-java-is-so-important-to-vmware.html</link><category>Cloud</category><category>virtualization</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Wed, 12 Aug 2009 20:07:26 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e20120a4ecc151970b</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>VMWare has a problem. Consolidation is the usual angle thats used to sell it. Most boxes run at 5% load so ideally you want to consolidate 15 machines or so on to a single box pushing its utilization to 75%. But, that means you need memory for 15 virtual machines on the box. Thats a lot of memory and memory isn't cheap.</p><p>So, they usually say overcommit the memory and everything will be ok. Thats not true (especially for Java applications, we run into this ALL the time, don't believe the ok to overcommit advice) but thats another blog post on why swapping and Java DO NOT MIX right now. VMWare needs a way to reduce the cost of RAM so that it lowers the cost of the platform and lets people host as many virtual machines as possible on a single box without breaking the bank on memory cost.</p><p>A normal unvirtualized box runs an operating system and the OS hosts processes. One per application maybe. Memory utilization is pretty efficient. All processes can share libraries in memory, file system caches and the memory of the operating system is amortized over many processes.</p><p>This isn't the case with VMWare, a hypervisor. Each virtual machine runs its own copy of the operating system with its own file system cache. There is usually no sharing of memory between virtual machine instances (although thats changing). This means a virtualized box is inherently less memory efficient than a single operating system instance running the same applications. The multiple operating system instances are costing VMWare a lot of memory. A hypervisor may be more CPU efficient but it's not as memory efficient as a single operating system running the same applications. You can enable swapping to avoid the need for so much memory but Java applications don't work well with swapping so lets assume we are not swapping. Now, there are advantages to using a hypervisor but we are talking about the resources needed to run X applications here and memory factors in.</p><p>VMWare could get in to the operating system business but thats going to fail. Windows and Linux basically own that space. Microsoft is busy adding hypervisor capabilities to their own stack which will cost less than VMWare so hosting Microsoft applications is probably not a long term business for them.</p><p>I said at the beginning that Java is important to VMWare. Normal applications are built against a specific operating system thats evolving. VMWare is unlikely to be able to host normal applications without an operating system because they can't emulate the operating systems. They would need to host the operating system as a virtual machine and as we said earlier, thats not memory efficient.</p><p>Now, there are a lot of Enterprise applications written in Java. This means that if VMWare could host Java applications natively, i.e. if VMWare can host a Java virtual machine without an operating system then potentially they can be as memory efficient as an operating system. They can use shared memory between JVM instances for JITed code. They would only need to implement the Java API which is basically portable across machines and operating systems. This is significantly easier than emulating Linux or Windows. A Java skin gives them a way to host Enterprise Java applications natively and cut the memory overhead a hypervisor brings to the table by removing the overhead of an operating system.</p><p>A hypervisor has advantages over a native operating system in that it can move virtual machines from one box to another and suspend/resume them. Application or virtual machine mobility is a big selling point for a hypervisor. It's possible that VMWare sees Java as a way to lower the cost of virtualizing Enterprise applications. However, operating system zones and WPARs offer application mobility also so this advantage is not such a big deal anymore. A big advantage WPAR/Zones have over virtual machine mobility is that you're not bound to an operating system with WPAR/Zones. You can upgrade an application by moving it from a Linux Version N to a Linux Version N+1 machine. Moving a VMWare image doesnt upgrade the OS, the OS is still the same after you move the virtual machine. You'd need to upgrade it in the virtual machine which is more hassle than just moving a WPAR/Zone.</p><p>This native Java Virtual Machine puts them in a similar situation to Azul. Azul can run standard Java code but unless the applications are certified to be supported on it then customers are reluctant to do it and vendors are reluctant to support their products on that configuration mostly because of support/testing cost. A VMWave JVM would suffer the same consequences. Application server vendors would have to certify and support it to move applications over and that can be a tough thing to get them to do.</p><p>Buying Spring gives VMWare Spring TC and Spring DM. These are Java application containers which can probably run 80% of departmental and many enterprise Java applications (Servlets, JDBC, JPA, JMS). It's not JavaEE certified but it's probably enough to run most Java applications. If customers can move Java applications to such a container and hosting them on a virtualized environment then potentially you can lower VMWares TCO as it'll require less memory to host them.</p><p>I'm actually skeptical that VMWare offers many advantages over just running an operating system natively on the box for Java applications. Best case, VMWare would match the memory footprint of the operating system and it would likely run the applications a little slower. Application mobility is still an issue for operating system hosted applications but technologies like Solaris Zones or AIX WPARs are starting to address application mobility without the memory cost of a full virtualized environment such as VMWare.</p><p>So, to summarize. VMWare could host Java applications natively to lower TCO. This would allow them to host multiple Java applications on a single box with similar TCO best case to a conventional operating system. Hosting commercial application servers like this would likely be a support problem but as I said, many Java applications would run on a native Spring TC environment. Application mobility between boxes was a big advantage for hypervisors such as VMWare but operating system features such as Solaris Zones and AIX WPARs are rapidly eroding that advantage because applications installed in a zone or WPAR are basically portable anyway between machines and have the advantage of not being bound to an operating system version as is the case with a virtual machine image. Once customers figure this out then they may decide that using a conventional operating system with WPARs or Zones is actually a more cost efficient and easier path to swallow than picking up a new platform based on a hypervisor which would not be as memory efficient as a normal operating system would be. </p><p>Will VMWare ultimately fail because what customers really want is not virtual machine mobility, they want application mobility?</p><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/amXE4UzNG4o" height="1" width="1"/>]]></content:encoded><description>VMWare has a problem. Consolidation is the usual angle thats used to sell it. Most boxes run at 5% load so ideally you want to consolidate 15 machines or so on to a single box pushing its utilization to 75%....</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/08/why-java-is-so-important-to-vmware.html</feedburner:origLink></item><item><title>Lock free data structures, good and bad</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/2lloS0EEsaY/lock-free-data-structures-good-and-bad.html</link><category>J2SE</category><category>concurrency</category><category>java</category><category>lock-free</category><category>multi-core</category><category>multicore</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Thu, 23 Jul 2009 20:00:37 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-6a00d83452595969e2011571389fda970c</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I'm playing with making some lock free versions of sync blocks in code I wrote before. The code is currently protected by either sync blocks or read/write locks. Lock free approaches avoid sync blocks altogether and so in theory offer better concurrency in todays multi-core world.</p><p>Lets examine what exactly lock free means. Typically, it means having an atomic reference to a shared read only data structure. Threads can get a reference to the data structure and access it without fear of other threads because the data structure is read only.</p><p>If a thread wants to change the data structure then it must copy the current data structure and only update the copy with the new changes. Then, it basically does the equivalent of an optimistic database lock. It uses a compare and swap operation which will replace the atomic reference to the data structure with the new one only if no other thread can also modified it since the updating thread read the original data structure.</p><p>If the compare and swap succeeds then all is good. If not then the thread must get a reference to the current data structure and try to make the change to that one and then do compare and swap again. It has to keep trying to do this until it succeeds.</p><p>Clearly, first of all for read mostly data structures this approach is pretty cool and is a LOT better than a read/write lock. If writes are more frequent then contention will start to occur between writes as they compete to get to the compare and swap first. Frequent writes would also mean frequent copy operations. Once per loop try per thread. If you have a lot of contention AND the data structure is expensive to copy then this is going to burn a lot of CPU in those copy and update loops.</p><p>Java 5 has support for this type of lock programming. Look at the AtomicReference class and its compareAndSwap method. The trick to using it is NEVER update a data structure, always copy and then either update while copying or update after copy. Then try change the AtomicReference to the updated copy using compareAndSwap and if it fails then try updating the data structure that the AtomicReference now points to.</p><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/2lloS0EEsaY" height="1" width="1"/>]]></content:encoded><description>I'm playing with making some lock free versions of sync blocks in code I wrote before. The code is currently protected by either sync blocks or read/write locks. Lock free approaches avoid sync blocks altogether and so in theory offer...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/07/lock-free-data-structures-good-and-bad.html</feedburner:origLink></item><item><title>Use IBM WebSphere eXtreme Scale to get the most out of your SOA investment!</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/oJyC0lwanns/ibm-websphere-extreme-scale-can-mean-extreme-savings.html</link><category>WebSphere eXtreme Scale</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Sun, 21 Jun 2009 12:53:21 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-68337963</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Many customers have now used SOA best practices to rebuild their infrastructure. But, it's surprising how many of the customers are leaving a lot of potential savings on the table. A SOA style architecture with an ESB provides a great infrastructure to quickly achieve sizable savings and further demonstrate the value of SOA to the business.</p><p>I think a lot of customers think of extreme performance when they think about products like IBM WebSphere eXtreme Scale. Millions of transactions per second. Hundreds of servers and so on. "We're not facebook or google, we don't need this". They may wrongly conclude it's not for them. But, the reality is there are very few customers with those kinds of requirements. However, there are many, many more customers with conventional type applications doing a couple of hundred transactions/sec or less who could readily use WebSphere eXtreme Scale to save them a lot of money for little investment especially when they have already made the investment to go SOA.</p><div>WebSphere eXtreme Scale can be readily used as a very advanced caching technology with immense capacity and very low response times. We regularly talk with customers who back ends systems are under pressure. These backend systems range from simple databases, to SAP systems, mainframes running DB/390, CICS, IMS or other valuable enterprise applications. Todays economic climate means belts are tightening so there is little money available to expand the capacity of these backend systems even as additional load is known to be coming.</div><br><div>At the same time even if business is flat, budget controls are at best flat. Many customers report having to run with flat or smaller budgets for backend systems even while adding more demands on them in the form of additional applications leveraging the backend systems.</div><br><div>Most customers estimate that there are many redundant requests being handled by backend systems. One customer with an ESB fronted mainframe estimated 25% of all service requests are duplicates of requests issued within 24 hours, another indicated 50%. Some use cases are as high as 80%. Adding a large cache to such as ESB can capitalize on this and effectively reduce the load on those backend systems by that amount. This results in better response times and cost savings in terms of load on the backend systems. This means your backend can handle 25% more load without a capacity increase.</div><br><div>An ESB cache is an extremely cost effective way to introduce WebSphere eXtreme Scale in to an organization. Add a mediation to the ESB. It doesn't change the front end applications invoking services on the bus NOR does it change the backend system. It just means adding a 'mediation' to the ESB which checks the cache first before hitting the backend. WebSphere eXtreme Scale can handle evicting the data.</div><br><div>Could you do this with a normal, non distributed cache? I don't think so. That 25% saving takes 24 hours of caching to do. That can be a lot of data, more than will fit in a single JVM. You also need a shared cache so that no matter which server received the initial service request, ALL the servers benefit from the cache as soon as a single server caches something. This is crucial to getting the most out of this pattern. A conventional in process cache CANNOT do this. You need a network attached distributed cache. WebSphere eXtreme Scale makes 10GB, 100Gb or even Tb caches possible with very little work. This kind of use case is usually very straightforward to implement and can usually be readily integrated in to a SOA application.</div><br><div>So, what are you waiting for? You had the foresight to envision a SOA architecture and you invested the money to deploy it, exposing backends as services, deploying an ESB and so on. Make sure you get the most out of that investment and deploy WebSphere eXtreme Scale to get you that kind of saving too. This is low hanging fruit. We had a recent customer achieve 500K USD a MONTH in savings after deploying IBM WebSphere eXtreme Scale to take load of a mainframe.</div><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/oJyC0lwanns" height="1" width="1"/>]]></content:encoded><description>Many customers have now used SOA best practices to rebuild their infrastructure. But, it's surprising how many of the customers are leaving a lot of potential savings on the table. A SOA style architecture with an ESB provides a great...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/06/ibm-websphere-extreme-scale-can-mean-extreme-savings.html</feedburner:origLink></item><item><title>Conversational state in IBM WebSphere eXtreme Scale: PER_CONTAINER grids</title><link>http://feedproxy.google.com/~r/dev/websphere/~3/NgJV5MjURyM/what-is-a-per_container-grid.html</link><category>WebSphere eXtreme Scale</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">bnewport@us.ibm.com (Billy Newport)</dc:creator><pubDate>Thu, 18 Jun 2009 14:23:48 PDT</pubDate><guid isPermaLink="false">tag:typepad.com,2003:post-68253053</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p>We added this type of grid starting with V6.1.0.3, prior to this we had 'normal' grids which are a fixed number of partitions and the key of a Map hashed to one of those partitions. We place the partitions on the set of online container JVMs and automatically scale them out or in if JVMs are added and removed. This grid works very well for key based grids, where the applications uses a key object to locate data in the grid.</p><br><div>PER_CONTAINER grids are different. You specify the grid uses PER_CONTAINER using the placementPolicy attribute in the deployment xml file. Here, you specify how many partitions you want per container JVM that you start. Remember, normally, you specify how many partitions total in the grid, not per container. If the number of partitions is 5 then when you start a container JVM, WXS will create 5 new anonymous partition primaries on that JVM and will create any replicas on the other container JVMs already running. Here is a sequence:</div><br><ul>
<li><div>Start a JVM, it gets 5 primaries. (P0-P4)</div><div>JVM#1 -&gt; P0, P1, P2, P3, P4 </div></li>
<li><span><div>Start another JVM, it gets 5 primaries (P5-P9). Replicas for P0-4 are placed on it and replicas for P5-9 go on JVM#1.</div><div>JVM#1 -&gt; P0,P1,P2,P3,P4,R5,R6,R7,R8,R9</div><div>JVM#2 -&gt; P5,P6,P7,P8,P9,R0,R1,R2,R3,R4</div> </span> </li>
<li><span><div> Start another JVM, it gets 5 primaries (p10-p14). The replicas for p10-p14 are placed on JVM#1 and JVM#2 and some of the replicas for P0-P9 are moved to JVM#3 to balance the load.<br></div><div><br><div>JVM#1 -&gt; P0,P1,P2,P3,P4,R7,R8,R9,R10,R11,R12</div><div>JVM#2 -&gt; P5,P6,P7,P8,P9,R2,R3,R4,R13,R14</div><div>JVM#3 -&gt; P10,P11,P12,P13,P14,R5,R6,R0,R1</div></div> </span> </li>
</ul>
<div>This continues as more JVMs are started. The grid will always create 5 new partition primaries on each new JVM and will then place replicas for those on the existing JVMs and will then balance the replicas out so the new JVM gets it's share. But, WXS will NEVER move a primary in PER_CONTAINER mode. It only moves replicas for balancing.<br></div><br><div>The partition numbers are arbitrary and have nothing to do with keys. You cannot do key based routing with this type of grid. If a JVM was to be stopped then the partition ids which were created for that JVM are not longer in use. This means there is a gap in the partition ids. There would no longer be partitions 5 to 9 if JVM#2 was to die in the above example. There would only be 0-4 and 10-14. This is why key based hashing doesn't work here. </div><br><div>So, what's it good for? It's good for things like HTTP Session replication or application session state. Here, a HTTP router assigns a HTTP Session to a servlet container. The servlet container needs to create a HTTP Session for it and will choose one of the five local partition primaries for the session. The 'id' of the partition chosen is then stored in the cookie. The servlet container now has local access to the session state which means zero latency access to the data for this request as long as session affinity is maintained. Any changes to the partition are replicated by WXS.</div><br><div>Why not just have one partition per JVM? 5 or more likely 10 is good because think about what happens if a JVM fails. We want the burden of the JVM failing to be spread across the cluster 'evenly'. If there was one partition then when the JVM fails then one JVM has to pick up the entire load, the one where the replica was. This is bad because the load there may double. If there is 5 partitions per JVM then 5 JVMs pick up the load of the JVM which lowers the impact on each JVM by 80%. By using multiple partitions per JVM, we are lowering the impact on the replica substantially. Another way to look at it is if a JVM suddenly spiked then the replication load of that JVM is spread over 5 JVMs, which is better than one.</div><br><div>The next issue I hope some have noticed is that this means every time a JVM starts, we may five more partition primaries and 5 more replicas. Over time, we just keep making partitions and they never go away. This isn't how it works. When a JVM starts, it gets five partition primaries. These are 'home' primaries. They exist on the container which created them. If the JVM fails then the replicas become primaries and WXS will create 5 more replicas to maintain high availability (unless auto repair is turned off!). The new primaries are in a different JVM than the one that creates the partitions. They are foreign primaries. The application should never place new state or sessions in a foreign primary. They should be allowed to 'drain', sessions get evicted etc. Eventually, the foreign primary has no entries and WXS automatically deletes it and its associated replicas. The foreign primaries purpose is to allow existing sessions to still be available but it's not for new sessions.</div><br><div>How does a client interact with such a 'key' less grid then? The client just begins a transaction and then stores data in the grid. The keys are meaning less. The client can <a href="http://www.ibm.com/developerworks/wikis/objectgridprog/docs/api/com/ibm/websphere/objectgrid/Session.html#getSessionHandle()">ask</a> the Session for a <a href="http://www.ibm.com/developerworks/wikis/objectgridprog/docs/api/com/ibm/websphere/objectgrid/SessionHandle.html">SessionHandle</a> object. This is a serializable handle which allows the client to get back to the same partition later. WXS picks a partition for the client from the list of home partition primaries. It will never return a foreign primary partition. This SessionHandle could be serialized in a HTTP cookie or similar device and then later on receiving it again, it can be converted back in to a SessionHandle and <a href="http://www.ibm.com/developerworks/wikis/objectgridprog/docs/api/com/ibm/websphere/objectgrid/Session.html#setSessionHandle(com.ibm.websphere.objectgrid.SessionHandle)">provided</a> to the WXS API to obtain a Session bound to the same partition again. You cannot use Agents to interact with a PER_CONTAINER grid for now.</div><br><div>This is different than a normal FIXED_PARTITION or hash grid because the client stores data in a place in the grid, gets a handle to it and uses the handle to access it again next time. There is no application supplied key here.</div><br><div>Obviously, WXS is not making a new partition for each 'session'. Therefore, the keys used to store data in the partition should be unique within that partition. Maybe the client generates a unique SessionID and then uses that as the key to find information in Maps in that partition. Multiple client sessions will be assigned to the same partition so the application needs to make sure different keys are used to store session data in that partition for each partition.</div><br><div>I used 5 partitions as an example here but the numberOfPartitions parameter in the objectgrid.xml can be used to specify this, it just means the number of partitions per container rather than per grid. The number of replicas is specified in the normal way.</div><br><div>This also works with multiple data centers. If <span style="text-decoration: underline;">possible</span> WXS will return a SessionHandle to a partition whose primary is located within the same zoned/data center as that client. The client can specify the zone as a parameter to the JVM or using an API. The client zone id can be set using <a href="http://www.ibm.com/developerworks/wikis/objectgridprog/docs/api/com/ibm/websphere/objectgrid/server/ServerProperties.html">serverproperties</a> or <a href="http://www.ibm.com/developerworks/wikis/objectgridprog/docs/api/index.html?com/ibm/websphere/objectgrid/client/ClientProperties.html">clientproperties</a></div><br><div>The PER_CONTAINER style of grid suits applications which store conversational type state rather than database oriented data. The key to access it is some kind of conversation id and is not related to a specific database record or something like that. It provides higher performance (because the partition primaries can be collocated with the servlets for example), easier configuration (no need to worry about how many partitions are needed for how many JVMs), works very well in multiple data center scenarios (zone based routing). It provides a very useful extra tool in the bag for effectively using WebSphere eXtreme Scale.</div></div><img src="http://feeds.feedburner.com/~r/dev/websphere/~4/NgJV5MjURyM" height="1" width="1"/>]]></content:encoded><description>We added this type of grid starting with V6.1.0.3, prior to this we had 'normal' grids which are a fixed number of partitions and the key of a Map hashed to one of those partitions. We place the partitions on...</description><feedburner:origLink>http://www.devwebsphere.com/devwebsphere/2009/06/what-is-a-per_container-grid.html</feedburner:origLink></item><copyright>2007 (C) Trackpedia Inc</copyright><media:credit role="author">Billy Newport</media:credit><media:rating>nonadult</media:rating></channel></rss>
