簡體   English   中英

為什么Apache Ignite sys-thread會消耗大量內存?

[英]Why Apache Ignite sys-thread consumes so much memory?

環境信息:我的集群中有兩個Linux機器(8U 16G 64位)節點。 並且啟用了Ignite本機持久性。 offHeap的內存為3.2G Ignite版本為2.6.0。

用法信息:集群中有三個緩存,只有一個備份。 總計約100,000條記錄。 重新平衡線程數為1。

我的問題:當我重復執行sql“ select *”時,出現錯誤“內存不足”。 我用MAT分析了轉儲文件,發現一個線程消耗了太多內存。 然后,我分析了線程堆棧,並發現在ignite方法org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.rebalanceIterator中,創建了treeMap,其成本接近7G內存 有人可以幫助我解決內存不足的問題嗎?

 JVM options: -server -XX:MaxDirectMemorySize=512m -Xms10g -Xmx10g -XX:+AlwaysPreTouch -XX:+UseG1GC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:+DisableExplicitGC -XX:+UseNUMA -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1PrintRegionLivenessInfo -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:G1ReservePercent=15 -XX:InitiatingHeapOccupancyPercent=45 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError 

 |Name | Shallow Heap | Retained Heap |Context Class Loader |Is Daemon ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- org.apache.ignite.thread.IgniteThread @ 0x5a0d32f20 |sys-#86%paloma2[172.17.0.1#192.154.163.17]%| 136 | 7,234,644,440 |org.springframework.boot.loader.LaunchedURLClassLoader @ 0x5a0ba53b8|false |- at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.IgniteNativeIoLib.pread(ILcom/sun/jna/Pointer;Lcom/sun/jna/NativeLong;Lcom/sun/jna/NativeLong;)Lcom/sun/jna/NativeLong; (Native Method) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.AlignedBuffersDirectFileIO.readIntoAlignedBuffer(Ljava/nio/ByteBuffer;J)I (AlignedBuffersDirectFileIO.java:347) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.AlignedBuffersDirectFileIO.read(Ljava/nio/ByteBuffer;J)I (AlignedBuffersDirectFileIO.java:215) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStore.read(JLjava/nio/ByteBuffer;Z)V (FilePageStore.java:351) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.read(IJLjava/nio/ByteBuffer;Z)V (FilePageStoreManager.java:328) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.read(IJLjava/nio/ByteBuffer;)V (FilePageStoreManager.java:312) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.acquirePage(IJZ)J (PageMemoryImpl.java:779) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.acquirePage(IJ)J (PageMemoryImpl.java:624) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter.initFromLink(Lorg/apache/ignite/internal/processors/cache/CacheGroupContext;Lorg/apache/ignite/internal/processors/cache/GridCacheSharedContext;Lorg/apache/ignite/internal/pagemem/PageMemory;Lorg/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter$RowData;)V (CacheDataRowAdapter.java:140)| | | | | |- at org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter.initFromLink(Lorg/apache/ignite/internal/processors/cache/CacheGroupContext;Lorg/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter$RowData;)V (CacheDataRowAdapter.java:102) | | | | | |- at org.apache.ignite.internal.processors.cache.tree.DataRow.<init>(Lorg/apache/ignite/internal/processors/cache/CacheGroupContext;IJILorg/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter$RowData;)V (DataRow.java:54) | | | | | |- at org.apache.ignite.internal.processors.cache.tree.CacheDataRowStore.dataRow(IIJLorg/apache/ignite/internal/processors/cache/persistence/CacheDataRowAdapter$RowData;)Lorg/apache/ignite/internal/processors/cache/persistence/CacheDataRow; (CacheDataRowStore.java:73) | | | | | |- at org.apache.ignite.internal.processors.cache.tree.CacheDataTree.getRow(Lorg/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusIO;JILjava/lang/Object;)Lorg/apache/ignite/internal/processors/cache/persistence/CacheDataRow; (CacheDataTree.java:146) | | | | | |- at org.apache.ignite.internal.processors.cache.tree.CacheDataTree.getRow(Lorg/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusIO;JILjava/lang/Object;)Ljava/lang/Object; (CacheDataTree.java:41) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.fillFromBuffer(JLorg/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusIO;II)Z (BPlusTree.java:4660) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.init(JLorg/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusIO;I)V (BPlusTree.java:4562) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.access$5300(Lorg/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree$ForwardCursor;JLorg/apache/ignite/internal/processors/cache/persistence/tree/io/BPlusIO;I)V (BPlusTree.java:4501) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.findLowerUnbounded(Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/ignite/internal/util/lang/GridCursor; (BPlusTree.java:927) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.find(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/ignite/internal/util/lang/GridCursor; (BPlusTree.java:959) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.find(Ljava/lang/Object;Ljava/lang/Object;)Lorg/apache/ignite/internal/util/lang/GridCursor; (BPlusTree.java:950) | | | | | |- at org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl$CacheDataStoreImpl.cursor()Lorg/apache/ignite/internal/util/lang/GridCursor; (IgniteCacheOffheapManagerImpl.java:1483) | | | | | |- at org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager$GridCacheDataStore.cursor()Lorg/apache/ignite/internal/util/lang/GridCursor; (GridCacheOffheapManager.java:1555) | | | | | |- at org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.reservedIterator(ILorg/apache/ignite/internal/processors/affinity/AffinityTopologyVersion;)Lorg/apache/ignite/internal/util/lang/GridCloseableIterator; (IgniteCacheOffheapManagerImpl.java:839) | | | | | |- at org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.rebalanceIterator(Lorg/apache/ignite/internal/processors/cache/distributed/dht/preloader/IgniteDhtDemandedPartitionsMap;Lorg/apache/ignite/internal/processors/affinity/AffinityTopologyVersion;)Lorg/apache/ignite/internal/processors/cache/IgniteRebalanceIterator; (IgniteCacheOffheapManagerImpl.java:882) | | | | | | |- <local> org.apache.ignite.internal.processors.cache.persistence.GridCacheOffheapManager @ 0x5a0d33368 | | 64 | 1,648 | | | |- <local> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.IgniteDhtDemandedPartitionsMap @ 0x5a0d33408 | | 24 | 24 | | | |- <local> org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion @ 0x5a0d33420 | | 24 | 24 | | | |- <local>java.util.TreeMap @ 0x5a0d33438 | | 48 | 7,227,513,912 | | | |- <local> java.util.HashSet @ 0x5a0d33468 | | 16 | 64 | | | |- <local> java.util.Collections$UnmodifiableCollection$1 @ 0x5a0d33478 | | 24 | 80 | | | |- <local> java.lang.Integer @ 0x5ad5cd658 354 | | 16 | 16 | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

線索:使用以下代碼創建treeMap

  /** {@inheritDoc} */ @Override public IgniteRebalanceIterator rebalanceIterator(IgniteDhtDemandedPartitionsMap parts, final AffinityTopologyVersion topVer) throws IgniteCheckedException { final TreeMap<Integer, GridCloseableIterator<CacheDataRow>> iterators = new TreeMap<>(); Set<Integer> missing = new HashSet<>(); for (Integer p : parts.fullSet()) { GridCloseableIterator<CacheDataRow> partIter = reservedIterator(p, topVer); if (partIter == null) { missing.add(p); continue; } iterators.put(p, partIter); } IgniteHistoricalIterator historicalIterator = historicalIterator(parts.historicalMap(), missing); IgniteRebalanceIterator iter = new IgniteRebalanceIteratorImpl(iterators, historicalIterator); for (Integer p : missing) iter.setPartitionMissing(p); return iter; } 

似乎在集群中重新平衡並select *查詢並發運行。

重新平衡是一個過程,它在節點之間移動分區以實現配置的備份因子。 所有重新平衡的數據都通過堆,因此在此過程中可能會被污染。 您可以在此處閱讀有關內容: https : //apacheignite.readme.io/docs/rebalancing

IgniteCache#rebalance()方法返回的日志中的相應消息或等待將來的相應消息可以跟蹤重新平衡

select *也是一項非常耗時的操作,因為它需要將所有數據加載到單個節點上。

在這種情況下,使用惰性查詢可能會有所幫助。 您可以在JDBC連接字符串中或作為SqlFieldQuery#lazy屬性啟用此標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM