Ignite Remote Server Thread Not exit, причина нехватки памяти, наконец

Когда я запускаю задание удаленных вычислений, вызываю () или affinityCall (). Удаленный сервер создаст 6 потоков, и эти потоки никогда не завершатся. Так же, как VisualVM показано ниже:

просмотреть снимок VisualVM

имя потока от «utility- # 153% null%» до «marshaller-cache- # 14i% null%» никогда не будет завершено. Если клиент запускается снова и снова, количество потоков на серверном узле будет быстро увеличиваться. В результате узлу сервера не хватает памяти.

Как я могу закрыть этот поток, когда клиент закрыт. Возможно, я не запускаю клиент в текущем режиме.

Код клиента

String cacheKey = "jobIds";
String cname = "myCacheName";
ClusterGroup rmts = getIgnite().cluster().forRemotes();
IgniteCache<String, List<String>> cache = getIgnite().getOrCreateCache(cname);
List<String> jobList = cache.get(cacheKey);
Collection<String> res = ignite.compute(rmts).apply(
        new IgniteClosure<String, String>() {
            @Override
            public String apply(String word) {
                return word;
            }
        },
        jobList
    );
getIgnite().close();
System.out.println("ignite Closed");

if (res == null) {
    System.out.println("Error: Result is null");
    return;
}

res.forEach(s -> {
    System.out.println(s);
});
System.out.println("Finished!");

getIgnite (), получите экземпляр Ignite.

public static Ignite getIgnite() {
    if (ignite == null) {
        System.out.println("RETURN INSTANCE ..........");
        Ignition.setClientMode(true);
        ignite = Ignition.start(confCache);
        ignite.configuration().setDeploymentMode(DeploymentMode.CONTINUOUS);
    }

    return ignite;
}

Конфигурация сервера:

<?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">
        <!--
        Alter configuration below as needed.
        -->
        <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
            <property name="peerClassLoadingEnabled" value="true"/>
            <property name="peerClassLoadingMissedResourcesCacheSize" value="0"/>
            <property name="publicThreadPoolSize" value="64"/>

            <property name="discoverySpi">
                <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                    <property name="ipFinder">
                        <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                            <property name="addresses">
                                <list>
                                    <value>172.22.1.72:47500..47509</value>
                                    <value>172.22.1.100:47500..47509</value>
                                </list>
                            </property>
                        </bean>
                    </property>
                </bean>
            </property>

            <property name="cacheConfiguration">
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="cacheMode" value="PARTITIONED"/>
                    <property name="memoryMode" value="ONHEAP_TIERED"/>
                    <property name="backups" value="0"/>
                    <property name="offHeapMaxMemory" value="0"/>
                    <property name="swapEnabled" value="false"/>
                </bean>
            </property>
        </bean>
</beans>

person alex_wang58    schedule 14.11.2016    source источник


Ответы (2)


Эти пулы потоков статичны, и количество потоков в них никогда не зависит от нагрузки (количества выполненных операций, заданий и т. Д.). Сказав это, я не думаю, что они являются причиной OOME, если вы каким-то образом не запускаете новый узел в той же JVM для каждого выполненного задания.

Я также рекомендовал бы всегда повторно использовать существующий узел, который уже запущен в JVM. Создавать новый и закрывать его для каждой работы - плохая практика.

person Valentin Kulichenko    schedule 14.11.2016
comment
Спасибо Валентин. Это правда, что когда я запускаю выполняемое задание, оно создает новый узел с той же JVM. В самом начале я исключил, что при вызове ignite.close () потоки, созданные этим клиентом, могут быть уничтожены. Но похоже, что ignite doest run on this way. So Im последует вашему совету и повторно использует экземпляр ignite. Другой вопрос заключается в том, что ignite.close () просто завершает клиентский узел и закрывает соединение с серверным узлом. Он не закроет выполненное задание на серверном узле. - person alex_wang58; 15.11.2016

Потоки создаются в пулах потоков, поэтому вы можете установить их размер в IgniteConfiguration: setUtilityCachePoolSize (int) и setMarshallerCachePoolSize (int) для Ignite 1.5 и tMarshallerCacheThreadPoolSize (int) для Ignite 1.7 и другие.

person Mitya XMitya    schedule 14.11.2016
comment
В настоящее время проблема не в количестве потоков. Проблема в том, что, когда клиент завершил работу, как завершить потоки на серверном узле, который был создан этим клиентом. Когда клиент запускается снова и снова, количество потоков на серверном узле будет быстро увеличиваться. В результате узлу сервера не хватает памяти. - person alex_wang58; 14.11.2016
comment
Я вообще-то не понимаю, сколько потоков вы наблюдаете на сервере? В любом случае припаркованный поток стоит не слишком дорого - просто размер стека, который по умолчанию составляет около 512k. И количество потоков не может превышать максимальный размер пула, это настраивается. Может у вас в задачах много памяти? - person Mitya XMitya; 14.11.2016
comment
Каждый раз, когда я запускаю задание, будет создано 6 потоков. Сервер никогда не выпускает эти потоки. Когда я бегу 100 раз. На сервере выполняется 600 потоков. Я добавлю конфигурацию моего сервера после поста - person alex_wang58; 14.11.2016
comment
Я не могу воспроизвести. Какую версию ignite вы используете? Вы запускаете только один узел на JVM? - person Mitya XMitya; 14.11.2016
comment
ignite версия 1.7.0 # 20160801-sha1: 383273e3. Я просто запускаю по одному узлу на JVM - person alex_wang58; 15.11.2016