Re: Performance Tesing

From: Joe Baldwin (jfbaldwi..arthlink.net)
Date: Wed Jun 03 2009 - 15:17:42 EDT

  • Next message: Zissis Trabaris: "Best way to turn a DataRow into an Object instance in ROP client?"

    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