Not throttling, but : «Thread dump is hidden due to throttling settings» There are huge documentation about persistence tuning in apache ignite.
>Hi, >Throttling is disabled in ignite config as mentioned in prev reply. What do >you suggest to make ignite catchup with SSD limits on checkpointing. >On Mon, 12 Sept 2022, 11:32 Zhenya Stanilovsky via user, < >user@ignite.apache.org > wrote: >> >> >> >> >>>We have observed one interesting issue with checkpointing. We are using 64G >>>RAM 12 CPU with 3K iops/128mbps SSDs. Our application fills up the WAL >>>directory really fast and hence the RAM. We made the following observations >>> >>>0. Not so bad news first, it resumes processing after getting stuck for >>>several minutes. >>> >>>1. WAL and WAL Archive writes are a lot faster than writes to the work >>>directory through checkpointing. Very curious to know why this is the case. >>>checkpointing writes never exceeds 15 mbps while wal and wal archive go >>>really high upto max limits of ssd >> >>Very simple example : sequential changing of 1 key, so in wal you obtain all >>changes and in (in your terms — checkpointing) only one key change. >> >>> >>>2. We observed that when offheap memory usage tend to zero , checkpointing >>>takes minutes to complete , sometimes 30+ minutes which stalls the >>>application writes completely on all nodes. It means the whole cluster >>>freezes. >> >>Seems ignite enables throttling in such a case, you need some system and >>cluster tuning. >> >>> >>>3. Checkpointing thread get stuck at checkpointing page futures.get and >>>after several minutes, it logs this error and grid resumes processing >>> >>>"sys-stripe-0-#1" #19 prio=5 os_prio=0 cpu=86537.69ms elapsed=2166.63s >>>tid=0x00007fa52a6f1000 nid=0x3b waiting on condition [0x00007fa4c58be000] >>> java.lang.Thread.State: WAITING (parking) >>>at jdk.internal.misc.Unsafe.park( java.base@11.0.14.1/Native Method) >>>at java.util.concurrent.locks.LockSupport.park( java.base@11.0.14.1/Unknown >>>Source) >>>at >>>org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178) >>>at >>>org.apache.ignite.internal.util.future.GridFutureAdapter.getUninterruptibly(GridFutureAdapter.java:146) >>>at >>>org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointTimeoutLock.checkpointReadLock(CheckpointTimeoutLock.java:144) >>>at >>>org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.checkpointReadLock(GridCacheDatabaseSharedManager.java:1613) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processDhtAtomicUpdateRequest(GridDhtAtomicCache.java:3313) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$600(GridDhtAtomicCache.java:143) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$7.apply(GridDhtAtomicCache.java:322) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$7.apply(GridDhtAtomicCache.java:317) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1151) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:592) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:393) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:319) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:110) >>>at >>>org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:309) >>>at >>>org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1908) >>>at >>>org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1529) >>>at >>>org.apache.ignite.internal.managers.communication.GridIoManager.access$5300(GridIoManager.java:242) >>>at >>>org.apache.ignite.internal.managers.communication.GridIoManager$9.execute(GridIoManager.java:1422) >>>at >>>org.apache.ignite.internal.managers.communication.TraceRunnable.run(TraceRunnable.java:55) >>>at >>>org.apache.ignite.internal.util.StripedExecutor$Stripe.body(StripedExecutor.java:569) >>>at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120) >>>at java.lang.Thread.run( java.base@11.0.14.1/Unknown Source) >>>CheckpointProgress pages = checkpointer.scheduleCheckpoint(0, "too many >>>dirty pages"); >>>checkpointReadWriteLock.readUnlock(); >>> >>>if (timeout > 0 && U.currentTimeMillis() - start >= timeout) >>> failCheckpointReadLock(); >>> >>>try { >>> pages >>> .futureFor(LOCK_RELEASED) >>> .getUninterruptibly(); >>>} >>> >>> [2022-09-09 18:58:35,148][ERROR][sys-stripe-9-#10][CheckpointTimeoutLock] >>> Checkpoint read lock acquisition has been timed out. >>>class >>>org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointTimeoutLock$CheckpointReadLockTimeoutException: >>> Checkpoint read lock acquisition has been timed out. >>>at >>>org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointTimeoutLock.failCheckpointReadLock(CheckpointTimeoutLock.java:210) >>>at >>>org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointTimeoutLock.checkpointReadLock(CheckpointTimeoutLock.java:108) >>>at >>>org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.checkpointReadLock(GridCacheDatabaseSharedManager.java:1613) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processDhtAtomicUpdateRequest(GridDhtAtomicCache.java:3313) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$600(GridDhtAtomicCache.java:143) >>>at >>>org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$7.apply(GridDhtAtomicCache.java:322) >>>[2022-09-09 18:58:35,148][INFO ][sys-stripe-7-#8][FailureProcessor] Thread >>>dump is hidden due to throttling settings. Set >>>IGNITE_DUMP_THREADS_ON_FAILURE_THROTTLING_TIMEOUT property to 0 to see all >>>thread dumps. >>> >>> >>>4. Other nodes printy below logs during the window problematic node is stuck >>>at checkpointing >>> >>>[2022-09-09 18:58:35,153][WARN ][push-metrics-exporter-#80][G] >>> Possible >>>starvation in striped pool. >>> Thread name: sys-stripe-5-#6 >>> Queue: >>>[o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredUpdateTimeout@eb9f832, >>> Message closure [msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, >>>ordered=false, timeout=0, skipOnTimeout=false, >>>msg=GridDhtAtomicDeferredUpdateResponse [futIds=GridLongList [idx=1, >>>arr=[351148]]]]], Message closure [msg=GridIoMessage [plc=2, >>>topic=TOPIC_CACHE, topicOrd=8, ordered=false, timeout=0, >>>skipOnTimeout=false, msg=GridDhtAtomicDeferredUpdateResponse >>>[futIds=GridLongList [idx=2, arr=[273841,273843]]]]], Message closure >>>[msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, ordered=false, >>>timeout=0, skipOnTimeout=false, msg=GridNearSingleGetRequest >>>[futId=1662749921887, key=BinaryObjectImpl [arr= true, ctx=false, start=0], >>>flags=1, topVer=AffinityTopologyVersion [topVer=14, minorTopVer=0], >>>subjId=12746da1-ac0d-4ba1-933e-5aa3f92d2f68, taskNameHash=0, createTtl=-1, >>>accessTtl=-1, txLbl=null, mvccSnapshot=null]]], Message closure >>>[msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, ordered=false, >>>timeout=0, skipOnTimeout=false, msg=GridDhtAtomicDeferredUpdateResponse >>>[futIds=GridLongList [idx=1, arr=[351149]]]]], >>>o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredUpdateTimeout@110ec0fa, >>> Message closure [msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, >>>ordered=false, timeout=0, skipOnTimeout=false, >>>msg=GridDhtAtomicDeferredUpdateResponse [futIds=GridLongList [idx=10, >>>arr=[414638,414655,414658,414661,414662,414663,414666,414668,414673,414678]]]]], >>> >>>o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredUpdateTimeout@63ae8204, >>> >>>o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredUpdateTimeout@2d3cc0b, >>> Message closure [msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, >>>ordered=false, timeout=0, skipOnTimeout=false, >>>msg=GridDhtAtomicDeferredUpdateResponse [futIds=GridLongList [idx=1, >>>arr=[414667]]]]], Message closure [msg=GridIoMessage [plc=2, >>>topic=TOPIC_CACHE, topicOrd=8, ordered=false, timeout=0, >>>skipOnTimeout=false, msg=GridDhtAtomicDeferredUpdateResponse >>>[futIds=GridLongList [idx=4, arr=[351159,351162,351163,351164]]]]], Message >>>closure [msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, >>>ordered=false, timeout=0, skipOnTimeout=false, >>>msg=GridDhtAtomicDeferredUpdateResponse [futIds=GridLongList [idx=1, >>>arr=[290762]]]]], Message closure [msg=GridIoMessage [plc=2, >>>topic=TOPIC_CACHE, topicOrd=8, ordered=false, timeout=0, >>>skipOnTimeout=false, msg=GridDhtAtomicDeferredUpdateResponse >>>[futIds=GridLongList [idx=1, arr=[400357]]]]], >>>o.a.i.i.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredUpdateTimeout@71887193, >>> Message closure [msg=GridIoMessage [plc=2, topic=TOPIC_CACHE, topicOrd=8, >>>ordered=false, timeout=0, skipOnTimeout=false, >>>msg=GridDhtAtomicSingleUpdateRequest [key=BinaryObjectImpl [arr= true, >>>ctx=false, start=0], val=BinaryObjectImpl [arr= true, ctx=false, start=0], >>>prevVal=null, super=GridDhtAtomicAbstractUpdateRequest [onRes=false, >>>nearNodeId=null, nearFutId=0, flags=]]]], Message closure [msg=GridIoMessage >>>[plc=2, topic=TOPIC_CACHE, topicOrd=8, ordered=false, timeout=0, >>>skipOnTimeout=false, msg=GridNearAtomicSingleUpdateRequest >>>[key=BinaryObjectImpl [arr= true, ctx=false, start=0], >>>parent=GridNearAtomicAbstractSingleUpdateRequest [nodeId=null, >>>futId=1324019, topVer=AffinityTopologyVersion [topVer=14, minorTopVer=0], >>>parent=GridNearAtomicAbstractUpdateRequest [res=null, flags=]]]]]] >>> Deadlock: false >>> Completed: 205703 >>> >>>On Wed, Sep 7, 2022 at 4:25 PM Zhenya Stanilovsky via user < >>>user@ignite.apache.org > wrote: >>>>Ok, Raymond i understand. But seems no one have good answer here, it >>>>depends on appropriate fs and near (probably cloud) layer implementation. >>>>If you not observe «throttling» messages (described in prev link) seems >>>>it`s all ok, but of course you can benchmark your io by yourself with 3-rd >>>>party tool. >>>> >>>>>Thanks Zhenya. >>>>> >>>>>I have seen the link you provide has a lot of good information on this >>>>>system. But it does not talk about the check point writers in any detail. >>>>> >>>>>I appreciate this cannot be a bottleneck, my question is more related to: >>>>>"If I have more check pointing threads will check points take less time". >>>>>In our case we use AWS EFS so if each checkpoint thread is spending >>>>>relatively long times blocking on write I/O to the persistent store then >>>>>more check points allow more concurrent writes to take place. Of course, >>>>>if the check point threads themselves utilise async I/O tasks and >>>>>interleave I/O activities on that basis then there may not be an >>>>>opportunity for performance improvement, but I am not an expert in the >>>>>Ignite code base :) >>>>> >>>>>Raymond. >>>>> >>>>>On Wed, Sep 7, 2022 at 7:51 PM Zhenya Stanilovsky via user < >>>>>user@ignite.apache.org > wrote: >>>>>> >>>>>>No, there is no any log and metrics suggestions and as i told earlier — >>>>>>this place can`t became a bottleneck, if you have any performance >>>>>>problems — describe them somehow wider and interesting reading here [1] >>>>>> >>>>>>[1] >>>>>>https://cwiki.apache.org/confluence/display/IGNITE/Ignite+Persistent+Store+-+under+the+hood >>>>>> >>>>>>>Thanks Zhenya. >>>>>>> >>>>>>>Is there any logging or metrics that would indicate if there was value >>>>>>>increasing the size of this pool? >>>>>>> >>>>>>> >>>>>>>On Fri, 2 Sep 2022 at 8:20 PM, Zhenya Stanilovsky via user < >>>>>>>user@ignite.apache.org > wrote: >>>>>>>>Hi Raymond >>>>>>>> >>>>>>>>checkpoint threads is responsible for dumping modified pages, so you >>>>>>>>may consider it as io bound only operation and pool size is amount of >>>>>>>>disc writing workers. >>>>>>>>I think that default is enough and no need for raising it, but it also >>>>>>>>up to you. >>>>>>>> >>>>>>>>>Hi, >>>>>>>>> >>>>>>>>>I am looking at our configuration of the Ignite checkpointing system >>>>>>>>>to ensure we have it tuned correctly. >>>>>>>>> >>>>>>>>>There is a checkpointing thread pool defined, which defaults to 4 >>>>>>>>>threads in size. I have not been able to find much of a discussion on >>>>>>>>>when/how this pool size should be changed to reflect the node size >>>>>>>>>Ignite is running on. >>>>>>>>> >>>>>>>>>In our case, we are running 16 core servers with 128 GB RAM with >>>>>>>>>persistence on an NFS storage layer. >>>>>>>>> >>>>>>>>>Given the number of cores, and the relative latency of NFS compared to >>>>>>>>>local SSD, is 4 checkpointing threads appropriate, or are we likely to >>>>>>>>>see better performance if we increased it to 8 (or more)? >>>>>>>>> >>>>>>>>>If there is a discussion related to this a pointer to it would be good >>>>>>>>>(it's not really covered in the performance tuning section). >>>>>>>>> >>>>>>>>>Thanks, >>>>>>>>>Raymond. >>>>>>>>> -- >>>>>>>>> >>>>>>>>>Raymond Wilson >>>>>>>>>Trimble Distinguished Engineer, Civil Construction Software (CCS) >>>>>>>>>11 Birmingham Drive | Christchurch, New Zealand >>>>>>>>>raymond_wil...@trimble.com >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> >>>>>Raymond Wilson >>>>>Trimble Distinguished Engineer, Civil Construction Software (CCS) >>>>>11 Birmingham Drive | Christchurch, New Zealand >>>>>raymond_wil...@trimble.com >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >> >> >> >>