Multithreading 多线程中未知进程的高CPU使用率
我们有35gb内存的服务器和Intel®Xeon(R)E5-1620@3.60GHz×8 CPU。我正在运行一个多线程程序,该程序由akka actors设计,并用scala编写。在该计划中,有4名参与者执行任务: 1) 使用Scala的BufferedSource和迭代器从文件中延迟读取 2) 标记句子 3) 计算给定窗口大小的单字和双字频率,并将其放入映射(一个映射用于单字[String,Int],一个映射用于元组字[WordTuple,Int) 4) 将返回的hasmaps合并到一个hashmap中,当所有行从文件中读取并写入文件时 我的自定义jvm设置如下所示: -Xms34g -Xmx34g -XX:保留的DecacheSize=240m -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:NewSize=12g -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useConcaches=false -Djava.net.preferIPv4Stack=true -XX:+HEAPDUMPONAUTOFMEMORYERROR -XX:-忽略StackTraceInFastThrow -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine -详细:gc -XX:+PrintGCDetails -Xloggc:gc.log 我的application.conf如下: 问题是: 我正在处理一个15gb大小的文本文件。程序开始工作,过了一段时间,比如说2小时,那些标记化、计算操作几乎不工作,没有操作可以执行。需要300毫秒的操作开始需要100000秒。但所有处理器的cpu使用率都是%100。我尝试使用jvisualvm来驱动它但sampler无法在如此高的cpu使用率下工作,因此我无法确定哪个进程的cpu使用率为100%。我从jvisualvm检查gc活动,大部分时间它使用的是大约10%的cpu。那么,我的程序可能有什么问题,哪个进程可能使用了所有的cpu 以下是程序中的操作停止但cpu使用率为%100时jvisualvm的一些屏幕截图:Multithreading 多线程中未知进程的高CPU使用率,multithreading,scala,jvm,nlp,large-text,Multithreading,Scala,Jvm,Nlp,Large Text,我们有35gb内存的服务器和Intel®Xeon(R)E5-1620@3.60GHz×8 CPU。我正在运行一个多线程程序,该程序由akka actors设计,并用scala编写。在该计划中,有4名参与者执行任务: 1) 使用Scala的BufferedSource和迭代器从文件中延迟读取 2) 标记句子 3) 计算给定窗口大小的单字和双字频率,并将其放入映射(一个映射用于单字[String,Int],一个映射用于元组字[WordTuple,Int) 4) 将返回的hasmaps合并到一个has
希望我能解释清楚。提前感谢您的回答。我将探讨几个方面
如果它在垃圾收集上花费时间。我会进行堆转储并分析内存。您也可以在监视器选项卡的VisualVm中进行堆转储并在那里进行粗略分析。正如我现在观察到的,随着时间的推移,垃圾收集的频率在增加,运行应用程序的5秒后会出现10秒onds垃圾收集。随着时间的推移,这段时间越来越短。现在,我观察到更具体的问题,垃圾收集器运行无法清理整个空间,它只是清理了一点未使用的引用,应用程序堆又满了。下面是一个屏幕截图来证明这一点:另一个是使用hi的gcgh cpu:所以,应用程序进程工作得更少。垃圾收集在运行时无法清除所有未使用的引用的原因可能是什么?您的应用程序持有对对象的引用,因此GC无法收集。如果确实需要,请找出持有这些引用的内容。例如,进行堆转储。堆中有哪些实例。使用“查找根”以了解引用是如何保持活动的。
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
}
}