• Bug
  • Status: Closed
  • 2 Major
  • Resolution: Fixed
  • ehcache-core
  • cschanck
  • Reporter: mads1980
  • July 25, 2013
  • 0
  • Watchers: 5
  • September 26, 2013
  • July 31, 2013

Attachments

Description

Currently each CacheManager creates a ScheduledExecutorService with Runtime.getRuntime().availableProcessors() threads. On a production server with 10 webapps, 4 CacheManagers each, and 16 processors, this translates to 640 threads, which is excessive, both because of task switching overhead and the Xss memory taken up by each thread.

The number of threads used for this purpose should be configurable.

private final ScheduledExecutorService statisticsExecutor = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory() { public Thread newThread(Runnable r) { Thread t = new Thread(r, “Statistics Thread”); t.setDaemon(true); return t; } });

Comments

Manuel Dominguez Sarmiento 2013-07-25

By the way, the guys at Liferay have found exactly the same problem. Apparently they must be overriding this using reflection:

See ehcache.cache.manager.statistics.thread.pool.size=1 https://github.com/liferay/liferay-portal/blob/master/portal-impl/src/portal.properties

#
# The Ehcache cache manager internally maintains a scheduled thread pool
# executor for statistics. The default size of tthe scheduled thread pool
# executor is set to the number of CPUs. This is too heavy for a server with
# a lot of processors. Set this property to reduce the scheduled thread pool
# size.
#
ehcache.cache.manager.statistics.thread.pool.size=1

Manuel Dominguez Sarmiento 2013-07-26

In case anyone else runs into this while using Spring’s EhCacheManagerFactoryBean, we’ve created the attached extension class to work around this issue.

Manuel Dominguez Sarmiento 2013-07-26

I have uploaded an updated CustomEhCacheManagerFactoryBean to resolve a thread leak issue with the previous version.

Chris Schanck 2013-07-31

After much discussion, we set the default size of the statistics thread pool down to 1 thread; it is possible statistics gathering performance might lag if many caches are having stats recorded at the same time, but we shall see. In local testing it made no discernible difference.

Yakov Feldman 2013-08-16

Verified.