2016-11-14 12 views
1

リモート計算ジョブを開始するときは、()またはaffinityCall()を呼び出します。リモートサーバーは6スレッドを作成し、これらのスレッドは決して終了しません。 VisualVMのは、以下を示して同じように: "・ユーティリティ#153パーセントヌル%" からリモートサーバースレッドをIgnite終了せず、メモリが不足しています。

view VisualVM snapshot

スレッド名を "マーシャラー-cache-#14I%ヌル%" に、終了されることはありません。 クライアントが何度も繰り返し実行されると、サーバーノード上のスレッド数が急激に増加します。その結果、サーバーノードのメモリが不足します。

クライアントを閉じたときにどうすればこのスレッドを閉じることができますか。 現在の方法でクライアントを実行していない可能性があります。

クライアントコード

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> 

答えて

0

スレッドは、スレッドプール内に作成されているので、あなたはIgniteConfigurationで自分のサイズを設定することがあります。setUtilityCachePoolSize(int)setMarshallerCachePoolSize(int)のIgnite 1.5とsetMarshallerCacheThreadPoolSize(int)のIgnite 1.7、そして他人のために。

+0

現在、スレッド数は問題ではありません。 クライアントが終了すると、このクライアントによって作成されたノード ノードのスレッドを終了する方法があります。クライアントが何度も繰り返し実行されると、サーバーノードのスレッド数が急激に増加します。その結果、サーバーノードのメモリが不足します。 –

+0

私は実際にあなたがサーバ上で観察しているスレッドの数を実際に理解していませんか?とにかく、パークされたスレッドのコストはそれほど高くはありません。スタックサイズはデフォルトで約512kです。また、スレッド数は最大プール・サイズを超えることはできません。これは構成可能です。たぶんあなたの仕事に大きなメモリ使用量がありますか? –

+0

ジョブを実行するたびに6スレッドが作成されます。サーバーはこれらのスレッドを解放しません。私が100回走ったとき。 600スレッドがサーバー上で実行されます。投稿後に私のサーバ設定を追加します。 –

1

これらのスレッドプールは静的であり、スレッド内のスレッド数はロード(実行された操作数、ジョブなど)に決して依存しません。あなたが何らかの形で実行されたジョブごとに同じJVM内で新しいノードを開始しない限り、それらがOOMEの理由だとは思わないと思います。

また、JVMですでに起動されている既存のノードを再利用することをお勧めします。新しいジョブを開始してジョブごとに終了するのは悪い習慣です。

+0

ありがとうValentin。実行されたジョブを開始すると、同じJVMを持つ新しいノードが作成されます。 非常にうまくいけば、私は、このクライアントによって作成されたignite.close()スレッドを呼び出すと、それを破壊する可能性があることを除いて、しかし、それは点火がこのように実行されないようです。 私は、イグニッションインスタンスを再利用するようにアドバイスしています。 別の質問は、ignite.close()はクライアントノードを終了し、サーバーノードとの接続を終了するだけですか?それはサーバーノード上で実行されたジョブをクローズしません。 –

関連する問題