2 Replies Latest reply on Jul 11, 2007 10:09 AM by Jorge Morales

    Excesive number of Timers

    Jorge Morales Master

      Hi,
      I have JBC 1.4.1.SP3 in a JBossAS 4.2.0.
      Cache configuration is this:

      <?xml version="1.0" encoding="UTF-8"?>
      <server>
       <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
       <mbean code="org.jboss.cache.TreeCache"
       name="jboss.cache:service=ServicesCache">
       <depends>jboss:service=Naming</depends>
       <depends>jboss:service=TransactionManager</depends>
       <attribute name="TransactionManagerLookupClass">org.jboss.cache.JBossTransactionManagerLookup</attribute>
       <attribute name="IsolationLevel">NONE</attribute>
       <attribute name="CacheMode">REPL_SYNC</attribute>
       <attribute name="UseReplQueue">false</attribute>
       <attribute name="ReplQueueInterval">0</attribute>
       <attribute name="ReplQueueMaxElements">0</attribute>
       <attribute name="ClusterName">ServicesCache-Cluster</attribute>
       <attribute name="ClusterConfig">
       <config>
       .... jgroups config .....
       </config>
       </attribute>
       <attribute name="FetchInMemoryState">true</attribute>
       <attribute name="InitialStateRetrievalTimeout">15000</attribute>
       <attribute name="SyncReplTimeout">15000</attribute>
       <attribute name="LockAcquisitionTimeout">10000</attribute>
      
       <attribute name="EvictionPolicyClass">org.jboss.cache.eviction.LRUPolicy</attribute>
       <attribute name="EvictionPolicyConfig">
       <config>
       <attribute name="wakeUpIntervalSeconds">5</attribute>
       <region name="/_default_">
       <attribute name="maxNodes">500000</attribute>
       <attribute name="timeToLiveSeconds">86400</attribute>
       </region>
       </config>
       </attribute>
       <attribute name="UseRegionBasedMarshalling">true</attribute>
       <attribute name="InactiveOnStartup">true</attribute>
       </mbean>
      </server>
      


      Later, in our application, through code we set different eviction policies for different regions, in order to keep a rational cache size ratio.

      We do this to activate regions of the cache, as we deploy services that use these regions:
       public void activateRegion(String strFqn) {
       try {
       RegionManager regionManager = getServiceCacheInstance()
       .getRegionManager();
      
       if (regionManager.getRegion(strFqn) == null
       || !regionManager.getRegion(strFqn).isActive()) {
       getServiceCacheInstance().registerClassLoader(strFqn,
       Thread.currentThread().getContextClassLoader());
       getServiceCacheInstance().activateRegion(strFqn);
       log.warn("Activating synchronization of region " + strFqn);
       }
      
       } catch (RegionNameConflictException e) {
       log.error("Activating region: " + strFqn, e);
       } catch (CacheException e) {
       log.error("Activating region: " + strFqn, e);
       }
       }
      
      


      We also activate/deactivate different eviction policies for these regions. Like this:

       public void activateEvictionPolicy(String strRegion, EvictionConfiguration config) {
       if (strRegion != null || "".equals(strRegion)) {
       RegionManager regionMgr = getServiceCacheInstance().getEvictionRegionManager();
       Region region;
       EvictionPolicy eviction = null;
       try {
       if (regionMgr.hasRegion(strRegion)) {
       region = regionMgr.getRegion(strRegion);
       region.setEvictionConfiguration(config);
       log.warn("Region " + strRegion + " already had an eviction policy that has been updated now");
       } else {
       eviction.configure(getServiceCacheInstance());
       regionMgr.createRegion(strRegion, eviction, config);
       log.warn("Created new region " + strRegion);
       }
       log.warn("Setting "+ evictionPolicy.getType().toString()+ " eviction policy to region " + strRegion + ". Details: " + evictionPolicy);
       } catch (org.jboss.cache.eviction.RegionNameConflictException e) {
       throw new MyCacheRuntimeException(
       "Region name conflict for " + strRegion + ". Impossible to set an eviction policy.");
       }
       } else {
       log.error("There is not any eviction policy provided for region " + strRegion);
       }
       }
      
       }
      



      My problem is:

      The cache gets filled with about 2000 nodes, of 10 (key/value pairs) each, and for every node, I see there is a running Timer, which never gets discarded. At the end, my app fails being unable to create more threads.
      I know this can be a memory problem, but I have set 1Gb heap, 384K thead size, and have a machine with 8Gb addresable memory, so my problem seems related to the number of threads being created.
      For now, I only have one eviction policy set for one region, which holds the entire 2000 nodes, and I don understand why when a node gets evicted, or when most of them gets evicted, and node number drops to only 500, timers are over 2000.

      Thanks.