2017-05-21 6 views
0

Wir haben App mit ehcache 2.9.0. In letzter Zeit haben wir einmal wöchentlich Deadlocks im Zusammenhang mit ehcache get/put-Operationen beobachtet, und sobald wir den Cache geleert haben, verschwindet das Problem.Ehcache Deadlock in ehcache 2.9.0

beobachten wir die Sperre auf der RandomAccessFile während Cache-Operation und ReentrantReadWriteLock während Put-Operation.

Fordern Sie Einblick von Ehcache-Experten, was könnte möglich Problem sein?

PFB die Fäden aus dem Faden-Dumps

"HTTP938" # 25950 Daemon PRIO = 5 os_prio = 0 tid = 0x0000000002614000 NID = 0x5a64 der Bedingung wartet [0x00007fcd36965000] java.lang.Thread.State: WAITING (Parken) bei sun.misc.Unsafe.park (Mutter Methode) - Parkplatz warten < 0x00000005cbbc6768> (ein java.util.concurrent.locks.ReentrantReadWriteLock $ NonfairSync) bei java.util.concurrent.locks.LockSupport. park (LockSupport.java:175) bei java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt (AbstractQueuedSynchronizer.java:836) bei j ava.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared (AbstractQueuedSynchronizer.java:967) bei java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared (AbstractQueuedSynchronizer.java:1283) bei java.util.concurrent.locks.ReentrantReadWriteLock $ ReadLock.lock (ReentrantReadWriteLock.java:727) unter net.sf.ehcache.store.disk.Segment.flush (Segment.java:1010) at net.sf.ehcache.store.disk.DiskStore.flush (DiskStore. java: 248) bei net.sf.ehcache.store.CacheStore $ 1.evicted (CacheStore.java:99) bei net.sf.ehcache.store.CacheStore $ 1.evicted (CacheStore.java:96) at net. sf.ehcache.store.cachtingtier.OnHeachCachingTier $ 1.evicted (OnHeapCachingTier.java:86) bei net.sf.ehcache.store.cachtingtier.CountBasedBackEnd $ 1.removed (CountBase dBackEnd.java:103) bei net.sf.ehcache.util.concurrent.ConcurrentHashMap.internalReplace (ConcurrentHashMap.java:1346) at net.sf.ehcache.util.concurrent.ConcurrentHashMap.removeAndNotify (ConcurrentHashMap.java:2647) bei net.sf.ehcache.store.cachingtier.CountBasedBackEnd.remove (CountBasedBackEnd.java:115) bei net.sf.ehcache.store.cachingtier.OnHeapCachingTier.remove (OnHeapCachingTier.java:206) bei net.sf. ehcache.store.CacheStore.put (CacheStore.java:134) unter net.sf.ehcache.Cache.putInternal (Cache.java: 1600) at net.sf.ehcache.Cache.put (Cache.java:1526) bei net.sf.ehcache.Cache.put (Cache.java:1491) bei org.springframework.cache.ehcache.EhCacheCache.put (EhCacheCache.java: 82) an org.springframework.cache.interceptor.AbstractCacheInvoker.doPut (AbstractCacheInvoker.java:82) bei org.springframework.cache.interceptor.CacheAspectSupport $ CachePutRequest.apply (CacheAspectSupport.java:651) bei org.springframework.cache.interceptor .CacheAspectSupport.execute (CacheAspectSupport.java:358) bei org.springframework.cache.interceptor.CacheAspectSupport.execute (CacheAspectSupport.java:299) bei org.springframework.cache.interceptor.CacheInterceptor.invoke (CacheInterceptor.java:61) bei org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) bei org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:653)

"HTTP927" # 25855 Daemon prio = 5 os_prior = 0 tid = 0x00007fce685c9000 nid = 0x4fb6 wartet auf den Monitoreintrag [0x00007fcd359e8000] java.lang.Thread.Zustand: GESPERRT (auf Objekt-Monitor) bei net.sf.ehcache.store.disk.DiskStorageFactory.read (DiskStorageFactory.java:362) - Warte < 0x00000005cbdfb538> (a java.io.RandomAccessFile) im Netz zu sperren. sf.ehcache.store.disk.DiskStorageFactory.retrieve (DiskStorageFactory.java:864) unter net.sf.ehcache.store.disk.Segment.decode (Segment.java:171) unter net.sf.ehcache.store. disk.Segment.remove (Segment.java:644) unter net.sf.ehcache.store.disk.DiskStore.remove (DiskStore.java:625) unter net.sf.ehcache.store.CacheStore.remove (CacheStore. java: 236) bei net.sf.ehcache.Cache.removeInternal (Cache.java:2401) bei net.sf.ehcache.Cache.tryRemoveImmediately (Cache.java:2162) bei net.sf.ehcache.Cache.get (Cache.java:1739) bei org.springframework.cache.ehcache.EhCacheCache.get (EhCacheCache.java:65) bei org.springframework.cache.interceptor.AbstractCacheInvoker.doGet (AbstractCacheInvoker.java:68) bei org.springframework.cache.interceptor.CacheAspectSupport.findInCaches (CacheAspectSupport.java:461) bei org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem (CacheAspectSupport.java:432) bei org. springframework.cache.interceptor.CacheAspectSupport.execute (CacheAspectSupport.java:333) bei org.springframework.cache.interceptor.CacheAspectSupport.execute (CacheAspectSupport.java:299) bei org.springframework.cache.interceptor.CacheInterceptor.invoke (CacheInterceptor.java:61) bei org.springframework.aop.fr amework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) bei org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:653)

Thema HTTP762 Owns Monitor Lock auf 0x00000005cbdfb538 auf Java. io.RandomAccessFile.readFully (RandomAccessFile.java:416) - gesperrt [0x00000005cbdfb538] (a java.io.RandomAccessFile) bei org.springframework.cache.ehcache.EhCacheCache.put (EhCacheCache.java:82) Danke, Nivedita

Antwort

0

Ich könnte etwas verpassen, aber ich sehe keinen Stillstand in der th lese dump du zeigst. Nur zwei Fäden warten auf verschiedene Dinge, aber nicht auf den anderen Faden.

Die ersten Versuche mussten einen Wert auf einen Put räumen.

Die zweite Thread-Nachricht ein Eintrag ist abgelaufen und wird aus dem Plattenspeicher entfernt.

Sind Sie sicher, dass die Festplatte aufgrund der Festplatte oder der Struktur der Daten im Cache nicht langsamer wird?

Ich würde auch empfehlen, auf Version 2.10.4 zu verschieben, die das Problem verschwinden lassen könnte.

+0

Es gab 39 Threads warten auf Sperre durch den Cache erhalten. –

+0

Wird der Cache irgendwann fertig gestellt? Oder ist es das gleiche endlos? Wer sperrt 0x00000005cbdfb538? – Henri

+0

Ich finde die 0x00000005cbdfb538 ist gesperrt von Cache PUT –