Hello all,
We're currently experience a problem where JackRabbit function will
occasionally slow down; according to our QA, the slow down comes in waves: good
performance for a while (hours) then bad for a while (minutes / hours). The
slow down is on the order of minutes to perform create or modify an object
(creation involves creating a 2-3 levels of nodes, and setting properties).
Normally these operations take 100 - 300 ms, but during the slow down they can
take as much 5 minutes.
The slow down does not seem to be connected to the load on the server: we've
seen it perform well, when many people are connecting, then slow down with only
one user. I suspect the slow down is related to indexing, but that's just a
guess on my part - I'm looking for something that would happen at some interval.
Environment:
* JackRabbit is built into war running in Tomcat (was 7.0.25, recently upgraded
to 7.0.34)
* Tomcat was running with default configs but recently up'd memory - -Xms128M
-Xmx512M -XX:MaxPermSize=256M
* Repository XML is at end of email
* JackRabbit was originally configured to be clustered, but is now running as
just a single instance.
Data:
* Our data is structured similar to a file system, except any object can be
both a file and contain other objects (files); each object has various metadata
(some in properties, some in child nodes), a file and child objects
* We don't use full text searching and don't want file (binary) contents
indexed; the only way I was able to prevent the search index from examining the
files (some are large 100+ M) was to create my own node types for files. My
node types are identical nt:file and nt:content, except that they are named
prd:file and prd:content; the unrecognized name seems to prevent indexing from
touch them.
When I've attempted to use profiling tools, it appears that during the slow
down the CPU is pegged; memory usage is also at or close to the limit. In
depth profiling tools (NetBeans) get overwhelmed during the slow down.
We're going thru a variety of tests, but any advice the community can provide
will be greatly appreciated.
Here's the repository.xml:
<Repository>
<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url"
value="jdbc:mysql://${pm.database.url}:${pm.database.port}/${pm.database.prefix}global_repository?autoReconnect=true&createDatabaseIfNotExist=true"/>
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="rep_"/>
<param name="user" value="${pm.database.user}"/>
<param name="password" value="${pm.database.pwd}"/>
</FileSystem>
<!--
security configuration
-->
<Security appName="Jackrabbit">
<!--
security manager:
class: FQN of class implementing the JackrabbitSecurityManager
interface
-->
<SecurityManager
class="org.apache.jackrabbit.core.DefaultSecurityManager"
workspaceName="default">
<!--
workspace access:
class: FQN of class implementing the WorkspaceAccessManager
interface
-->
<!-- <WorkspaceAccessManager class="..."/> -->
<!-- <param name="config" value="${rep.home}/security.xml"/> -->
</SecurityManager>
<!--
access manager:
class: FQN of class implementing the AccessManager interface
-->
<AccessManager
class="org.apache.jackrabbit.core.security.DefaultAccessManager">
<!-- <param name="config" value="${rep.home}/access.xml"/> -->
</AccessManager>
<LoginModule
class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
<!--
anonymous user name ('anonymous' is the default value)
-->
<param name="anonymousId" value="anonymous"/>
<!--
administrator user id (default value if param is missing is
'admin')
-->
<param name="adminId" value="admin"/>
</LoginModule>
</Security>
<!--
location of workspaces root directory and name of default workspace
-->
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
<!--
workspace configuration template:
used to create the initial workspace if there's no workspace yet
-->
<!-- <Workspace name="default">-->
<Workspace name="default">
<!--
virtual file system of the workspace:
class: FQN of class implementing the FileSystem interface
-->
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${wsp.home}"/>
</FileSystem>
<!--
persistence manager of the workspace:
class: FQN of class implementing the PersistenceManager interface
-->
<PersistenceManager
class="org.apache.jackrabbit.core.persistence.pool.MySqlPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url"
value="jdbc:mysql://${pm.database.url}:${pm.database.port}/${pm.database.prefix}product?createDatabaseIfNotExist=true"/>
<param name="user" value="${pm.database.user}"/>
<param name="password" value="${pm.database.pwd}"/>
<param name="schemaObjectPrefix" value="Product_"/>
<param name="schema" value="mysql"/>
</PersistenceManager>
<!--
Search index and the file system it uses.
class: FQN of class implementing the QueryHandler interface
-->
<SearchIndex
class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
<param name="path" value="${wsp.home}/index"/>
<!--<param name="textFilterClasses"
value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.extractor.MsWordTextExtractor,org.apache.jackrabbit.extractor.MsExcelTextExtractor,org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,org.apache.jackrabbit.extractor.PdfTextExtractor,org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,org.apache.jackrabbit.extractor.RTFTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor"/>
<param name="extractorPoolSize" value="2"/>
<param name="supportHighlighting" value="true"/> -->
</SearchIndex>
</Workspace>
<!--
Configures the versioning
-->
<Versioning rootPath="${rep.home}/version">
<!--
Configures the filesystem to use for versioning for the respective
persistence manager
-->
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/version"/>
</FileSystem>
<!--
Configures the persistence manager to be used for persisting
version state.
Please note that the current versioning implementation is based on
a 'normal' persistence manager, but this could change in future
implementations.
-->
<PersistenceManager
class="org.apache.jackrabbit.core.persistence.pool.MySqlPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url"
value="jdbc:mysql://${pm.database.url}:${pm.database.port}/${pm.database.prefix}truedit_versions?createDatabaseIfNotExist=true"/>
<param name="user" value="${pm.database.user}"/>
<param name="password" value="${pm.database.pwd}"/>
<param name="schemaObjectPrefix" value="version_"/>
<param name="schema" value="mysql"/>
</PersistenceManager>
</Versioning>
<!--
Configures the Data Store for large binary objects.
-->
<DataStore class="org.apache.jackrabbit.core.data.FileDataStore">
<param name="path" value="${datastore.location.path}"/>
<param name="minRecordLength" value="100"/>
</DataStore>
<!--
<Cluster id="${cluster.id}" syncDelay="2000">
<Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal">
<param name="driver" value="com.mysql.jdbc.Driver" />
<param name="url"
value="jdbc:mysql://${pm.database.url}:${pm.database.port}/${pm.database.prefix}journal?autoReconnect=true&createDatabaseIfNotExist=true"/>
<param name="schemaObjectPrefix" value="journal_"/>
<param name="databaseType" value="mysql"/>
<param name="user" value="${pm.database.user}"/>
<param name="password" value="${pm.database.pwd}"/>
</Journal>
</Cluster>
-->
</Repository>
--
Morrell Jacobs
Chief Software Architect
MEI
610 Old York Road, Suite 250
Jenkintown, PA 19046
Phone: 215-886-5662, ext. 252
Fax: 215-886-5681
http://www.maned.com
E-mail: [email protected]
AOL IM: MorrellMEI
Have you seen Nervous Pixel, MEI's creative services division?
www.nervouspixel.com