Apache Ignite IGFS не использует пространство без кучи - PullRequest
0 голосов
/ 05 апреля 2019

Я использую Apache Ignite 2.6.Я использую файловую систему Ignite, и когда я снова и снова записываю определенный файл размером около 25 МБ в IGFS, данные не сохраняются в пространство без кучи.Вместо этого он попадает в кучу, которая подлежит сборке мусора, и это относительно медленно.Как мне заставить IGFS сохранить файл в большом пространстве кучи, которое я выделил для него?

Архитектура высокого уровня - у меня есть клиентский узел воспламенения, работающий на данный момент внутри tomcat, и серверный узел воспламенения, по которому я намерен хранить эти данные.Масштабирование может произойти, как только я получу эту работу, как ожидалось - но это очень медленно из-за вышеупомянутой проблемы.Это также OOMs, когда у него очень мало свободного места.Дело в том, что я хочу, чтобы оно использовало 30 ГБ пространства NON HEAP, которое я выделил!

Я предполагаю, что это будет в памяти кеш.Я выделяю 2 G пространства кучи и 30 G пространства без кучи для JVM.Пространство без кучи никогда не используется, и в результате ему не хватает памяти.Я подтвердил, что пространство без кучи не используется на вкладке Память консоли JMX - пространство без кучи остается значительно ниже 100 МБ, тогда как пространство кучи быстро увеличивается до 2 ГБ, а затем JVM падает.

Подробности: во-первых, моя конфигурация воспламенения (spring xml):

 <?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="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_FALLBACK"/>
    <property name="searchSystemEnvironment" value="true"/>
</bean>
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="marshaller">
        <bean class="org.apache.ignite.internal.binary.BinaryMarshaller" />
    </property>

    <property name="fileSystemConfiguration">
        <list>
            <bean class="org.apache.ignite.configuration.FileSystemConfiguration">
                <property name="name" value="igfs"/>
                <property name="blockSize" value="#{128 * 1024}"/>
                <property name="perNodeBatchSize" value="512"/>
                <property name="perNodeParallelBatchCount" value="16"/>
                <property name="prefetchBlocks" value="32"/>
            </bean>
        </list>
    </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.multicast.TcpDiscoveryMulticastIpFinder">
                    <property name="addresses">
                        <list>
                            <value>127.0.0.1:47500..47509</value>
                        </list>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
    <property name="dataStorageConfiguration">
        <bean class="org.apache.ignite.configuration.DataStorageConfiguration" >
            <!-- if I don't set this, the system region runs out of memory almost immediately -->
            <property name="systemRegionMaxSize" value="#{6L * 1024 * 1024 * 1024"} />
            <property name="systemRegionInitialSize" value="#{6L * 1024 * 1024 * 1024"} />
        </bean>

    </property>
</bean>

Вот скрипт, который я использую для запуска процесса запуска сервера зажигания.Это сценарий оболочки, работающий на машине Linux с 64 ГБ ОЗУ и 40 ГБ дискового пространства.

IGNITE_HOME=/data/apache-ignite
export IGNITE_HOME
IGNITE_JMX_PORT=1234
export IGNITE_JMX_PORT
$IGNITE_HOME/bin/ignite.sh $IGNITE_HOME/ignite-media-server.xml -J-Xmx2G -J-Xms2G -J-XX::+HeapDumpOnOutOfMemoryError -J-XX:HeapDumpPath=$IGNITE_HOME -J-XX:+PrintGC -J-XX:+PrintGCTimeStamps -J-XX:+PrintGCDateStamps -J-Xloggc:$IGNITE_HOME/gc.log-$(date +%m%d-%H%M%S) -J-XX:+UseG1GC -J-XX:DisableExplicitGC -J-XX:MaxDirectMemorySize=30G 

Это код, который создает мой клиентский объект igfs, с помощью которого я сохраняю файлы для воспламенения.Они, как правило, на большой стороне.

public void init() throws Exception{
    igniteInstanceName = "client-name=" + hostInfo.getLocalHost();
    Ignition.setClientMode(true); 
    // reading in the same config file as the server uses to start up above.  The big difference is the clientMode set to true here. 
    try(InputStream configFileInputStream = new FileInputStream(ResourceUtils.getFile("ignite-media-server.xml"));){
         ignite = IgnitionEx.start(configFileInputStream, igniteInstanceName, null, null);
         igfs = ignite.fileSystem("igfs");

    }
    catch(Throwable t){ /* do log */}

}

Вот метод сохранения, который сохраняет мои файлы для воспламенения:

public saveStream(String cachePath, AudioInputStream toCache){
   OutputStream os = null;
   try{
       IgfsPath cacheFile = new IgfsPath(cachePath);
       os = igfs.create(cacheFile, true);
       AudioSystem.write(toCache.getDataStream, AudioFileFormat.TYPE.WAVE, os);
   }
   finally{
      // close streams
   }
}

Почему мои данные не сохраняются в быстром пространстве вне кучи?Что мне не хватает?Мой server.config взят почти прямо из примера, предоставленного igfs.

В другой путанице, когда я использую ignitevisor.cmd для проверки использования памяти на узле сервера до и после более короткого теста (который не приводит к сбою), я вижу следующее:

Посмотрите на распределение памяти, пока ignite пуст в ignitevisor.cmd.Посмотрите, что мой регион igfs говорит:

  • Инициализированная память кучи: 2g
  • Используемая память кучи: 56 МБ
  • Инициализированная память без кучи: 2 МБ
  • Используемая память без кучи: 49 МБ
  • Максимальная память без кучи: 744МБ

Создание файлов JUST SHY 2 G, сохраненных в IGFS - всего лишь OOM, поскольку из горькогоЯ знаю, что это скоро взорвется.Используйте ignitevisor.cmd для просмотра распределения памяти узлов.Вот что ... - MeowCode 2 минуты назад

  • Инициализированная память кучи: 2 ГБ
  • Используемая память кучи: 1 ГБ
  • Используется память без кучи 64 МБ
  • Максимум памяти без кучи: 744 МБ

Почему в не-куче почти ничего нет?И почему ignitevisor считает, что максимальный размер кучи составляет 744 МБ, а должен быть 30 ГБ?

В других случаях, если я увеличу размер кучи до 6 ГБ, он будет работать дольше, но все жесбой сервера с "OutOfMemoryError: пространство кучи Java".Интересно, что я могу воспроизвести это, даже когда я включаю сохранение диска.При проверке файла дампа кучи обнаруживается множество записей ConcurrentLinkedHashMap.Сами записи являются объектами «org.apache.ignite.internal.GridTopic».У каждого есть UUID, и большинство из них имеет тип TOPIC_DATASTREAM.

1 Ответ

1 голос
/ 05 апреля 2019

Все данные сохраняются в автономной куче, но вы должны знать, что многие временные объекты, участвующие в работе IGFS, все еще будут кратковременно удерживаться в куче (и после этого GCed).

"JMXВкладка «Память консоли» - пространство без кучи »является неправильной метрикой.Я не думаю, что есть какие-либо показатели JVM для Off-Heap.Однако Ignite будет печатать статистику вне кучи через равные промежутки времени.

Почему не хватает памяти, не очевидно.Вы пытались собрать и проанализировать дамп кучи?

...