cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Joe Baldwin <>
Subject Re: Performance Tesing
Date Wed, 03 Jun 2009 19:17:42 GMT

thanks a lot for the hints.

1. I have designed using Cayenne 3.0 (with MySQL & JSP).  I have  
converted over from DataContext to BaseContext (as best as I have been  
able to follow your usage instructions).
2. Given all the layers of caching (MySQL, Cayenne, Tomcat, etc), my  
intuition is lacking with respect to expected behavior.

So my generic approach is to first implement your "best practices" for  
my unit testing, then devise an appropriate load test (one that will  
simulate about 50-100 concurrent users using JMeter).  (Based on your  
input I should probably think about using a finer-grained profiler  
like YourKit as well)

My problem is that given all of the advanced caching going on, I have  
very little idea of what a healthy profile should look like.   
Therefore, I am guessing at this point. :)

	- Java 1.5, MySQL, JSP, Tomcat
	- Cayenne 3.0, BaseContext, MaxObjects=10000, SharedCache,  
	- 50-100 concurrent user threads
	- Tomcat: (two cases) Xms64m & Xms256m, both with SessionTimeOut=5min
	- MyDesign: store the large search-result lists in a custom class  
store in a session object (which is released on session timeout)

At Xms64m, the website grinds to a halt at about 50 user threads.  
Using Xms256m, there seems to be no issue with degraded performance.   
For both max-heap values, after 5 min, most of the memory is released  
(i.e. 70MB @max and 20MB after release and GC).  There always seems to  
be some residual memory used over base line but this appears to be  
constant and not growing.

1. With this simple test there does not appear to be the  
characteristic stair step associated with a memory leak.  *If* my  
assumptions are correct then I simply need to set Tomcat-Xms to  
support the Cayenne caching implementation. Does this sound correct?

2. When I am able to predict the appropriate user needs: I attempt to  
nullify all of my search list references and then garbage collect (to  
message BaseContext to do any house-cleaning).  Is this sufficient  
(with the Cayenne 3.0 weak-reference model) or do I need to read more  
documentation on "house cleaning" procedures?

3.  I have, at best, a peripheral understanding of BaseContext,  
especially wrt optimal usage for WebApps.  When I use  
BaseContext.getThreadObjectContext() to perform a query, will I  
generate two separate objects (for the same MySQL data mapping) for  
two separate users requesting the same data?  I would assume that he  
answer and there is a single cache for both user threads and that two  
*references* to the cached objects are generated.  Am I close, or do I  
need to do some more Cayenne homework? :)


On Jun 3, 2009, at 4:10 AM, Andrus Adamchik wrote:

> And another one...
> Query cache and snapshot cache are all using LRUMaps, so they won't  
> grow indefinitely even in 2.0, however the total amount of RAM given  
> to the JVM may not be enough to fill the LRU to the full default  
> capacity. So either consider reducing the "Size of Object Cache" in  
> the Modeler, or give your process more memory with -Xmx.
> In any event, consider using a profiler to check what causes a  
> memory leak. This may be faster than guessing. Can't recommend  
> anything free (there should be some Eclipse plugins??). I am using  
> YourKit profiler for this purpose.
> Andrus
> On Jun 3, 2009, at 11:04 AM, Andrus Adamchik wrote:
>> I've done a fair share of Cayenne-based application performance  
>> testing. Although I don't have a single recipe, it all depends on  
>> the application expected usage patterns.
>> Just a general Cayenne memory management hint - if you are using  
>> Cayenne version prior to 3.0, watch out for DataContexts filling  
>> with objects. Every single object fetched via a DataContext, will  
>> be cached in it, so it is expected that the user takes care of  
>> disposing of DataContexts in one way or another (putting a  
>> DataContext in a session is a common strategy for doing that, but  
>> depending on your app this may not be enough). So if you are  
>> processing lots of objects within a single DataContext, consider  
>> replacing it manually (3.0 solves this problem by using weak  
>> references).
>> Andrus
>> On Jun 2, 2009, at 1:44 AM, Joe Baldwin wrote:
>>> I am attempting to do performance testing on a JSP webapp that  
>>> uses Cayenne for all of the database access.  I am currently using  
>>> Jmeter and JConsole, but the first tests seem to indicate that  
>>> there is a memory leak (either that or I am created a bad test).
>>> Does anyone have good experience with a test suite that is  
>>> compatible with Cayenne in a Tomcat context?
>>> Thanks,
>>> Joe

View raw message