Я использую 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.