Andrus,
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. :)
Conditions:
- Java 1.5, MySQL, JSP, Tomcat
- Cayenne 3.0, BaseContext, MaxObjects=10000, SharedCache,
MaxConnections=10
- 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)
Results:
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..ax 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.
Questions:
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? :)
Thanks
Joe
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
>>
>>
>
This archive was generated by hypermail 2.0.0 : Wed Jun 03 2009 - 15:18:22 EDT