2017-04-26 2 views
2

35GBのメモリとIntel Xeon(R)E5-1620 0 @ 3.60GHz×8 CPUのサーバーがあります。私はakkaの俳優とスケーラで書かれたマルチスレッドプログラムを実行しています。マルチスレッドで未知のプロセスによるCPU使用率が高い

1)ScalaのBufferedSourceのファイルとイテレータから読み出しレイジー、

2)文、

3)のための単一及びバイグラムの単語頻度の計算のトークン化:プログラムにおいて、タスクと4つのアクターがあります1つの単語マップ[String、Int]、タプル単語[WordTuple、Int]、

のマップを1つのハッシュマップにマージし、すべての行を読み込んだときファイルに書き込んでください。

マイカスタムJVM設定は次のとおりです。

-Xms34g

-Xmx34g

-XXに:ReservedCodeCacheSize = 240メートル

-XX:+ UseParallelGC

-XX: ParallelGCThreads = 4

-XX:NewSize = 12g

-XX:SoftRefLRUPolicyMSPerMB = 50

-ea

-Dsun.io.useCanonCaches =偽

-Djava.net.preferIPv4Stack =真

-XX:+ HeapDumpOnOutOfMemoryError

-XX:-OmitStackTraceInFastThrow

-Dawt.useSystemAAFontSettings = LCD

-Dsun.java2d.renderer = sun.java2d.marlin.MarlinRenderingEngine

-verbose:GC

-XX:+ PrintGCDetails

-Xloggc:GC .logの次のよう

私application.confは次のとおりです。

systemParameters { 
    linesPerActor = 5 
    windowSize = 6 
    threadPoolSize = 5 
} 


akka.actor.deployment { 

    /wordTokenizerRouter { 
    router = round-robin-pool 
    nr-of-instances = 5 
    } 

    /frequencyCalculatorRouter { 
    router = round-robin-pool 
    nr-of-instances = 5 
    } 
} 

問題:

サイズ15GBのテキストファイルを処理しています。プログラムは作業を開始し、しばらくしてから2時間後には、トークン化、計算操作がほとんど機能していないため、操作は実行できません。 300ミリ秒かかる操作は100000秒かかる。しかし、CPU使用率はすべてのプロセッサで100%です。私はそれを動かすためにjvisualvmを使用しようとしましたが、サンプラーはこの高いCPU使用率で動作していないので、どのプロセスがCPU%100を作っているのか特定できませんでした。私はjvisualvmからgcの活動をチェックし、それは約10%のCPUを使用しています。だから、おそらくすべてのCPUを使用している私のプログラムの問題は何ですか?ここで

jvisualvmからいくつかのスクリーンショットのプログラムでの動作が停止しているが、CPU使用率が100%である:

Garbage collector status screenshot

Overall status screenshot

私はそれを明確に説明希望。あなたの答えに事前に感謝します。

答えて

0

私はいくつかの領域を調べます。

  1. 古い世代を含め、ヒープがいっぱいに見えます。別のヒント:8時間20分のランタイムのうち、アプリケーションはolg世代GCで5時間45分を費やしました。ヒープがいっぱいになると、完全なGCが1つずつトリガされます。 Parallel GCでは、フルGC中にすべてのコアを使用します。 gc.logを見て、フルGCがトリガーされた回数を確認してください。
  2. CPUのロード中に、いくつかのスレッドダンプを作成します。 VisualVM 'や `jstack'コマンドを使うことができます。 Visual VMの 'スレッド'タブで、 'スレッドダンプ'。スタックダンプを見て、ブロック/ IO APIにはない「Runnable」スレッドを探します。彼らが何をしているかを見てください。

ガベージコレクションに時間がかかる場合は、私はヒープダンプを取って、どのような記憶が保持されているかを分析します。 VisualVmの「モニタ」タブでヒープ・ダンプを取って、そこでの大まかな分析を行うことができます。

+0

私が今観察したように、ガベージコレクションの頻度は、実行中のアプリケーションの5秒後にガベージコレクションが10秒続くように増加しています。そして、この時間は時間の経過と共に狭くなっています。今、私はより具体的な問題を観察し、ガベージコレクタの実行は、全体のスペースを掃除することはできません、ちょうど未使用の参照とアプリケーションのヒープが少しいっぱいになってきて清掃です。ここでは、スクリーンショットでそれを証明しています:http://imgur.com/0NbZeltと高CPUを使用しているgc:http://imgur.com/a/YSrswので、アプリケーションプロセスが少なくなっています。 – katilsperm

+0

未使用の参照が実行されているときに、ガベージコレクションがすべての参照を消去できない理由は何ですか? – katilsperm

+0

アプリケーションはオブジェクトへの参照を保持しているため、GCは収集できません。 本当に必要な場合は、その参照を保持するものを調べてください。 同様に、ヒープダンプを取る。どのインスタンスがヒープにあるのですか。リファレンスがどのように生きているのか調べるには、 'find roots'を使います。 – Gamlor