Performance of Creating New Sessions
adam.mccormick Dec 6, 2016 12:41 AMWe are using ModeShape 4.6.1-Final...
Our application is high read, low write. We actually only write to the repository at most once per day (we use the JCR export/import to move content from a staging environment to production). Client's need not be authenticated so all sessions are anonymous.
I recently discovered that our application was not logging out the session after the http request had been completed. I changed this to create a new session for each request and log it out after rendering has completed (I took the same approach as in the modeshape-web-jcr-rest project of using a thread local to create and remove the request bound session).
After doing this we noticed a marked degradation in our performance tests. I think the problem lies in the workspace cache having to read from the persistence for each new session where as before each request may have been reusing a session which already has a lot of the content in the workspace cache.
Is there a way to help with this? Is some ModeShape or Infinispan configuration that can help with high read scenarios? The only thing I can think of upping the minimum binary size to try and avoid going to the binary store so often (i will give this a go tomorrow). In the mean time...
Any idea's would be great!
For reference here's my current infinispan.xml:
<?xml version="1.0" encoding="UTF-8"?> <infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:7.2 http://www.infinispan.org/schemas/infinispan-config-7.2.xsd" xmlns="urn:infinispan:config:7.2"> <cache-container default-cache="unused" statistics="false" > <jmx duplicate-domains="true"/> <!-- avoids duplicate persistent directories because of cache configuration inheritance --> <local-cache name="unused" statistics="false" /> <local-cache name="repository" statistics="false"> <locking acquire-timeout="2000" /> <transaction mode="NON_XA" locking="OPTIMISTIC"/> <persistence passivation="false"> <file-store fetch-state="false" shared="false" preload="true" purge="false" path="${home}/jcr/data"/> </persistence> </local-cache> <!-- Local in-memory caches with no persistence. Used instead of the default one in modeshape to avoid the LIRS bug in infinispan --> <local-cache name="repository/system" statistics="false"> <!-- No more that 10K entries per cache, with LRU eviction. --> <eviction max-entries="10000" strategy="LRU"/> <!-- Expire entries after 120 seconds or after 60 seconds of not being used (whichever comes first). --> <expiration lifespan="120000" max-idle="6000"/> </local-cache> <!-- Local in-memory caches with no persistence. Used instead of the default one in modeshape to avoid the LIRS bug in infinispan --> <local-cache name="repository/default" statistics="false"> <!-- No more that 10K entries per cache, with LRU eviction. --> <eviction max-entries="10000" strategy="LRU"/> <!-- Expire entries after 120 seconds or after 60 seconds of not being used (whichever comes first). --> <expiration lifespan="120000" max-idle="6000"/> </local-cache> <!-- persistent cache used by a connector --> <local-cache name="connector" statistics="false"> <locking acquire-timeout="2000" /> <transaction mode="NON_XA" locking="OPTIMISTIC"/> <persistence passivation="false"> <file-store fetch-state="false" shared="false" preload="false" purge="false" path="${home}/jcr/data"/> </persistence> </local-cache> </cache-container> </infinispan>
And repository configuration:
{ "name" : "repository", "transactionMode":"none", "workspaces": { "default":"default", "cacheConfiguration":"infinispan.xml" }, "storage" : { "cacheConfiguration" : "infinispan.xml", "cacheName" : "repository", "binaryStorage" : { "directory":"${home}/jcr/binary", "minimumBinarySizeInBytes" : 100, "minimumStringSize" : 999999999999, // avoids a problem we had in the connector with strings coming back as binary types "type" : "file" } }, "garbageCollection": { "initialTime":"12:18", "intervalInHours":1 }, "security": { "anonymous": { "roles" : ["readonly","readwrite","admin"], "username" : "<anonymous>", "useOnFailedLogin" : false } }, "journaling":{ "enabled":false } }