我们的服务器具有35gb内存和Intel®Xeon(R)E5-1620 0 @ 3.60GHz×8 CPU。我正在运行一个由akka actor设计并用scala编写的多线程程序。在该程序中,有4个执行任务的参与者:
1)使用Scala的BufferedSource和迭代器从文件中进行延迟读取,
2)标记句子,
3)计算给定窗口大小的单字和双字单词频率,然后将它们放入 map 中(一张 map 用于单个单词[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:+ PrintGC详细信息
-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 Activity ,并且大部分时间它都在使用%10 cpu。那么,我的程序可能是什么问题,哪个进程可能正在使用所有cpu?
这里是当程序中的操作停止但cpu的使用为%100时jvisualvm的一些屏幕截图:
Garbage collector status screenshot
Overall status screenshot
希望我能解释清楚。预先感谢您的回答。
最佳答案
我会研究几个领域。
使用并行GC,它将在完整GC期间使用所有内核。
查看您的gc.log,并查看触发完整GC的次数。
如果要花时间在垃圾回收上。我将进行堆转储并分析保留的内存。您也可以在VisualVm的“监视器”选项卡中进行堆转储,并在那里进行粗略分析。
关于multithreading - 多线程中未知进程的高CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43626679/