Aleksey Plekhanov created IGNITE-14341:
------------------------------------------
Summary: Significant performance drop when entries expiring
concurrently
Key: IGNITE-14341
URL: https://issues.apache.org/jira/browse/IGNITE-14341
Project: Ignite
Issue Type: Bug
Reporter: Aleksey Plekhanov
Currently, there is a significant performance drop when expired entries
concurrently evicted by threads that perform some actions with cache (see
attached reproducer):
{noformat}
Benchmark Mode Cnt Score Error Units
JmhCacheExpireBenchmark.putWithExpire thrpt 3 100,132 ± 21,025 ops/ms
JmhCacheExpireBenchmark.putWithoutExpire thrpt 3 2133,122 ± 559,694
ops/ms{noformat}
Root cause: pending entries tree (offheap BPlusTree) is used to track expired
entries, after each cache operation (and by timeout thread) there is an attempt
to evict some amount of expired entries. these entries looked up from the start
of the pending entries tree and there is a contention on the first leaf page of
that tree.
All threads waiting for the same page lock:
{noformat}
at
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at
org.apache.ignite.internal.util.OffheapReadWriteLock.waitAcquireWriteLock(OffheapReadWriteLock.java:503)
at
org.apache.ignite.internal.util.OffheapReadWriteLock.writeLock(OffheapReadWriteLock.java:244)
at
org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl.writeLock(PageMemoryNoStoreImpl.java:528)
at
org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler.writeLock(PageHandler.java:422)
at
org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler.writePage(PageHandler.java:350)
at
org.apache.ignite.internal.processors.cache.persistence.DataStructure.write(DataStructure.java:325)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.access$13200(BPlusTree.java:100)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Remove.doRemoveFromLeaf(BPlusTree.java:4588)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Remove.removeFromLeaf(BPlusTree.java:4567)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Remove.tryRemoveFromLeaf(BPlusTree.java:5196)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Remove.access$6800(BPlusTree.java:4209)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.removeDown(BPlusTree.java:2189)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.removeDown(BPlusTree.java:2165)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.removeDown(BPlusTree.java:2165)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.doRemove(BPlusTree.java:2076)
at
org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.removex(BPlusTree.java:1905)
at
org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.expireInternal(IgniteCacheOffheapManagerImpl.java:1426)
at
org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.expire(IgniteCacheOffheapManagerImpl.java:1375)
at
org.apache.ignite.internal.processors.cache.GridCacheTtlManager.expire(GridCacheTtlManager.java:246)
at
org.apache.ignite.internal.processors.cache.GridCacheUtils.unwindEvicts(GridCacheUtils.java:882){noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)