当调用另一个缓存中的缓存移除时,Ignite服务挂起';“调用处理器”;条纹池中可能出现饥饿现象;?
点燃原木有饥饿警告并停止提供服务:当调用另一个缓存中的缓存移除时,Ignite服务挂起';“调用处理器”;条纹池中可能出现饥饿现象;?,ignite,Ignite,点燃原木有饥饿警告并停止提供服务: [12:55:22,080][WARNING][grid-timeout-worker-#71][G] >>> Possible starvation in striped pool. Thread name: sys-stripe-25-#26 Deadlock: false Completed: 16272032 Thread [name="sys-stripe-25-#26", id=51, state=WAIT
[12:55:22,080][WARNING][grid-timeout-worker-#71][G] >>> Possible starvation in striped pool.
Thread name: sys-stripe-25-#26
Deadlock: false
Completed: 16272032
Thread [name="sys-stripe-25-#26", id=51, state=WAITING, blockCnt=79, waitCnt=15616666]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
at o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:177)
at o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:140)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.remove0(GridDhtAtomicCache.java:716)
at o.a.i.i.processors.cache.GridCacheAdapter.remove(GridCacheAdapter.java:3084)
at o.a.i.i.processors.cache.GridCacheAdapter.remove(GridCacheAdapter.java:3065)
at o.a.i.i.processors.cache.IgniteCacheProxyImpl.remove(IgniteCacheProxyImpl.java:1131)
at o.a.i.i.processors.cache.GatewayProtectedCacheProxy.remove(GatewayProtectedCacheProxy.java:998)
at com.test.info.TestInfoBasicExecutor.handleCurrentLevel(TestInfoBasicExecutor.java:281)
at com.test.info.TestInfoBasicExecutor$infoEntryProcessor.process(TestInfoBasicExecutor.java:514)
at com.test.info.TestInfoBasicExecutor$infoEntryProcessor.process(TestInfoBasicExecutor.java:453)
at o.a.i.i.processors.cache.GridCacheMapEntry$AtomicCacheUpdateClosure.runEntryProcessor(GridCacheMapEntry.java:5142)
at o.a.i.i.processors.cache.GridCacheMapEntry$AtomicCacheUpdateClosure.call(GridCacheMapEntry.java:4550)
at o.a.i.i.processors.cache.GridCacheMapEntry$AtomicCacheUpdateClosure.call(GridCacheMapEntry.java:4367)
at o.a.i.i.processors.cache.persistence.tree.BPlusTree$Invoke.invokeClosure(BPlusTree.java:3051)
at o.a.i.i.processors.cache.persistence.tree.BPlusTree$Invoke.access$6200(BPlusTree.java:2945)
at o.a.i.i.processors.cache.persistence.tree.BPlusTree.invokeDown(BPlusTree.java:1717)
at o.a.i.i.processors.cache.persistence.tree.BPlusTree.invoke(BPlusTree.java:1600)
at o.a.i.i.processors.cache.IgniteCacheOffheapManagerImpl$CacheDataStoreImpl.invoke(IgniteCacheOffheapManagerImpl.java:1199)
at o.a.i.i.processors.cache.persistence.GridCacheOffheapManager$GridCacheDataStore.invoke(GridCacheOffheapManager.java:1357)
at o.a.i.i.processors.cache.IgniteCacheOffheapManagerImpl.invoke(IgniteCacheOffheapManagerImpl.java:345)
at o.a.i.i.processors.cache.GridCacheMapEntry.innerUpdate(GridCacheMapEntry.java:1767)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateSingle(GridDhtAtomicCache.java:2420)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.update(GridDhtAtomicCache.java:1883)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1736)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1628)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processNearAtomicUpdateRequest(GridDhtAtomicCache.java:3055)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$400(GridDhtAtomicCache.java:130)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:266)
at o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:261)
at o.a.i.i.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1060)
at o.a.i.i.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:579)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:378)
at o.a.i.i.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:304)
at o.a.i.i.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:99)
at o.a.i.i.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:293)
at o.a.i.i.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1555)
at o.a.i.i.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1183)
at o.a.i.i.managers.communication.GridIoManager.access$4200(GridIoManager.java:126)
at o.a.i.i.managers.communication.GridIoManager$9.run(GridIoManager.java:1090)
at o.a.i.i.util.StripedExecutor$Stripe.run(StripedExecutor.java:505)
at java.lang.Thread.run(Thread.java:745)
我使用invoke更新缓存A,在缓存A的etnryprocessor中,
我知道处理器已经被锁调用了,我只是在为另一个缓存库更新这个条目,
我已经检查了缓存A的值,并根据该值在测试中更新缓存B条目,即放置或删除,
put正常,但对于remove,似乎remove cause服务挂起:
at com.test.info.TestInfoBasicExecutor.handleCurrentLevel(TestInfoBasicExecutor.java:281)
at com.test.info.TestInfoBasicExecutor$infoEntryProcessor.process(TestInfoBasicExecutor.java:514)
at com.test.info.TestInfoBasicExecutor$infoEntryProcessor.process(TestInfoBasicExecutor.java:453)
======================================================
更新0702:
为了防止饥饿,我更改了代码:
在点火服务A的执行功能中:
cacheA.invoke(记录){
//做记录的过程
igniteQueue.put(已处理的_记录)
}
在点火服务B的执行功能中:
保存的_处理的_记录=igniteQueue.take()
=================
我试着用这种方法来防止饥饿,它运行平稳时
旧代码有饥饿(TPS很低),但当我运行高TPS时,
“条纹池中可能的饥饿”又回来了
似乎我在cache.invoke中使用了igniteQueue,这与cache.invoke中以前的缓存相比也是不正确的
当我想对缓存中的每条记录进行处理,然后根据处理后的记录更新其他缓存时,似乎不可能?用于处理Ignite消息的条带化池。看起来由于某种原因,此池中的所有线程都在等待某个操作(从日志中的缓存中删除)。这可能与网络问题有关,或者删除需要花费大量时间(例如,您要删除所有数据)
请附加线程转储和测试代码以进行调查,好吗?用于处理Ignite消息的条带化池。看起来由于某种原因,此池中的所有线程都在等待某个操作(从日志中的缓存中删除)。这可能与网络问题有关,或者删除需要花费大量时间(例如,您要删除所有数据)
请附加线程转储和测试代码以进行调查,好吗?您应该避免在条目处理器中执行缓存操作,即使这些操作属于其他缓存。原因是所有这些操作将使用相同的线程池-这可能会导致饥饿。您应该避免在条目处理器中执行缓存操作,即使这些操作属于其他缓存。原因是所有这些操作都将使用相同的线程池-这可能会导致饥饿。我有3个线程池和5个客户端,客户端从客户端获取缓存信息,我不知道这个问题是否与太多客户端有关,无法检索同一缓存,对于回溯,服务器无法转储,如果出现错误,因此,我只是转储客户端的线程回溯,并将其粘贴到这里:我有3个客户端和5个客户端,客户端从客户端获取缓存信息,我不知道这个问题是否与太多客户端相关,无法检索同一缓存,对于回溯,服务器无法转储它,因此我只是转储客户端的线程回溯,然后粘贴到这里:谢谢你的回答,有没有关于如何进行这种更新的建议a缓存的条目,在另一个缓存的条目上,我尝试在我的帖子中将更新更改为缓存B,以将条目记录到另一个ignite队列,并启动一个服务使用take()检查队列方法并以此为基础来更新ignite缓存B,目前它还可以工作,但我想知道这种方法是否可以避免线程饥饿?您能否澄清这里“依赖”的含义?你想要什么样的一致性/原子性保证?很抱歉反应太晚,我已经更新了我的帖子以使我的问题更清楚,请检查原始帖子中的更新--0702更新,谢谢。
IgniteQueue
使用引擎盖下的Ignite缓存,因此,条带化池中的可能饥饿的原因是相同的。谢谢你的回答,是否有任何关于如何进行这种更新的建议a缓存的条目将被删除,并且在另一个缓存的条目上,我已尝试在我的帖子中将更新更改为缓存B,以将条目记录到另一个ignite队列中,然后启动一个服务,用take()方法检查队列,并以此为基础更新ignite缓存B,现在它可以工作了,但我想知道这种方法是否可以避免线程饥饿?你能澄清一下这里的“依赖”是什么意思吗?你想要什么样的一致性/原子性保证?很抱歉反应太晚,我已经更新了我的帖子,以使我的问题更清楚,请检查原始帖子中的更新--0702更新,谢谢。IgniteQueue
在引擎盖下使用Ignite缓存,因此条带池中可能饥饿的原因是相同的。