Почему Ignite выделяет 32 ГБ дополнительной внутренней памяти для JVM после активации сетки? - PullRequest
0 голосов
/ 10 мая 2019

Привет, мы используем Apache Ignite 2.7 (8 узлов по 120 ГБ каждый) и настраиваем кучу 16 ГБ и область данных 100 ГБ (с постоянным включением).Используя собственное отслеживание памяти, мы видим, что обычно ожидаемые категории, такие как куча, поток и т. Д., Соответствуют ожиданиям, но «Внутренняя» (т.е. вне кучи) занимает колоссальные 132 ГБ.Это помимо всего прочего, что JVM должна запустить.С таким огромным запросом памяти со стороны JVM система приводится в состояние нехватки памяти (ОС не в оперативной памяти).

В качестве эксперимента мы сократили область данных до 1 ГБ и измерили использование внутренней памяти JVM до ипосле активации сетки (сетка активируется клиентским узлом, который мы подключаем).Мы увидели, что внутренняя (читай: небезопасная вне кучи) память увеличилась с 62 154 до 32 897 187 КБ при активации сетки.Таким образом, кажется, что накладные расходы 32 ГБ не зависят от размера области данных.

Эти 32 ГБ дополнительного системного ОЗУ являются для нас настоящей проблемой.Почему Ignite делает это и как нам это контролировать?

Спасибо

Вот типичная сводная память, которую мы видим.Обратите внимание на ОГРОМНОЕ внутреннее выделение.

Собственная память Всего: зарезервировано = 156688325 КБ, зафиксировано = 156439245 КБ - Куча Java (зарезервировано = 16777216 КБ, зафиксировано = 16777216 КБ) (карта: зарезервировано = 16777216 КБ, зафиксировано = 16777216 КБ) -Класс (зарезервировано = 112257 КБ, зафиксировано = 111489 КБ) (классы # 17951) (malloc = 1665 КБ # 17624) (карта: зарезервировано = 110592 КБ, зафиксировано = 109824 КБ) - поток (зарезервировано = 229015 КБ, зафиксировано = 229015 КБ) (поток № 223) (поток № 223) (стек: зарезервировано = 228032KB, зафиксировано = 228032KB) (malloc = 723KB # 1128) (arena = 260KB # 432) - Код (зарезервировано = 255790KB, зафиксировано = 40250KB) (malloc = 6190KB # 11547) (карта: зарезервировано = 249600KB, зафиксировано= 34060KB) - GC (зарезервировано = 704014KB, зафиксировано = 704014KB) (malloc = 48654KB # 22251) (mmap: зарезервировано = 655360KB, зафиксировано = 655360KB) - Компилятор (зарезервировано = 420KB, зафиксировано = 420KB) (malloc = 289KB # 1284)(arena = 131 КБ № 15) - Внутренний (зарезервировано = 138544815 КБ, зафиксировано = 138544811 КБ) (malloc = 138544779 КБ № 35177) (карта: зарезервировано = 36 КБ, зафиксировано = 32 КБ) - символ (зарезервировано = 26536 КБ, зафиксировано = 26536 КБ) (malloc =24002KB # 216741) (арена = 2533KB # 1) - отслеживание собственной памяти (зарезервировано = 4822KB, зафиксировано = 4822KB) (malloc = 30KB # 346) (накладные расходы на отслеживание = 4791KB) - блок арены (зарезервировано = 673KB, зафиксировано = 673KB) (malloc = 673 КБ) - неизвестно (зарезервировано = 32768 КБ, зафиксировано = 0 КБ) (mmap: зарезервировано = 32768 КБ, зафиксировано = 0 КБ)

PS

Для области данных по умолчанию установлено значение128 МБ, для systemRegionMaxSize установлено значение 8 ГБ, а для systemRegionInitialSize установлено значение 512 МБ.

Конфиг:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="         http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="gridLogger">
      <bean class="org.apache.ignite.logger.log4j.Log4JLogger">
        <constructor-arg type="java.lang.String" value="/opt/ignite/apache-ignite/config/log4j.xml"/>
      </bean>
    </property>
    <property name="metricsLogFrequency" value="600000"/>
    <property name="rebalanceThreadPoolSize" value="12"/>
    <property name="peerClassLoadingEnabled" value="true"/>
    <property name="publicThreadPoolSize" value="32"/>
    <property name="systemThreadPoolSize" value="32"/>
    <property name="workDirectory" value="/data/ignite/work"/>
    <property name="segmentationPolicy" value="RESTART_JVM"/>
    <property name="dataStorageConfiguration">
      <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
        <property name="checkpointReadLockTimeout" value="0"/>
        <property name="systemRegionInitialSize" value="#{512L * 1024 * 1024}"/>
        <property name="systemRegionMaxSize" value="#{8L * 1024 * 1024 * 1024}"/>
        <property name="storagePath" value="/data/ignite/persistentStore"/>
        <property name="defaultDataRegionConfiguration">
          <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
            <property name="name" value="Default_Region"/>
            <property name="initialSize" value="67108864"/>
            <property name="maxSize" value="134217728"/>
            <property name="persistenceEnabled" value="false"/>
            <property name="metricsEnabled" value="true"/>
          </bean>
        </property>
        <property name="dataRegionConfigurations">
          <list>
            <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
              <property name="name" value="Tiered_Region"/>
              <property name="initialSize" value="53687091200"/>
              <property name="maxSize" value="53687091200"/>
              <property name="persistenceEnabled" value="true"/>
              <property name="pageEvictionMode" value="RANDOM_2_LRU"/>
              <property name="evictionThreshold" value="0.75"/>
              <property name="metricsEnabled" value="true"/>
            </bean>
          </list>
        </property>
      </bean>
    </property>
    <property name="cacheConfiguration">
      <list>
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
          <property name="name" value="default"/>
          <property name="atomicityMode" value="ATOMIC"/>
          <property name="backups" value="0"/>
        </bean>
      </list>
    </property>
    <property name="communicationSpi">
      <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
        <property name="messageQueueLimit" value="#{1 * 1024}"/>
        <property name="idleConnectionTimeout" value="30000"/>
      </bean>
    </property>
    <property name="discoverySpi">
      <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
        <property name="ipFinder">
          <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">
            <property name="awsCredentials" ref="aws.creds"/>
            <property name="bucketName" value="project-test-xyz"/>
          </bean>
        </property>
      </bean>
    </property>
  </bean>
  <bean id="aws.creds" class="com.amazonaws.auth.BasicAWSCredentials">
    <constructor-arg value="foo"/>
    <constructor-arg value="bar"/>
  </bean>
</beans>

[Добавление журналов ниже]

[2019-05-17 22: 28: 39,592] [WARN] [main] [IgniteKernal] Включена загрузка класса одноранговых узлов (отключите его в рабочей среде по соображениям производительности и согласованности развертывания) [2019-05-1722: 28: 39,593] [WARN] [main] [IgniteKernal] Пожалуйста, установите системное свойство '-Djava.net.preferIPv4Stack = true', чтобы избежать возможных проблем в смешанных средах.[2019-05-17 22: 28: 40,141] [WARN] [main] [NoopCheckpointSpi] Контрольные точки отключены (для включения настройки любой реализации GridCheckpointSpi) [2019-05-17 22: 28: 40,214] [WARN] [main][GridCollisionManager] Разрешение столкновений отключено (все задания будут активированы по прибытии).[2019-05-17 22: 28: 41,690] [WARN] [main] [GridCacheDatabaseSharedManager] DataRegionConfiguration.maxWalArchiveSize вместо DataRegionConfiguration.walHistorySize будет использоваться для удаления старых архивных файлов wal [2019-05-17 22: 28: 41,826] [WARN] [main] [PartitionsEvictManager] Ведение журнала на уровне INFO без проверки, включен ли уровень INFO: Разрешает разделение Evict = 4 [2019-05-17 22: 28: 46,291] [WARN] [main] [IgniteKernal] Узлы запущены на локальном компьютеремашине требуется более 80% физической оперативной памяти, что может привести к значительному замедлению из-за подкачки (уменьшите размер кучи JVM, размер области данных или размер буфера контрольной точки) [обязательно = 12516 МБ, доступно = 14008 МБ] log4j: завершение приложения с именем [null],[2019-05-17 22: 31: 19,958] [WARN] [disco-event-worker- # 42] [GridDiscoveryManager] Значение локального узла системного свойства 'java.net.preferIPv4Stack' отличается от значения удаленного узла (все узлы в топологиидолжно иметь одинаковое значение) [locPreferIpV4 = null, rmtPreferIpV4 = true, locId8 = f25228c0, rmtId8 = eac4211d, rmtAddrs = [192.168.1.5/127.0.0.1, /192.168.1.5], rmtNode = id0-c2132 = id-cluster-9bd5-f91dfa34a0e9, order = 2, addr = [127.0.0.1, 192.168.1.5], daemon = false]] [2019-05-17 22: 32: 24,265] [WARN] [exchange-worker- # 43] [GridAffinityAssignmentCache] Ведение журнала на уровне INFO без проверки, включен ли уровень INFO: Распределение назначения локальных узлов не является идеальным [cache = default, Ожидаемый первичный = 1024.00, actualPrimary = 1024, ОжидаемыйBackups = 1024.00, actualBackups = 0, warningThreshold = 50.00%] [2019-05-17 22: 32: 24,269] [WARN] [exchange-worker- # 43] [GridAffinityAssignmentCache] Ведение журнала на уровне INFO без проверки, включен ли уровень INFO: распределение назначения локальных узлов не является идеальным[кэш = значение по умолчанию, Ожидаемые значения = 1024,00, фактические значения = 1024, ожидаемые резервные копии = 1024,00, фактические резервные копии = 0, warningThreshold = 50,00%] [2019-05-17 22: 32: 24,850] [ПРЕДУПРЕЖДЕНИЕ] [exchange-worker- # 43] [GridAffinityAssignmentCache] Ведение журнала на уровне INFO без проверки, включен ли уровень INFO: Распределение назначения локальных узлов не является идеальным [cache = default, Ожидаемый первичный = 1024.00, actualPrimary = 1024, ОжидаемыйBackups = 1024.00, actualBackups = 0, warningThreshold = 50.00%] [2019-05-17 22: 32: 24,911] [WARN] [disco-notifier-worker- # 41] [GridClusterStateProcessor] Ведение журнала на уровне INFO без проверки, включен ли уровень INFO: полученное сообщение об окончании изменения состояния: true 22: 33: 49.086[exchange-worker- # 43] ИНФОРМАЦИЯ cbaa.ceres.loader.S3CacheLoader - загрузка eb5445c7-d7fa-4018-95b6-63c4a0911eae получила инъекцию экземпляра ignite IgniteKernal [longJVMPauseDetector = LongJVauseauseDetector = LongJVMPauseDetector [workerRef = pp-детектор [работникRef = поток [j], main], longPausesCnt = 0, longPausesTotalDuration = 0, longPausesTimestamps = [0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], longPausesDurations = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], cfg = IgniteConfiguration [igniteInstanceName = null, pubPoolSize = 32, svcPoolSize = 32, callbackPoolSize = 8, stripedPoolSize = 8, sysPoolSize = 16,mgmtPoolSize = 4, igfsPoolSize = 8, dataStreamerPoolSize = 8, utilityCachePoolSize = 8, utilityCacheKeepAliveTime = 60000, p2pPoolSize = 2, qryPoolSize = 8, igniteHome = / opt / igniteWite = ignite / ignvite / ignite / ignite / ignite / ignite / ignite / ignite / ignite / ignitcom.sun.jmx.sndRetryCnt = 3, metricsHistSize = 10000, metricsUpdateFreq = 2000, metricsExpTime = 9223372036854775807, discoSpi = TcpDiscoverySpi [addrRslvr = null, sockTimeout = 5000, ackTimeout = 5000 [cl.halker.harl_harsler_harsler_harler.hl_harm_hler_harm_hler_harshlerler)], reconCnt = 10, reconDelay = 2000, maxAckTimeout= 600000, forceSrvMode = false, clientReconnectDisabled = false, internalLsnr = null], segPlc = NOOP, segResolveAttempts = 2, waitForSegOnStart = true, allResolversPassReq = true, segChkFreq = 60000Spign.om.communication.tcp.TcpCommunicationSpi$ConnectGateway@6020964a, connPlc=org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi$FirstConnectionPolicy@3f2874d5, enableForcibleNodeKill = ложь, 0.0.0 = 0, loc_LoD = 0, loc_H0_LoD_LoG_LoD_LoD_LoG_LoD_LoD_LoG_LoD_LoG_LoD_LoG_Log_LoD_LoD_LoG_Log_. 0.. .0. 0 =. 00.0, locPort = 47100, locPortRange = 100, shmemPort = -1, directBuf = true, directSndBuf = false, idleConnTimeout = 600000, connTimeout = 5000, maxConnTimeout = 600000 ,conconCnt = 10, sockSndBuf = 32768, sockRcvueBug = 106824B =, slowClientQueueLimit = 0, nioSrvr = GridNioServer [selectorSpins = 0, filterChain = FilterChain [filters = [GridNioCodecFilter[Parser=org.apache.ignite.internal.util.nio.GridDirectParser@7873ad1, directMode = true], GridConnectionBytesVerifyFilter], закрытый = false, directBuf = true, tcpNoDelay = true, sockSndBuf = 32768, sockRcvBuf = 32768, writeTimeout = 2000, idleTimeout = 600000, skipWrite = false, skipRead = false, locAddr = 0.0.0.0 / 0.0.0.0: 47100, order = LITTLE_ENDIAN, sndQueueLimit = 1024, directMode = true, sslFilter = null, msgQueueLsnr = null, readerMoveCnt = 0, writerMoveCnt = 0, readWriteSelectorsAssign = false], shmemSrv = null, usePairedConnections = false, connectionsPerNode = 1, tcpNoDelay = true, filterReachableAddresses = false, ackSndThreshold = 32, unackedMsgsBufSize = 0, sockWriteTimeout = 2000, boundTcpPort = 47100, boundTcpShmemPort = -1, selectorsCnt = 4, selectorSpins = 0, addrRslvr = null, ctxInitLatch=java.util.concurrent.CountDownLatch@7b757828 [Count = 0], остановки = ложь], evtSpi=org.apache.ignite.spi.eventstorage.NoopEventStorageSpi@282cb7c7, colSpi = NoopCollisionSpi [], deploySpi = LocalDeploymentSpi [], indexingSpi=org.apache.ignite.spi.indexing.noop.NoopIndexingSpi@50de186c, addrRslvr = нуль, encryptionSpi=org.apache.ignite.spi.encryption.noop.NoopEncryptionSpi@5a3bc7ed, clientMode = false, rebalanceThreadPoolSize = 1, txCfg = TransactionConfiguration [txSerEnabled = false, dfltIsolation = REPEATABLE_READ, dfltConcurrency = PESSIMISTIC, dfltTxTimeout = 0, txTimeoutOnPartitionMapExchange = 0, pessimisticTxLogSize = 0, pessimisticTxLogLinger = 10000, tmLookupClsName = null, txManagerFactory = null, useJtaSync = false], cacheSanityCheckEnabled = true, discoStartupDelay = 60000, deployMode = SHARED, p2pMissedCacheSize = 100, locHost = null, timeSrvPortBase = 31100, timeSrvPortRange = 100, faultDetectionTimeout = 60000, sysWorkerBlockedTimeout = null, clientFailureDetectionTimeout = 30000, metricsLogFreq = 60000, hadoopCfg = null, connectorCfg = ConnectorConfiguration [jettyPath = null, host = null, port = 11211, noDelay = true, directBuf = false, sndBufSize = 32768, rcvBufSize = 32768, idleQryCurTimeout = 600000, idleQryCurCheckFreq = 60000, sndQueueLimit = 0, selectorCnt = 4, idleTimeout = 7000, sslEnabled = false, sslClientAuth = false, sslCtxFactory = null, sslFactory = null, portRange = 100, threadPoolSize = 8, msgInterceptor = null], odbcCfg = null, warmupClos = null, atomicCfg = AtomicConfiguration [seqReserveSize = 1000, cacheMode = PARTITIONED, backups = 1, aff = null, grpName = null], classLdr = null, sslCtxFactory = null, platformCfg = null, binaryCfg = null, memCfg = null, pstCfg = null, dsCfg = DataStorageConfiguration [sysRegionInitSize = 41943040, sysRegionMaxSize = 104857600, pageSize = 1024, concLvl = 0, dfltDataRegConf = DataRegionConfiguration [name = Default_Region, maxSize = 134217728, initSize = 67108864, swapPath = null, pageEvictionMode = DISABLED, evictionThreshold = 0,9, emptyPagesPoolSize = 100, metricsEnabled = true, metricsSubIntervalCount = 5, metricsRateTimeInterval = 60000, persistenceEnabled = false, checkpointPageBufSize = 0], dataRegions = [DataRegionConfiguration [name = Tiered_Region, maxSize = 8589934592, initSize = 8589934592, swapPath = null, pageEvictionMode = DISABLED, evictionThreshold = 0,9, emptyPagesPoolSize = 100, metricsEnabled = true, metricsSubIntervalCount = 5, metricsRateTimeInterval = 60000, persistenceEnabled = true, checkpointPageBufSize = 0]], storagePath = / data / ignite / persistentStore, checkpointFreq = 180000, lockWaitTime = 30000, checkpointThreads = 8, checkpointWriteOrder = SEQUENTIAL, walHistSize = 20, maxWalArchiveSize = 1073741824, walSegments = 10, walSegmentSize = 67108864, walPath = db / wal, walArchivePath = db / wal / archive, metricsEnabled = false, walMode = LOG_ONLY, walTlbSize = 131072, walBuffSize = 0, walFlushFreq = 2000, walFsyncDelay = 1000, walRecordIterBuffSize = 67108864, alwaysWriteFullPages = ложный, fileIOFactory=org.apache.ignite.internal.processors.cache.persistence.file.AsyncFileIOFactory@2fb68ec6, metricsSubIntervalCnt = 5, metricsRateTimeInterval = 60000, walAutoArchiveAfterInactivity = -1, writeThrottlingEnabled = true, walCompactionEnabled = false, walCompactionLevel = 1,checkpointReadLockTimeout = null], activeOnStart = true, autoActivation = true, longQryWarnTimeout = 3000, sqlConnCfg = null, cliConnCfg = ClientConnectorConfiguration [host = null, port = 10800, portRange = 100, sockSndBufSize = 0, sockRcvBufSize = 0, tcpNoDelay = true, maxOpenCursorsPerConn = 128, threadPoolSize = 8, idleTimeout = 0, jdbcEnabled = true, odbcEnabled = true, thinCliEnabled = true, sslEnabled = false, useIgniteSslCtxFactory = true, sslClientAuth = false, sslCtxFactory = null], mvccVacuumThreadCnt = 2, mvccVacuumFreq = 5000, authEnabled = false, faultHnd = null, commFailureRslvr = null], igniteInstanceName = null, startTime = 1558132126418, rsrcCtx=org.apache.ignite.internal.processors.resource.GridSpringResourceContextImpl@556d0e12, reconnectState = ReconnectState [firstReconnectFut = GridFutureAdapter [ignoreInterrupts = false, состояние = INIT, res = ноль, хэш = 1426466647], curReconnectFut = null, reconnectDone = null]]

1 Ответ

1 голос
/ 16 мая 2019

Мне кажется, это Буфер страницы контрольной точки , что по умолчанию составляет 20% от размера области данных.

Вы можете указать его явно, чтобы не забыть, и соответственно уменьшить размер региона, чтобы не допустить исчерпания ОЗУ.

Должно быть применимо только к постоянным регионам.

Обратите внимание, что вы также должны ожидать, что ваша ОС займет несколько ГБ по отношению к своим структурам данных и блочным кэшам, поэтому я не думаю, что вам следует выделять 116G из 120G для автономной памяти Ignite. Не забывайте и о куче.

...