<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7653634180323609766</id><updated>2012-02-04T17:26:56.262+01:00</updated><category term='disk space'/><category term='BPEDB'/><category term='Richard Metzger'/><title type='text'>WebSphere Process Server Performance</title><subtitle type='html'>Thoughts and opinions around performance of and capacity planning for IBM WebSphere Process Server, IBM BPM and other products (like e.g. DB2), as they are used in the context of business process management and business process automation solutions.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-5277419323727919637</id><published>2012-02-03T10:21:00.002+01:00</published><updated>2012-02-03T10:55:17.238+01:00</updated><title type='text'>Do RUNSTATS at the right point in time</title><content type='html'>Updating statistics about table and index cardinalities and the distribution of values in there to give the optimizer the right information, so that it can determine the best possible access path to the data is one of the BAU tasks of database maintenance. In WPS installations the usual recommendation is to do it once a week during off-peak hours, as performing runstats means to read all the data, which represents a certain impact that you might want to avoid during peak hours.&lt;br /&gt;&lt;br /&gt;However there might be a pattern, where such an approach is quite counter-productive. In a recent case runstats was done weekly on a Sunday night. The processing workload consisted of primarily microflows and some (short lived) macroflows. The observed problem was processing slowdowns due to a major amount of deadlocks (up to 10 per minute) during the peak times of the day.&lt;br /&gt;&lt;br /&gt;Checking the explains for the deadlocked statements showed, that the database's optimizer didn't take the best possible index. There was an index, that covered all the columns in the where-clause, but this index was not taken by the optimizer, but the primary key index instead.&lt;br /&gt;&lt;br /&gt;A few SELECT COUNT statements on the involved tables showed a low and changing cardinality (just a few dozen rows). Together with the information about the short life-time of the macroflows and the daily processing pattern where almost everything happens during typical office hours, the idea of performing runstats on a Sunday night probably lead to collecting statistics on empty tables.&lt;br /&gt;And when the optimizer believes (due to the statistics it has) that the tables are empty, it might take an access path that involves e.g. more locking than necessary. &lt;br /&gt;&lt;br /&gt;Now the suggestion was to perform runstats during a typical peak time, where the involved BPEDB tables contained a few dozen rows of data.&lt;br /&gt;&lt;br /&gt;Tataaa - deadlocks were gone.&lt;br /&gt;&lt;br /&gt;And the explain on the SQL statements in question showed that exactly the access path was taken that theoretically would be the best one.&lt;br /&gt;&lt;br /&gt;Conclusion:&lt;br /&gt;Sometimes runstats should be done during peak times - especially when the workload pattern is such that you could expect no or almost no process instance data being available at those off-peak hours where you typically would do database maintenance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-5277419323727919637?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/5277419323727919637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=5277419323727919637' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/5277419323727919637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/5277419323727919637'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2012/02/do-runstats-at-right-point-in-time.html' title='Do RUNSTATS at the right point in time'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-3084877335366619955</id><published>2011-07-15T10:32:00.001+02:00</published><updated>2011-07-15T10:48:31.950+02:00</updated><title type='text'>Redpaper on Performance and Capacity Implications for a Smarter Planet</title><content type='html'>Instead of telling something about "low level" performance tips, I tried to contribute some stuff on "some higher" levels this time.&lt;br /&gt;&lt;br /&gt;This IBM Redpaper™ publication discusses the performance and capacity implications of "Smarter Planet" solutions. It examines the Smarter Planet vision, the characteristics of these solutions (including the challenges), examples of addressing performance and capacity in a number of recent Smarter IT projects, recommendations from what has been learned thus far, and discussions of what the future may hold for these solutions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Table of contents:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;Introduction to a Smarter Planet &lt;li&gt; Performance and capacity challenges introduced by Smarter Planet &lt;/li&gt;&lt;li&gt;Managing IT performance and capacity for the Smarter Planet &lt;/li&gt;&lt;li&gt;Five examples of Smarter IT projects and challenges &lt;/li&gt;&lt;li&gt;Recommendations &lt;/li&gt;&lt;li&gt;Conclusion &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It can be found at &lt;a href="http://www.redbooks.ibm.com/redpieces/abstracts/redp4762.html?Open"&gt;http://www.redbooks.ibm.com/redpieces/abstracts/redp4762.html?Open&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-3084877335366619955?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/3084877335366619955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=3084877335366619955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/3084877335366619955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/3084877335366619955'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2011/07/redpaper-on-performance-and-capacity.html' title='Redpaper on Performance and Capacity Implications for a Smarter Planet'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-880780778254994756</id><published>2009-06-19T08:48:00.004+02:00</published><updated>2009-06-22T14:56:48.417+02:00</updated><title type='text'>Performance boost through disabling file system caching</title><content type='html'>In a recent engagement to troubleshoot lousy performance, colleagues of mine were able to "fix it".&lt;br /&gt;&lt;br /&gt;Usually it is a good thing, when an operating system (here: kernel and file system code) caches data in buffers at the file system level and flushes it out to disk when appropriate (and in the right chunks) to minimize the amount of physical I/O operations.&lt;br /&gt;&lt;br /&gt;When placing database files on such filesystems however, the filesystem's caching algorithms can be extremely counterproductive.&lt;br /&gt;&lt;br /&gt;In the case here, Solaris, the Veritas filesystem, and Oracle was involved. Re-mounting the filesystem with the parameter&lt;br /&gt;&lt;blockquote&gt;mincache=direct&lt;/blockquote&gt;reduced the time for SQL inserts into the SIB tables from up to 11 seconds down to 0.03 seconds.&lt;br /&gt;&lt;br /&gt;When dealing with the combination AIX, JFS2, and DB2, the DB2 command&lt;br /&gt;&lt;blockquote&gt;db2 alter tablespace &lt;put-the-tbs-id-here&gt; no file system caching&lt;/put-the-tbs-id-here&gt;&lt;/blockquote&gt;has more or less the same effect. Data caching on the filesystem level is disabled and the data is persisted as fast as possible. According to the AIX documentation the same effect can be reached on the file system level by using "&lt;span style="font-weight: bold;"&gt;mount ... -o dio&lt;/span&gt;".  Read performance for non-DB files might suffer, because caching is reduced. DB-data will still be cached in the DB bufferpools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-880780778254994756?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/880780778254994756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=880780778254994756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/880780778254994756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/880780778254994756'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/06/performance-boost-through-disabling.html' title='Performance boost through disabling file system caching'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-7039501541121308539</id><published>2009-05-08T12:08:00.010+02:00</published><updated>2009-05-08T12:40:13.363+02:00</updated><title type='text'>SOA/BPM performance best practices (System and subsystem configuration)</title><content type='html'>This section handles some scalability related tuning knobs and some relevant tuning parameters for the involved subsystems like the JVMs and the databases.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clustering topologies&lt;/span&gt;:&lt;br /&gt;In order to take care of growth and workload distribution, modern business process engines can run in a clustered setup, spreading the workload across various physical nodes (horizontal scaling) or  for better utilizing spare resources within existing nodes (vertical scaling).&lt;br /&gt;For WPS three different cluster topology patterns have been identified and described e.g in &lt;a href="http://www-01.ibm.com/support/docview.wss?uid=swg27010320&amp;amp;aid=1"&gt;http://www-01.ibm.com/support/docview.wss?uid=swg27010320&amp;amp;aid=1&lt;/a&gt; or &lt;a href="http://www.ibm.com/developerworks/websphere/library/techarticles/0703_redlin/0703_redlin.html"&gt;http://www.ibm.com/developerworks/websphere/library/techarticles/0703_redlin/0703_redlin.html&lt;/a&gt; .&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_U7gbwbUHlbc/SgQF7bWkSHI/AAAAAAAAABs/t-dvk6Zm62I/s1600-h/clustertopos.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 81px;" src="http://4.bp.blogspot.com/_U7gbwbUHlbc/SgQF7bWkSHI/AAAAAAAAABs/t-dvk6Zm62I/s320/clustertopos.png" alt="" id="BLOGGER_PHOTO_ID_5333394377226340466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The first pattern (shown on the left) is also known as the “bronze topology”. It consists of a single application server cluster, where the WPS business applications, the support applications like CEI and BPC Explorer, and the messaging infrastructure hosting the messaging engines (MEs) that form the system integration buses (SIBus) all reside within each of the application servers, that form the cluster.&lt;br /&gt;This bronze topology is suitable for a solution, that comprises of only synchronous web services and synchronous SCA invocations, preferably with short running flows only.&lt;br /&gt;&lt;br /&gt;The second pattern (shown in the middle) is also known as the “silver topology”. It has two clusters, the first one containing the WPS business applications and the support applications as before, but the messaging infrastructure is located in the second cluster.&lt;br /&gt;This silver topology is suitable for a solution that uses long running processes, but does neither need CEI, nor message sequencing, nor asynchronous deferred response, nor JMS or MQ bindings, nor message sequencing mechanisms.&lt;br /&gt;&lt;br /&gt;The third pattern (shown on the right) is called the “golden topology”. Compared to the previous patterns, the support applications are separated into a third cluster.&lt;br /&gt;This golden topology is suited for all the remaining cases, where asynchronous processing plays a nontrivial role in the solution. It also provides the most “JVM space” for the business process applications that should run in this environment. If the available hardware resources allow for setting up this golden topology, then it is advisable to start with this topology pattern from the very beginning as it is the most versatile one.&lt;br /&gt;What is not shown in the above figure is the management infrastructure, that controls the cluster(s). These consist of node agents and a deployment manager node as the central point of administration of the entire cell, these clusters belong to. A tuning tip for this management infrastructure is to turn off automatic synchronization of the node configurations. Depending on the complexity of the setup, this synchronization processing is better kicked off manually during defined maintenance windows in off-peak times.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JVM Garbage Collection&lt;/span&gt;&lt;br /&gt;Verbose garbage collection is not as verbose as the name suggests. Those few lines of information that are produced, when verboseGC is turned on don't really hurt the system's performance. On the other side they can be a very helpful source of information when troubleshooting performance problems.&lt;br /&gt;The JVM used by WPS V6.1 supports several garbage collection strategies: the Throughput Garbage Collector (TGC), the Low Pause Garbage Collector (LPGC), and the Generational Garbage Collector (GGC).&lt;br /&gt;The TGC provides the best out-of-box throughput for applications running on a JVM by minimizing costs of the garbage collector. However, it has “stop-the-world” phases that can take between 100ms and multiple seconds during garbage collection.&lt;br /&gt;The LPGC provides garbage collection in parallel to the JVM’s work. Due to increased synchronization costs, throughput decreases. If response time is more important than highest possible throughput, this garbage collector could be a good choice.&lt;br /&gt;The GGC is new in the IBM 1.5 JVM. It is well suited for applications that produce a lot of short-lived small Java objects. As it reduces pause times it should be tried in such cases instead of the TGC or LPGC. When properly tuned, it provides the best garbage collection performance for SOA/BPM workloads. [&lt;a href="http://www.redbooks.ibm.com/abstracts/redp4431.html"&gt;http://www.redbooks.ibm.com/abstracts/redp4431.html&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JVM memory considerations&lt;/span&gt;&lt;br /&gt;Increasing the heap size of the JVM of the application server can improve the throughput of business processes. However it should ensured, that there is enough real memory available to avoid that the operating system would start swapping. Detailed information on JVM parameter tuning can be found in [&lt;a href="http://www.ibm.com/developerworks/java/jdk/diagnosis/"&gt;http://www.ibm.com/developerworks/java/jdk/diagnosis/&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Database subsystem tuning&lt;/span&gt;&lt;br /&gt;To a large degree the performance of long running flows and/or human tasks in a SOA/BPM solution depends on a properly tuned, enterprise class database management system besides the afore mentioned application server tuning. This paper provides some tuning guidelines for  IBM's DB2 database system as an example. Most of the rules should also be applicable to other production database management systems.&lt;br /&gt;It is not advisable to use simple file based databases like Cloudscape or Derby as a database management system for WPS other than for the purpose of unit testing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Configuration advisor&lt;/span&gt;&lt;br /&gt;DB2 comes with a built-in configuration advisor. After creating the database, the advisor can be used to configure the database for the usage scenario expected. The input for the Configuration Advisor depends on the actual system environment, load assumptions, etc. Details on how to use this advisor can be found in [&lt;a href="http://www-01.ibm.com/support/docview.wss?uid=swg27012639&amp;amp;aid=1"&gt;http://www-01.ibm.com/support/docview.wss?uid=swg27012639&amp;amp;aid=1&lt;/a&gt;]. Some parameter settings in the output of the advisor should be checked and adjusted afterwards.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;MINCOMMIT&lt;/span&gt;  A value of ‘1’ is strongly recommended. The advisor sometimes suggests other values.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;NUM_IOSERVERS&lt;/span&gt;  The value of NUM_IOSERVERS should match the number of physical disks (+2) the database resides on.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;NUM_IOCLEANERS&lt;/span&gt;  Especially on multi-processor machines, enough IO cleaners should be available to make sure that dirty pages in the bufferpool are written to disk. Provide at least one IO cleaner per processor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Database statistics&lt;/span&gt;&lt;br /&gt;Optimal database performance requires the database optimizer to do its job well. The optimizer acts based on statistical data about the number of rows in a table, the use of space by a table or index, and other information. When the system is set up, these statistics are empty. As a consequence the optimizer usually takes sub-optimal decisions, leading to poor performance.&lt;br /&gt;Therefore after initially putting load on your system, or whenever the data volume in the database changes significantly, you should update the statistics by running the RUNSTATS utility (DB2). Make sure there is sufficient data (&gt; 2000 process instances) in the database before you run RUNSTATS. Avoid running RUNSTATS on an empty database as this will lead to bad performance.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Enable Re-Optimization&lt;/span&gt;&lt;br /&gt;If BPC API queries (as used by the BPC Explorer e.g.) are used regularly on your system, it is recommended to allow the database to re-optimize SQL queries once, as described at [&lt;a href="http://www-01.ibm.com/support/docview.wss?rs=2307&amp;amp;uid=%20swg21299450"&gt;http://www-01.ibm.com/support/docview.wss?rs=2307&amp;amp;uid= swg21299450&lt;/a&gt;]. This tuning step greatly improves the response times of BPC API queries. In Lab tests the response time for one and the same query has been reduced from over 20 seconds down to 300 milliseconds. With improvements in such orders of magnitude the additional overhead for re-optimizing SQL queries should be affordable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Database indexes&lt;/span&gt;&lt;br /&gt;In most cases the BPM product's datastore has not been defined such, that all the database indexes that might potentially be used have been defined. In order to avoid unnecessary processing out of the box, it is much more likely, that only those indexes have been defined, that are necessary to run the most basic queries with an acceptable response time.&lt;br /&gt;As a tuning step one can do some analysis on the SQL statements resulting from end user queries to see, how the query filters used by the end user (or in the related API call) relate to the WHERE clauses in the resulting SQL statements and define additional indexes on the related tables to improve the performance of these queries. After defining new indexes, the above mentioned RUNSTATS action needs to be run to enable the use of the newly created indexes.&lt;br /&gt;Sometimes customers are uncertain about whether they are turning their environment into an unsupported state when defining additional indexes. This is definitively not the case. Customers are even encouraged to apply such tuning steps and check whether they help. If not, they can be undone easily e.g. by removing the index.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Further database tuning&lt;/span&gt;&lt;br /&gt;Any decent database management system can keep its data in memory buffers called bufferpools to avoid physical I/O. Data, that is in these bufferpools needs not be read from disk when referred to, it can be taken from these memory buffers directly. Hence it makes a lot of sense to make these buffers large enough to hold as much data as possible.&lt;br /&gt;The key tuning parameter to look at is called bufferpool hit ratio and describes the ratio between  the physical data and index reads and the logical reads. As a rule of thumb you can increase the size of the buffer pools as long as you get a corresponding increase of the bufferpool hit ratio. A well tuned system can easily have a hit ratio well above 90%.&lt;br /&gt;WPS accesses it's databases in multiple concurrent threads and uses row level locking to ensure data consistency during it's transactions. As a result, there can be a lot of row locks being active at times of heavy processing. The related database parameters for the space, where the database maintains the lock information might have to be adjusted.&lt;br /&gt;For DB2 the affected database configuration parameters are LOCKLIST and MAXLOCKS. Shortages in this lock maintenance space can lead to so called lock escalations, where row locks are escalated to undesirable table locks, which even can lead to deadlock situations. Data integrity is still maintained in such situations, but the associated wait times can severely impact throughput and response times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-7039501541121308539?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/7039501541121308539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=7039501541121308539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/7039501541121308539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/7039501541121308539'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/05/soabpm-performance-best-practices.html' title='SOA/BPM performance best practices (System and subsystem configuration)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U7gbwbUHlbc/SgQF7bWkSHI/AAAAAAAAABs/t-dvk6Zm62I/s72-c/clustertopos.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-2136613180668732585</id><published>2009-05-04T11:04:00.015+02:00</published><updated>2009-06-10T13:28:34.676+02:00</updated><title type='text'>Poor Man's Flight Recorder</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Problem statement&lt;/span&gt;:&lt;br /&gt;Sometimes when watching WPS you're faced with questions similar to "what is it doing rightnow?".  In this situation you'd wish the product had some production level, low intrusive tracing capability, that shows you, what is going on on the programming model level. Which would e.g. be what process instances, BPEL activities, invokes, API calls, etc. are being executed "as we speak".&lt;br /&gt;After some poking around in WPS' BPEDB I constructed an SQLs statement, that at least can serve as a simple surrogate for such a not-only-nice-to-have trace.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution: Poor Man's Flight Recorder:&lt;/span&gt;&lt;br /&gt;Due to some very helpful timestamps in some of the tables, it made it easy to construct an SQL statement, that can show you what has been recorded in the BPEDB for the last 10 seconds (or just the last 2 seconds - change it as you like).&lt;blockquote style="font-family: courier new;"&gt;SELECT&lt;br /&gt;ai.last_state_change as AI_last_state_change,&lt;br /&gt;substr(atp.name,1,30) as AI_templatename,&lt;br /&gt;case ai.state&lt;br /&gt;   when 0  then 'null(0)'&lt;br /&gt;   when 1  then 'inactive(1)'&lt;br /&gt;   when 2  then 'ready(2)'&lt;br /&gt;   when 3  then 'running(3)'&lt;br /&gt;   when 4  then 'skipped(4)'&lt;br /&gt;   when 5  then 'finished(5)'&lt;br /&gt;   when 6  then 'failed(6)'&lt;br /&gt;   when 7  then 'terminated(7)'&lt;br /&gt;   when 8  then 'claimed(8)'&lt;br /&gt;   when 9  then 'terminating(9)'&lt;br /&gt;   when 10 then 'failing(10)'&lt;br /&gt;   when 11 then 'waiting(11)'&lt;br /&gt;   when 12 then 'expired(12)'&lt;br /&gt;   when 13 then 'stopped(13)'&lt;br /&gt;   when 14 then 'processing_undo'&lt;br /&gt;end as AI_state,&lt;br /&gt;substr(pt.name,1,30) as PI_templatename,&lt;br /&gt;case pi.state&lt;br /&gt;   when 0  then 'deleted(0)'&lt;br /&gt;   when 1  then 'ready(1)'&lt;br /&gt;   when 2  then 'running(2)'&lt;br /&gt;   when 3  then 'finished(3)'&lt;br /&gt;   when 4  then 'compensating(4)'&lt;br /&gt;   when 5  then 'failed(5)'&lt;br /&gt;   when 6  then 'terminated(6)'&lt;br /&gt;   when 7  then 'compensated(7)'&lt;br /&gt;   when 8  then 'terminating(8)'&lt;br /&gt;   when 9  then 'failing(9)'&lt;br /&gt;   when 10 then 'indoubt(10)'&lt;br /&gt;   when 11 then 'suspended(11)'&lt;br /&gt;   when 12 then 'compensation_fail'&lt;br /&gt;end as PI_state,&lt;br /&gt;ai.piid as Process_Instance_ID&lt;br /&gt;FROM&lt;br /&gt; activity_instance_b_t ai,&lt;br /&gt; activity_template_b_t atp,&lt;br /&gt; process_instance_b_t pi,&lt;br /&gt; process_template_b_t pt&lt;br /&gt;where&lt;br /&gt; atp.atid = ai.atid and&lt;br /&gt; ai.piid = pi.piid and&lt;br /&gt; pi.ptid = pt.ptid and&lt;br /&gt; ai.last_state_change &gt; ((select max(last_state_change) from activity_instance_b_t) - 10 seconds)&lt;br /&gt;order by&lt;br /&gt; ai.last_state_change desc&lt;br /&gt;fetch first 100 rows only&lt;br /&gt;with ur ;&lt;/blockquote&gt;This statement is for IBM's DB2 database - Oracle users might want to use "WHERE ROWNUM &lt; 100" instead of "fetch first 100 rows only".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sample output:&lt;/span&gt;&lt;br /&gt;(if it looks distorted, you may want to enlarge your browser window horizontally to fit it in)&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;table border="0" cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;AI_LAST_STATE_CHANGE&lt;/td&gt;&lt;td&gt;AI_TEMPLATENAME&lt;/td&gt;&lt;td&gt;AI_STATE&lt;/td&gt;&lt;td&gt;PI_TEMPLATENAME&lt;/td&gt;&lt;td&gt;PI_STATE&lt;/td&gt;&lt;td&gt;PROCESS_INSTANCE_ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;--------------------------&lt;/td&gt;&lt;td&gt;-------------------&lt;/td&gt;&lt;td&gt;----------&lt;/td&gt;&lt;td&gt;---------------&lt;/td&gt;&lt;td&gt;-----------&lt;/td&gt;&lt;td&gt;----------------------------------&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.545000&lt;/td&gt;&lt;td&gt;Receive_waitforever&lt;/td&gt;&lt;td&gt;waiting(11)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B806201FEFFFF808BEE1841'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.540000&lt;/td&gt;&lt;td&gt;Receive_waitforever&lt;/td&gt;&lt;td&gt;waiting(11)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B8061BBFEFFFF808BEE1828'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.517000&lt;/td&gt;&lt;td&gt;Callsub&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B8061BBFEFFFF808BEE1828'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.517000&lt;/td&gt;&lt;td&gt;Callsub&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B806201FEFFFF808BEE1841'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.507000&lt;/td&gt;&lt;td&gt;Receive_waitforever&lt;/td&gt;&lt;td&gt;waiting(11)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B805FCCFEFFFF808BEE17E4'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.477000&lt;/td&gt;&lt;td&gt;Callsub&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B805FCCFEFFFF808BEE17E4'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.461000&lt;/td&gt;&lt;td&gt;Receive_waitforever&lt;/td&gt;&lt;td&gt;waiting(11)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B805F5CFEFFFF808BEE17AB'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.451000&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806316FEFFFF808BEE18B7'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.451000&lt;/td&gt;&lt;td&gt;Reply&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806316FEFFFF808BEE18B7'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.441000&lt;/td&gt;&lt;td&gt;Snippet2&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806316FEFFFF808BEE18B7'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.439000&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806318FEFFFF808BEE18B8'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.439000&lt;/td&gt;&lt;td&gt;Reply&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806318FEFFFF808BEE18B8'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.432000&lt;/td&gt;&lt;td&gt;Snippet2&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptsub&lt;/td&gt;&lt;td&gt;finished(3)&lt;/td&gt;&lt;td&gt;x'900301206B806318FEFFFF808BEE18B8'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009-04-03-10.22.37.400000&lt;/td&gt;&lt;td&gt;Callsub&lt;/td&gt;&lt;td&gt;finished(5)&lt;/td&gt;&lt;td&gt;tptmain&lt;/td&gt;&lt;td&gt;running(2)&lt;/td&gt;&lt;td&gt;x'900301206B805F5CFEFFFF808BEE17AB'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;......&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Explanation:&lt;/span&gt;&lt;br /&gt;The generated list has the following columns:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AI_LAST_STATE_CHANGE = activity instance last state change&lt;br /&gt;The last point in time, the activitiy's state got changed - the table is sorted on this column, descending - i.e. newest entry first.&lt;/li&gt;&lt;li&gt;AI_TEMPLATENAME = the template name of the activity&lt;/li&gt;&lt;li&gt;AI_STATE = the state of the activity instance&lt;/li&gt;&lt;li&gt;PI_TEMPLATENAME = the name of the process template of the processinstance, this activity is part of&lt;/li&gt;&lt;li&gt;PI_STATE = the state of the process instance   and finally&lt;/li&gt;&lt;li&gt;PROCESS_INSTANCE_ID = the ID of the process instance.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Possible performance impact:&lt;/span&gt;&lt;br /&gt;The possible impact greatly depends on the size of the related tables. Most of the operation is being done on the ACTIVITY_INSTANCE_B_T table and there on the column LAST_STATE_CHANGE.  By default, this column doesn't have an index. So if you experience very long execution times for the above SQL, you're most likely doing a table scan on the entire ACTIVITY_INSTANCE_B_T table. If so, you may want to define a suitable index for that column and perform a "runstats .... with distribution and detailed indexes all" on this table. This should reduce the table scan to an index scan, which should result in a noticeable reduction of the execution time of this SQL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer:&lt;/span&gt;&lt;br /&gt;This SQL is lightyears away from being a fully fledged flight recorder, that shows all relevant events. On the other side it can at least provide some initial insight for problem determination purposes and it is for sure far less intrusive (in terms of resource consumption) than a full blown BPE trace.&lt;br /&gt;&lt;br /&gt;(finally also published (slightly modified) at http://www-01.ibm.com/support/docview.wss?uid=swg21384848 )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-2136613180668732585?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/2136613180668732585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=2136613180668732585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2136613180668732585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2136613180668732585'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/05/poor-mans-flight-recorder.html' title='Poor Man&apos;s Flight Recorder'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-4386547475158130514</id><published>2009-04-30T15:50:00.004+02:00</published><updated>2009-04-30T16:01:41.667+02:00</updated><title type='text'>SOA/BPM performance best practices (Process Engine configuration)</title><content type='html'>Different process engines have different tuning options. Here some relevant options for WPS will be discussed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Thread pool sizes&lt;/span&gt;&lt;br /&gt;While long-running business processes spend most of their lifetime in the default thread pool (JMS based navigation) or WorkManager thread pool (WorkManager based navigation), short running processes don’t have a specific thread pool assigned to it. Dependent on from where the request to run a microflow comes from, a microflow runs within:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the ORB thread pool (e.g. the microflow is started from a different JVM with remote EJB invocation)&lt;/li&gt;&lt;li&gt;the Web container thread pool (e.g. the microflow is started using a http request)&lt;/li&gt;&lt;li&gt;the default thread pool (e.g. the microflow is started using a JMS message)&lt;/li&gt;&lt;/ul&gt;If microflow parallelism is not sufficient, examine your application and increase the respective thread pool. The key is to maximize the concurrency of the end-to-end application flow until the available processor or other resources are maximized.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Navigations mechanisms for long running flows&lt;/span&gt;&lt;br /&gt;The business process engine in WPS processes  long-running flows using a number of chained transactions. There are two types of process navigation techniques in WPS (since V6.1): JMS based navigation and WorkManager based navigation. Both types of navigation provide the same quality of service. The default is JMS based navigation. In Lab tests, WorkManager based navigation has shown throughput improvements of up to 100%.&lt;br /&gt;&lt;br /&gt;However the behaviour of the system changes a bit. If JMS based navigation is used, there is no scheme (for example age-based or priority-based) to process older or more highly prioritized business process instances first. This makes it hard to predict the actual duration of single  instances, especially on an heavily loaded system. If using WorkManager based navigation, currently processed  instances are being further processed as long as there is outstanding work for them. While this is quite efficient, it prefers running process instances.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resource dependencies&lt;/span&gt;&lt;br /&gt;Start adjusting the parameters for the SCA and MDB activation specs and the WorkManager threads (if used) and then continue down the dependency chain as depicted below:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U7gbwbUHlbc/SfmuzxYf9II/AAAAAAAAABk/aktTSEinSFs/s1600-h/resdeps.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 205px;" src="http://2.bp.blogspot.com/_U7gbwbUHlbc/SfmuzxYf9II/AAAAAAAAABk/aktTSEinSFs/s320/resdeps.png" alt="" id="BLOGGER_PHOTO_ID_5330483838422348930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;All those engine threads on the left side of the picture require JDBC connections to databases and it is very helpful for the throughput of the system if they don't have to wait for database connections from the related connection pools.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other process engine tuning knobs&lt;/span&gt;&lt;br /&gt;Business process engine environments have means to record what is happening inside, either for monitoring purposes or for doing problem determination. Any such recordings require a certain amount of processing capacity, so one should try to minimize any monitoring recordings and definitively disable traces for problem determination for normal operations.&lt;br /&gt;Some of the data stores on out of the box configurations may default to simple file-based single user databases like Derby. This eases simple setups, since some database administrative tasks can be avoided. When performance and production level transactional integrity is more important, then it is advisable to place these data stores on production level database systems. Throughput characteristics could improve by factors of 2 to 5.&lt;br /&gt;When using WPS' common event infrastructure (CEI) for recording business relevant events it might help to disable the CEI data store within WPS since CEI consumes these events and stores them in it's own database. Also validation of CEI events could be turned off, once it has been verified, that the emitted events are valid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-4386547475158130514?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/4386547475158130514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=4386547475158130514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4386547475158130514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4386547475158130514'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/04/soabpm-performance-best-practices_30.html' title='SOA/BPM performance best practices (Process Engine configuration)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U7gbwbUHlbc/SfmuzxYf9II/AAAAAAAAABk/aktTSEinSFs/s72-c/resdeps.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-7543793695867527220</id><published>2009-04-06T14:43:00.007+02:00</published><updated>2009-04-06T15:01:18.150+02:00</updated><title type='text'>SOA/BPM performance best practices (Deployment and application packaging)</title><content type='html'>Current SOA runtime environments are usually implemented on J2EE based application servers. Business applications are deployed to these environments as one or more SCA modules.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Using common object libraries&lt;/span&gt;&lt;br /&gt;Often a set of such business applications shares common definitions for data and interfaces and classical application design considerations suggest to put such common objects into a common objects library module.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U7gbwbUHlbc/Sdn6_eQ1hrI/AAAAAAAAABM/Ushk3HkzlGE/s1600-h/bp51.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 310px; height: 75px;" src="http://2.bp.blogspot.com/_U7gbwbUHlbc/Sdn6_eQ1hrI/AAAAAAAAABM/Ushk3HkzlGE/s320/bp51.gif" alt="" id="BLOGGER_PHOTO_ID_5321560403077334706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some current SOA runtime environments however treat such packaging schemas in a maybe unexpected manner. The module specific class loader for module one finds a reference to another module (the common objects library) and loads that module. When then the module specific class loader for module two loads its module's  code and find a reference to another module (again the common objects library) it loads that module. This continues for all the application modules. The fact, that the platform's application class loaders have no knowledge about what has been loaded by other application level class loaders already leads to the effect, that a shared object library module is actually shared “by copying”.  And if the memory footprint of a single copy of that shared object library is several hundred megabytes, the available heap space can be exhausted pretty fast.&lt;br /&gt;Such excessive memory usage does not necessarily have a performance impact, but when the JVM's garbage collection takes place, the responsiveness of the affected applications can suffer dramatically.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U7gbwbUHlbc/Sdn7Ksa4w2I/AAAAAAAAABU/MlMZ-Wz7tIo/s1600-h/bp52.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 314px; height: 75px;" src="http://2.bp.blogspot.com/_U7gbwbUHlbc/Sdn7Ksa4w2I/AAAAAAAAABU/MlMZ-Wz7tIo/s320/bp52.gif" alt="" id="BLOGGER_PHOTO_ID_5321560595856147298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A less memory consuming approach in this case would be to define one library module per application module. While this approach definitively requires more development and packaging effort, it can considerable reduce the overall memory requirement. Up to 57% reduction have been observed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modularization effects&lt;/span&gt;&lt;br /&gt;One of the internally used benchmark workloads is organized as three SCA modules because that seemed the most natural model a production application implementation – one module creates the business events and one consumes them, while the module in between contains the business logic responsible for synchronization. For ease of code maintenance an SCA developer may be tempted to separate an application into more modules. In order to demonstrate the performance costs incurred with modularization, the benchmark's three modules were organized into two and one SCA module.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U7gbwbUHlbc/Sdn72LFltZI/AAAAAAAAABc/aBTvwo7YMPs/s1600-h/bp53.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 310px; height: 180px;" src="http://1.bp.blogspot.com/_U7gbwbUHlbc/Sdn72LFltZI/AAAAAAAAABc/aBTvwo7YMPs/s320/bp53.gif" alt="" id="BLOGGER_PHOTO_ID_5321561342822692242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Measurements indicate a throughput improvement of 14% in the two module version and of 32% in the one module version, both relative to the original workload implementation. As might be expected, data sharing among SCA components is more expensive across modules than it is for components within the same module (where additional optimizations are available).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-7543793695867527220?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/7543793695867527220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=7543793695867527220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/7543793695867527220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/7543793695867527220'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/04/soabpm-performance-best-practices.html' title='SOA/BPM performance best practices (Deployment and application packaging)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U7gbwbUHlbc/Sdn6_eQ1hrI/AAAAAAAAABM/Ushk3HkzlGE/s72-c/bp51.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-1753980716294130533</id><published>2009-03-31T16:37:00.020+02:00</published><updated>2009-04-01T13:07:25.527+02:00</updated><title type='text'>Slow BPC processing - a PD story using DB analysis</title><content type='html'>One of the educational principles and an essential base of what is called “experience” is to learn from  errors made. Second best is to learn from errors made by others – which is still better than not learning at all. Maybe this story helps a bit.&lt;br /&gt;&lt;br /&gt;A customer's WPS seemed to become a bit sluggish and all the usual tuning efforts hadn't helped  a lot. One of the things that still could be done was to look into the BPEDB itself to see,  whether there are unexpected amount of data and/or relations.&lt;br /&gt;&lt;br /&gt;Finally, the investigations revealed an unhandled condition in a process model, that lead to a  undesirable loop.&lt;br /&gt;&lt;br /&gt;We started with a &lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;select count(*) from process_instance_b_t with ur &lt;/span&gt;&lt;/blockquote&gt;to get the number of rows in the process instance table - which represents the number of process instances WPS knows about.&lt;br /&gt;&lt;br /&gt;We include the "with UR" clause in all these selects to avoid, that the database sets any locks that would interfere even more with  other users (applications) of the database. Or - to phrase it differently - to be as least intrusive as possible.&lt;br /&gt;&lt;br /&gt;Maybe you're interested in a few more details, then you can ask for the amount of instances in a certain state. &lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;select count(*) from process_instance_b_t where state = 2 with ur &lt;/span&gt;&lt;/blockquote&gt;would yield all running instances. These states include DELETED=0, READY=1, RUNNING=2, FINISHED=3, COMPENSATING=4, FAILED=5,  TERMINATED=6, COMPENSATED=7, TERMINATING=8, FAILING=9, INDOUBT=10, SUSPENDED=11, COMPENSATION_FAILED=12&lt;br /&gt;&lt;br /&gt;Similarly you can collect some statistics on activities:&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;select count(*) from activity_instance_b_t with ur&lt;br /&gt;select count(*) from activity_instance_b_t where state = 5 with ur &lt;/span&gt;&lt;/blockquote&gt;Valid states are: INACTIVE=1, READY=2, RUNNING=3, SKIPPED=4, FINISHED=5, FAILED=6, TERMINATED=7, CLAIMED=8, TERMINATING=9, FAILING=10, WAITING=11, EXPIRED=12, STOPPED=13, PROCESSING_UNDO=14.&lt;br /&gt;&lt;br /&gt;When your typical (or average) process model executes e.g. 30 activities, then the amount of rows in the activity_instance_b_t  table should roughly be in the order of magnitude of up to 30 times the amount of rows in the process_instance_b_t table.&lt;br /&gt;&lt;br /&gt;In this case we found over 39M activity instances for about 50k process instances, where we only expected  up to 1M activity instances.&lt;br /&gt;That justified some deeper investigation - we wanted to find out, which instances had the most activities. &lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;PI.PIID, PT.NAME, PI.STATE, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      COUNT(AI.AIID) AS NUMBER_OF_ACTIVITIES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      ACTIVITY_INSTANCE_B_T AS AI, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      PROCESS_INSTANCE_B_T AS PI, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      PROCESS_TEMPLATE_B_T AS PT &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      PI.PTID = PT.PTID AND  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      AI.PIID = PI.PIID &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;GROUP BY  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      PI.PIID, PT.NAME, PI.STATE &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORDER BY  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      NUMBER_OF_ACTIVITIES DESC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FETCH FIRST 20 ROWS ONLY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WITH UR&lt;/span&gt;&lt;/blockquote&gt;Some explanations:&lt;br /&gt;PI.PIID is the process instance ID from the process_instance_b_t table&lt;br /&gt;To see a bit more than just a hex ID, the name of the related process template (PT.NAME) is included.&lt;br /&gt;And as we're interested in the amount of activities for these process instances, we'd need to include something from the activity_instance_b_t table and do the necessary grouping.&lt;br /&gt;&lt;br /&gt;In our specific case this resulted in&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;table border=0 cellpadding=5 cellspacing=5&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;PIID&lt;/td&gt; &lt;td&gt;NAME&lt;/td&gt;&lt;td&gt;STATE&lt;/td&gt; &lt;td&gt;NUMBER_OF_ACTIVITIES&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td&gt;-----------------------------------&lt;/td&gt;&lt;td&gt;------------&lt;/td&gt;&lt;td&gt;-------&lt;/td&gt; &lt;td&gt;--------------------&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;x'9003011CE5DED75B3EFDEB538C02DAE4'&lt;/td&gt; &lt;td&gt;LGClaimEH&lt;/td&gt; &lt;td align="right"&gt;6&lt;/td&gt; &lt;td align="right"&gt;147047&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;x'9003011E841DE9AF3EFDEB53045C4103'&lt;/td&gt;  &lt;td&gt;LGClaimEH&lt;/td&gt; &lt;td align="right"&gt;6&lt;/td&gt; &lt;td align="right"&gt;96609&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;x'9003011E841DDEF13EFDEB53045C3DD9'&lt;/td&gt; &lt;td&gt;LGClaimEH&lt;/td&gt; &lt;td align="right"&gt;6&lt;/td&gt; &lt;td align="right"&gt;96462&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; . . . .&lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;td align="right"&gt; &lt;/td&gt; &lt;td align="right"&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;br /&gt;LGClaimEH was expected to have 20-30 activities at most. Position 100 in that ordered list had about 57k and position 1000 had 7k activities. Furthermore state=6 indicated that these instances were no longer running (6=terminated). From their name, the customer could tell, that they're no longer relevant and should have been cleaned up automatically.&lt;br /&gt;&lt;br /&gt;A lookup of&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;select auto_delete from process_template_b_t where name = 'LGClaimEH'&lt;/span&gt;&lt;/blockquote&gt;proved, that when modelling the process the “delete instance when finished” flag was not set (auto_delete=0), which was the reason, why all these instances still existed.&lt;br /&gt;&lt;br /&gt;However, why there were so many activities in these instances needed further investigation. We tried to get a list of the most recently executed activities in some of the topmost cases in the above list.&lt;br /&gt;(N.B. only activities with the “business relevance” flag set are persisted in the activity instance table)&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;SELECT  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AI.LAST_STATE_CHANGE, ATP.NAME, AI.STATE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ACTIVITY_INSTANCE_B_T  AI,  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ACTIVITY_TEMPLATE_B_T  ATP &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AI.ATID = ATP.ATID and  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AI.PIID = x'9003011CE5DED75B3EFDEB538C02DAE4' &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORDER BY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AI.LAST_STATE_CHANGE DESC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FETCH FIRST 40 ROWS ONLY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WITH UR&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;resulted in something like &lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt; &lt;table border=0 cellpadding="5" cellspacing="5"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;LAST_STATE_CHANGE&lt;/td&gt; &lt;td&gt;NAME&lt;/td&gt; &lt;td&gt;STATE&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;-----------------------------------&lt;/td&gt;&lt;td&gt;------------&lt;/td&gt;&lt;td&gt;-------&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.24.17.964333&lt;/td&gt; &lt;td&gt;Activity_17&lt;/td&gt; &lt;td align="right"&gt;7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.23.55.925757&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.23.32.528576&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.23.11.976875&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.22.49.582347&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.22.24.257894&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2009-03-22-16.22.01.723894&lt;/td&gt; &lt;td&gt;Activity_14&lt;/td&gt; &lt;td align="right"&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; . . . .&lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;br /&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/blockquote&gt;which continued on and on with “Activity_14” in State finished(=5) in roughly 20 seconds difference in the timestamps for thousands of rows.&lt;br /&gt;&lt;br /&gt;After the application developer saw this, it didn't take long to find out, what to correct.&lt;br /&gt;In this case the “delete when finished” flag was activated the (not shown here) business rule, that determined the 20 seconds interval got adapted and most important the business logic, that lead to the undesired loop, was corrected.&lt;br /&gt;&lt;br /&gt;At least this case could be used as a demonstration of robustness as the oldest of these instances dated over 9 moths ago. The server performed this “nonsense” in the application code for quite a long time before it's slowness in processing (most obvious in deleting instances) was noticed. And even then – it didn't break.&lt;br /&gt;&lt;br /&gt;The final cleanup in the database was done in small chunks using the deleteCompletedProcessInstances.py script in the {install_root}/runtimes/bi_v6/ProcessChoreographer/admin directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-1753980716294130533?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/1753980716294130533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=1753980716294130533' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/1753980716294130533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/1753980716294130533'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/03/slow-bpc-processing-pd-story-using-db.html' title='Slow BPC processing - a PD story using DB analysis'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-2911312380417847599</id><published>2009-03-03T14:32:00.000+01:00</published><updated>2009-03-03T14:55:44.295+01:00</updated><title type='text'>Performance PD techniques - sniffing into the database</title><content type='html'>Sometimes performance problem determination can be assisted by tracing what is going on in the process engine database.&lt;br /&gt;Usually database managers offer very helpful facilities to assist here in a least intrusive way.&lt;br /&gt;&lt;br /&gt;In case you don't have your DBA available (or don't have one - or have enough access rights yourself) you can e.g. start monitoring SQL statements or deadlocks.&lt;br /&gt;&lt;br /&gt;An SQL statement event monitor can be started (here with DB2 on AIX) with the following sequence of commands.&lt;br /&gt;&lt;br /&gt;db2 connect to your-bpedb-name-here&lt;br /&gt;db2 "create event monitor  statmnts for statements write to file '/tmp/DB2_smon'"&lt;br /&gt;---- (note: this path (directory) should exist)&lt;br /&gt;db2 set event monitor statmnts state 1&lt;br /&gt;db2 flush event monitor statmnts&lt;br /&gt;---- now perform whatever scenario you want to do the tracing for&lt;br /&gt;db2 set event monitor statmnts state 0&lt;br /&gt;db2 flush event monitor statmnts&lt;br /&gt;db2evmon -path '/tmp/DB2_smon' &gt; '/tmp/DB2_smon/sqltrace.txt'&lt;br /&gt;db2 connect reset&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Similarly an event monitor for deadlocks can be set up:&lt;br /&gt;db2 connect to your-bpedb-name-here&lt;br /&gt;db2 "create event monitor  dedlk for deadlocks with details history values write to file '/tmp/DB2_dlock'"&lt;br /&gt;---- (note: this path (directory)  should exist)&lt;br /&gt;db2 set event monitor dedlk state 1&lt;br /&gt;db2 flush event monitor dedlk&lt;br /&gt;db2 set event monitor dedlk state 0&lt;br /&gt;db2 flush event monitor dedlk&lt;br /&gt;db2evmon -path '/tmp/DB2_dlock' &gt; '/tmp/DB2_dlock/sqldeadlocks.txt'&lt;br /&gt;db2 connect reset&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-2911312380417847599?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/2911312380417847599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=2911312380417847599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2911312380417847599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2911312380417847599'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/03/performance-pd-techniques-sniffing-into.html' title='Performance PD techniques - sniffing into the database'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-4683909561507668816</id><published>2009-03-02T15:21:00.000+01:00</published><updated>2009-03-02T15:27:46.543+01:00</updated><title type='text'>SOA/BPM performance best practices (End user interaction considerations)</title><content type='html'>When designing the end user's interface and interaction with the BPM system, one mainly has to deal with getting a list of tasks to be worked at, claiming tasks, and completing tasks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Querying to-do tasks&lt;/span&gt;&lt;br /&gt;Experience has shown that when end users have large degrees of freedom in filtering and sorting the list of tasks they have access to, that they might develop a kind of cherry-picking behaviour. This might result in much more task queries being performed than actual work being completed. Cases of a 20 to 1 ratio have been observed. When the nature of the business requires the flexibility of arbitrary filtering and sorting, then there is not a lot that can be done, but if this freedom is not necessary, it is advisable to design the end user's interaction with the system in a way that doesn't offer filtering and sorting capabilities that aren't required.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Concurrent access to tasks&lt;/span&gt;&lt;br /&gt;When two or more persons try to claim or check out the same task from their group's task list, only the first one will succeed. The other persons will get some kind of an access error, when trying to claim a task, that has been claimed by someone else before.&lt;br /&gt;Such claim collisions are counterproductive, since they usually trigger additional queries. A possible remedy would be to design the client side code in a way that whenever a claim attempt reports a collision that the code randomly tries to claim one of the next tasks in the list and present that one to the end user.&lt;br /&gt;The probability of claim collisions becomes larger with the number of concurrent users accessing a common group task list, the frequency of task list refreshes, and the inappropriateness of  the mechanism to select a task from a common list. Claim collisions not only cause additional queries to be processed, they also can frustrate the end users.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multiple task assignments&lt;/span&gt;&lt;br /&gt;The previous sub-section suggests to keep the number of persons accessing a common task list “small”. If instead of putting it on a common task list, a single task is assigned to multiple people, similar collision effects can occur. Keeping the number of persons a single task is assigned to as small as possible is again a good strategy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-4683909561507668816?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/4683909561507668816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=4683909561507668816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4683909561507668816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4683909561507668816'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/03/soabpm-performance-best-practices-end.html' title='SOA/BPM performance best practices (End user interaction considerations)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-4208953186791872607</id><published>2009-02-09T15:00:00.000+01:00</published><updated>2009-02-09T15:10:33.665+01:00</updated><title type='text'>SOA/BPM performance best practices (BPEL process definitions)</title><content type='html'>WPS can handle two different types of BPEL flows: long running flows (also known as macro flows or interruptible flows) and short running flows (also known as microflows of non-interruptible flows).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Long running flows&lt;/span&gt;&lt;br /&gt;A business transaction, that is represented through a long running flow has a lifetime that can span minutes, hours, days or even months and is typically divided into several technical transactions (embraced by begin and commit). The state of such a process instance is persisted in a database (the BPE DB) between two transactions, so that operating system resources are only occupied during an in-flight transaction. WPS allows for tuning of technical transaction boundaries, so that at process definition time the developer can e.g. extend the scope of a transaction by combining several transactions into a single one, thus saving the transaction handling overhead to a certain degree.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Short running flows&lt;/span&gt;&lt;br /&gt;The other type of of flow, the short running flow, is used when the corresponding business transaction is fully automated, completes within a short time frame, and has no asynchronous request/response operations. Here the entire set of of flow activities run within one single technical transaction, navigation is all done in memory, and intermediate state is not saved to to a database. Such short running flows can run between 5 and 50 times faster than comparable long running flows and should be preferred if possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Programming at the business level&lt;/span&gt;&lt;br /&gt;BPEL can be considered as a programming language. This aspect however should not lead to the assumption, that  it would be appropriate to use it as a suitable base to develop applications that usually written in languages like C++ or Java. BPEL should be considered as an interpreted language, although there have been some investigations on the  possible advantages of compiled BPEL. Comparing the execution characteristics of a BPEL flow internally with the flexibility of interaction and invocation of the orchestrated services provided through SOA, it might become obvious, that a considerable share of the overall execution path length can be accounted to SOA's invocation mechanisms for example via SOAP or messaging. So having a BPEL compiler would only optimize a smaller part of the overall execution path length. And with compiled BPEL one might loose some flexibility and interoperability, that the current implementations are offering.&lt;br /&gt;In the 1980s, one of the trends in the IT industry was called Business Process Re-engineering. The solutions that were developed for that usually were more or less large monolithic programs containing the business level logic hard coded in it's modules in most of the cases. In BPEL based business applications, this business level logic is transferred to the BPEL layer. Some considerations should be made, where to place the dividing line between the BPEL layer and the orchestrated lower level business logic services. The more flow logic details are put into BPEL, the larger the BPEL related share of the overall processing gets and one might end up with doing low level or fine granular programming in BPEL. This is not, what BPEL is meant to be used for. After all, the “B” in BPEL stands for “business”. So BPEL should be used for programming on the business logic level only.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Business process data&lt;/span&gt;&lt;br /&gt;Every business process deals with some amount of variable data, that might be used for decisions within the flow or as input or output parameters of some flow activities. The amount or size of that data can have a considerable impact on the amount of processing that needs to take place. For large business objects the amount of memory needed may quickly exhaust the available JVM heap and in case of long running processes the size of business objects directly relates to the amount of data, that needs to be saved and retrieved from a data store at each transactional boundary. And CPU capacity is affected as well for doing object serialization and de-serialization. The advice is to use as little data as possible within a business process instance. Instead of e.g. passing large images through a flow, a pointer to the image in form of a file name or  image id causes much less overhead in the business flow engine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Invocation types&lt;/span&gt;&lt;br /&gt;SCA environments offer different kinds of invocation mechanisms. Some invocations can be done synchronously, some asynchronously. Synchronous invocations typically imply less internal processing compared to asynchronous invocations. Asynchronous invocations typically require also a currently open transaction to be committed to allow the outgoing request message to become visible to the consumer it is targeted to. Even when the used binding is synchronous, unnecessary serialization and de-serialization could be avoided, is the target service can reside within the same JVM, so that internally just object pointers can be passed.&lt;br /&gt;If the target service could reside within the same module, then one could also save some internal name lookup processing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Audit logging&lt;/span&gt;&lt;br /&gt;Most BPM engines allow to keep a record of whatever is happening on the business logic level. Producing such audit logs doesn't come for free either since at least some I/O is associated with it. The recommendation here is to restrict audit logging to only those events, that are really relevant to the business and omit all others to keep the amount of logging overhead as small as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-4208953186791872607?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/4208953186791872607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=4208953186791872607' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4208953186791872607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/4208953186791872607'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/02/soabpm-performance-best-practices-bpel.html' title='SOA/BPM performance best practices (BPEL process definitions)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-1094329452456154557</id><published>2009-01-28T13:53:00.000+01:00</published><updated>2009-01-28T14:07:53.726+01:00</updated><title type='text'>SOA/BPM performance best practices (Addressing complex environments)</title><content type='html'>Except for maybe simple proof-of-concept proof-of-technology, or demo setups, to&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U7gbwbUHlbc/SYBWY0T0j2I/AAAAAAAAAAU/W6fkWUrwPjw/s1600-h/soarefa.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 93px;" src="http://2.bp.blogspot.com/_U7gbwbUHlbc/SYBWY0T0j2I/AAAAAAAAAAU/W6fkWUrwPjw/s320/soarefa.png" alt="" id="BLOGGER_PHOTO_ID_5296328146146332514" border="0" /&gt;&lt;/a&gt;day's real life business process automation environments are complex.&lt;br /&gt;Complexity often goes along with a variety of different ways to look at it. Some of these views may provide overlapping contents, some others might be &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;disjunct&lt;/span&gt; and perhaps also orthogonal to other views.&lt;br /&gt;Having a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SOA&lt;/span&gt; environment suggests to look at the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SOA&lt;/span&gt; reference architecture[1], when considering performance related questions in architecture reviews.&lt;br /&gt;&lt;br /&gt;Having this architecture chart in mind can help in assessing a solution's performance&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_U7gbwbUHlbc/SYBW-kV28zI/AAAAAAAAAAc/hrh4SSniVcs/s1600-h/optop2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 97px;" src="http://3.bp.blogspot.com/_U7gbwbUHlbc/SYBW-kV28zI/AAAAAAAAAAc/hrh4SSniVcs/s320/optop2.png" alt="" id="BLOGGER_PHOTO_ID_5296328794694939442" border="0" /&gt;&lt;/a&gt; behaviour or when doing performance problem determination, but usually diagrams on operational topology and application architecture pro­&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;vide&lt;/span&gt; much better assistance. Such charts show, how all the involved components are connected and allow to depict, how requests are flowing through the system.&lt;br /&gt;&lt;br /&gt;So - whenever you have to troubleshoot performance problems - especially in an unknown &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;environment&lt;/span&gt; - make sure you get the charts/pictures that help you understand, how things look like and how they relate to each other. This material also helps a lot in communicating with e.g. system support personnel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-1094329452456154557?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/1094329452456154557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=1094329452456154557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/1094329452456154557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/1094329452456154557'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/01/soabpm-performance-best-practices.html' title='SOA/BPM performance best practices (Addressing complex environments)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U7gbwbUHlbc/SYBWY0T0j2I/AAAAAAAAAAU/W6fkWUrwPjw/s72-c/soarefa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-6591985930362814584</id><published>2009-01-26T14:31:00.000+01:00</published><updated>2009-01-26T14:43:50.743+01:00</updated><title type='text'>SOA/BPM performance best practices (Intro)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_U7gbwbUHlbc/SX28XOuV0BI/AAAAAAAAAAM/Z1CtIYqGkDM/s1600-h/optop.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 227px; height: 171px;" src="http://1.bp.blogspot.com/_U7gbwbUHlbc/SX28XOuV0BI/AAAAAAAAAAM/Z1CtIYqGkDM/s320/optop.png" alt="" id="BLOGGER_PHOTO_ID_5295595844133048338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Today's application solutions, that include SOA and Business Process Management are usually spread  across a nontrivial operational topology like the one in the picture on the right.&lt;br /&gt;&lt;br /&gt;The quality of service that a business process provides to the business is directly dependent on the integrity,  availability, and performance characteristics of the involved IT systems. The more components are involved, the more complex the solution will become in every aspect throughout it's life cycle.&lt;br /&gt;&lt;br /&gt;The following posts will try to provide an overview (from my limited point of view) on the most important performance aspects to take care of in such a complex environment by&lt;br /&gt;&lt;ul&gt;&lt;li&gt;identifying performance relevant areas,&lt;/li&gt;&lt;li&gt;providing the most important items to take care of in each of these areas,&lt;/li&gt;&lt;li&gt;discussing some governance principles to address the integrity issues that might arise in case of performance problems and with planned or unplanned outages.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-6591985930362814584?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/6591985930362814584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=6591985930362814584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/6591985930362814584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/6591985930362814584'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/01/soabpm-performance-best-practices-intro.html' title='SOA/BPM performance best practices (Intro)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U7gbwbUHlbc/SX28XOuV0BI/AAAAAAAAAAM/Z1CtIYqGkDM/s72-c/optop.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-9102342582926711644</id><published>2009-01-20T14:43:00.000+01:00</published><updated>2009-01-26T14:29:04.328+01:00</updated><title type='text'>SOA/BPM performance best practices (Abstract)</title><content type='html'>&lt;span style="font-family:arial;"&gt;In the following few posts, I'd like to provide a wide, high-level overview on lessons learned, best practices, and performance engineering for business process management (BPM) and choreography in the context of SOA. The considerations concentrate on WebSphere Process Server (WPS) and it's BPM component Business Process Choreographer (BPC). However, most of the principles should apply to other BPM automation products as well. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;BPM/BPC is one of the core services of IBM's SOA stack and is actually older than SOA itself. The areas of best practices encompass more than just the classical IT disciplines.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It starts with business process analysis and business process modeling. Analyzing and modeling the ways an enterprise works (or should work) in too much details can lead to processing low level logic within the context of a business process model running in the business process engine. As a consequence more cycles will be used and business process versioning could become more difficult to manage.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Careful planning and designing the end user interactions with new business process applications can avoid that selecting and getting a unit of work takes more cycles than getting the work done.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Defining the operational topology to meet scalability and availability requirements can have similar performance implications as the large set of configuration parameters in a single WAS/WPS node.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Since the above product stack runs on classical operating systems and their infrastructure all typical performance considerations need to be applied there as well. The scope spans from influencing dispatching priorities and memory related tuning knobs in the participating subsystems to I/O subsystem configurations used for persisting business process related state and data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;As SOA with BPM/BPC integrates and aggregates business services to new complexities, so does its use impose challenges in managing product and services dependencies in the transition from development of the business process applications into day to day operation with the classical IT management disciplines including (but not limited to) monitoring and problem and change management.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Performance Engineering can be extended to include business services and business processes within the scope of the various performance engineering disciplines.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-9102342582926711644?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/9102342582926711644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=9102342582926711644' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/9102342582926711644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/9102342582926711644'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2009/01/soabpm-performance-best-practices-part1.html' title='SOA/BPM performance best practices (Abstract)'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-3433072116209659290</id><published>2008-07-15T14:49:00.000+02:00</published><updated>2008-07-15T14:55:18.581+02:00</updated><title type='text'>WebSphere Base - performance</title><content type='html'>In June I met a very friendly colleague of mine, Alex Polozoff, at a common customer engagement. His blog on &lt;a href="http://websphere-performance.blogspot.com/"&gt;WebSphere Performance&lt;/a&gt; inspired me to start this one.&lt;br /&gt;&lt;br /&gt;I don't believe, that there will be too much overlap, since I'm planning to concentrate on the upper layers of the stack, that deals with process choreography and it's surroundings.&lt;br /&gt;&lt;br /&gt;Thank you Alex!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-3433072116209659290?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/3433072116209659290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=3433072116209659290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/3433072116209659290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/3433072116209659290'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2008/07/websphere-base-performance.html' title='WebSphere Base - performance'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7653634180323609766.post-2333850693228365332</id><published>2008-07-03T16:07:00.000+02:00</published><updated>2008-07-03T16:18:42.307+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BPEDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Richard Metzger'/><category scheme='http://www.blogger.com/atom/ns#' term='disk space'/><title type='text'>How much space will my BPEDB occupy?</title><content type='html'>Database space is more or less irrelevant.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;Today's disks have at least 40 (or 80) or more GB of space. Production level disks (heavy duty) are even larger.&lt;br /&gt;For production you need performance. And for good I/O performance you'll need to distribute your I/O across multiple dedicated physical disks (striped FS, RAID 0, or alike). This applies to SAN storage too.&lt;br /&gt;The typical DB sizes (in terms of occupied space on disk) for BPC production databases are a small fraction of the space (in terms of (number of) disk drives) you need for performance. Actually you'll "waste" maybe 80% of your available disk space in order to get the production level performance you're after.&lt;br /&gt;&lt;br /&gt;So - don't bother about how large the production DB will be - it will very well fit on the disk array you'll need for performance.&lt;br /&gt;&lt;br /&gt;Absolute numbers?  I've hardly seen anything larger than 200GB so far - which was huge already. Typically MQWF's and BPC's DB sizes are between 50 and 150GB.  You'll have a large installation? Well, then assume 500GB - you can squeeze that on a single disk today, but I'm sure you won't do that (performance).&lt;br /&gt;&lt;br /&gt;From what has been have seen in lab tests, 2 million process instances take up around 100GB if you don't have excessively large and many BOs as variables in a process.&lt;br /&gt;&lt;br /&gt;Some figures reported from capacity POCs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1 M process instances, 0.5 M human tasks: 100GB&lt;/li&gt;&lt;li&gt;approx. 50 M process instances, no human tasks: 1TB&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7653634180323609766-2333850693228365332?l=websphere-process-server-performance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://websphere-process-server-performance.blogspot.com/feeds/2333850693228365332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7653634180323609766&amp;postID=2333850693228365332' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2333850693228365332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7653634180323609766/posts/default/2333850693228365332'/><link rel='alternate' type='text/html' href='http://websphere-process-server-performance.blogspot.com/2008/07/how-much-space-will-my-bpedb-occupy.html' title='How much space will my BPEDB occupy?'/><author><name>Richard</name><uri>http://www.blogger.com/profile/01505520015655092109</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
