[infinispan-issues] [JBoss JIRA] (ISPN-1808) FileCacheStore performance issues
Manik Surtani (JIRA)
jira-events at lists.jboss.org
Sat Jan 28 18:18:48 EST 2012
[ https://issues.jboss.org/browse/ISPN-1808?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Manik Surtani updated ISPN-1808:
--------------------------------
Summary: FileCacheStore performance issues (was: Make InfiniSpan passivation faster)
> FileCacheStore performance issues
> ---------------------------------
>
> Key: ISPN-1808
> URL: https://issues.jboss.org/browse/ISPN-1808
> Project: Infinispan
> Issue Type: Enhancement
> Components: Loaders and Stores, Marshalling
> Affects Versions: 5.1.0.CR4, 5.1.0.FINAL
> Reporter: Johann Burkard
> Assignee: Manik Surtani
> Labels: marshalling, passivation, performance, serialization
> Fix For: 5.1.1.CR1, 5.1.1.FINAL
>
>
> While InfiniSpan is very fast in-memory, once passivation is turned on, things get slow for me.
> On my i5-2400 with a Crucial C300 SSD, it takes about 11 ms to passivate a 2964 B value. This comes down to a write speed of 250 to 300 KB/s. The disk can write up to 180 MB/s so it's not the bottleneck.
> Clearly, passivation should be faster than that.
> Profiling with YourKit shows most of the hot spots are centered around {{FileCacheStore}}, the JBoss Marshalling library and various bucket and {{ImmortalCacheEntry}} methods. Locking also seems to play a role. Here's a screenshot:
> !http://i.imgur.com/LzkPw.png!
> To make profiling easier for you, I've taken my test case and turned it into a small Maven project. Simply running {{mvn install}} should run the test, ready for profiling.
> Of course, it could also be that my configuration is suboptimal. However, in my experiments, many configurations were unusable (hitting the file handle limit), which is not a good thing.
> The project is available at http://johannburkard.de/resources/Johann/infinispan-performance.zip
> I've also found one or two other things I think are more costly than they would need to be
> In {{FileCacheStore}}
> {code}
> byte[] buffer = new byte[streamBufferSize];
> ...
> fileInStream = new FileInputStream(file);
> ...
> bis = new BufferedInputStream(fileInStream);
> ...
> bytesRead = bis.read(buffer, 0, streamBufferSize);
> {code}
> wrapping the {{FileInputStream}} in a {{BufferedInputStream}} is unnecessary because you already have a buffer in {{byte[] buffer}}. I think I have seen this before in InfiniSpan, so you might want to check for occurrences of {{BufferedInputStream}} or {{BufferedOutputStream}}.
> Another one
> {code}
> if (bytes.length == 0) {
> // Short circuit
> if (f.exists()) f.delete();
> return;
> }
> {code}
> {{f.exists()}} is essentially a syscall. Just calling {{f.delete()}} is enough.
> {code}
> if (!root.exists()) {
> if (!root.mkdirs()) {
> log.problemsCreatingDirectory(root);
> }
> }
> if (!root.exists()) {
> throw new ConfigurationException("Directory " + root.getAbsolutePath() + " does not exist and cannot be created!");
> }
> {code}
> This could also be shortened to
> {code}
> if (!root.mkdirs()) {
> throw new ConfigurationException("Directory " + root.getAbsolutePath() + " does not exist and cannot be created!");
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the infinispan-issues
mailing list