【发布时间】:2017-04-26 21:52:27
【问题描述】:
我们的服务器配备 35gb 内存和 Intel® Xeon(R) E5-1620 0 @ 3.60GHz × 8 CPU。我正在运行一个用 akka 演员设计并用 scala 编写的多线程程序。在程序中,有 4 个演员有任务:
1) 使用 Scala 的 BufferedSource 和迭代器从文件中延迟读取,
2) 标记句子,
3) 计算给定窗口大小的单字和双字词频率,并将它们放入一个映射(一个映射用于单个单词 [String, Int],一个用于元组单词 [WordTuple,Int),
4) 将返回的 hasmaps 合并到一个 hashmap 中,当所有行从文件中读取并将它们写入文件时。
我的自定义jvm设置如下:
-Xms34g
-Xmx34g
-XX:ReservedCodeCacheSize=240m
-XX:+UseParallelGC
-XX:ParallelGCThreads=4
-XX:NewSize=12g
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-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
希望我解释清楚。提前感谢您的回答。
【问题讨论】:
标签: multithreading scala jvm nlp large-text