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
私はそれを明確に説明希望。あなたの答えに事前に感謝します。
私が今観察したように、ガベージコレクションの頻度は、実行中のアプリケーションの5秒後にガベージコレクションが10秒続くように増加しています。そして、この時間は時間の経過と共に狭くなっています。今、私はより具体的な問題を観察し、ガベージコレクタの実行は、全体のスペースを掃除することはできません、ちょうど未使用の参照とアプリケーションのヒープが少しいっぱいになってきて清掃です。ここでは、スクリーンショットでそれを証明しています:http://imgur.com/0NbZeltと高CPUを使用しているgc:http://imgur.com/a/YSrswので、アプリケーションプロセスが少なくなっています。 – katilsperm
未使用の参照が実行されているときに、ガベージコレクションがすべての参照を消去できない理由は何ですか? – katilsperm
アプリケーションはオブジェクトへの参照を保持しているため、GCは収集できません。 本当に必要な場合は、その参照を保持するものを調べてください。 同様に、ヒープダンプを取る。どのインスタンスがヒープにあるのですか。リファレンスがどのように生きているのか調べるには、 'find roots'を使います。 – Gamlor