Почему системный поток Apache Ignite потребляет так много памяти?

Информация об окружающей среде : В моем кластере есть два узла Linux (8U 16G 64bit). И я включаю постоянное сохранение Ignite. Объем памяти для offHeap составляет 3,2 ГБ. Версия Ignite - 2.6.0.

Информация об использовании. В кластере три кэша и только одна резервная копия. Всего около 100 000 записей. Количество ниток перебалансировки - 1.

Мой вопрос:. Когда я выполняю sql "select *" несколько раз, возникает ошибка "недостаточно памяти". Я анализирую файл дампа с помощью MAT и обнаруживаю, что один поток потребляет очень много памяти. Затем я анализирую стек потока и обнаруживаю, что в методе ignite org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.rebalanceIterator было создано treeMap и стоило около 7 ГБ памяти! Может ли кто-нибудь помочь мне решить проблему нехватки памяти?

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;
    }


person Viola Chen    schedule 28.08.2018    source источник


Ответы (1)


Похоже, в кластере одновременно выполнялась перебалансировка и select * запросы.

Ребалансировка - это процесс, который перемещает разделы между узлами для достижения настроенного коэффициента резервирования. Все перебалансированные данные проходят через кучу, поэтому во время этого процесса она может быть загрязнена. Вы можете прочитать об этом здесь: https://apacheignite.readme.io/docs/rebalancing

Перебалансировку можно отслеживать по соответствующим сообщениям в журнале или путем ожидания в будущем, возвращаемого из метод IgniteCache # rebalance ().

select * - также довольно трудоемкая операция, поскольку требует, чтобы все данные были загружены в один узел.

Использование ленивых запросов может помочь в эта ситуация. Вы можете включить этот флаг в строке подключения JDBC, или как SqlFieldQuery #lazy свойство.

person Denis    schedule 28.08.2018