Multithreading 多线程中未知进程的高CPU使用率

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

我们有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的一些屏幕截图:


希望我能解释清楚。提前感谢您的回答。

我将探讨几个方面

  • 您的堆看起来已满,包括旧一代。另一个提示:在8小时20分钟的运行时间中,您的应用程序在olg生成GC中花费了5小时45分钟。当您的堆越来越满时,它会一个接一个地触发完整的GC。 对于并行GC,这将在完整GC期间使用所有内核。 查看您的gc.log,并查看完整gc被触发的次数
  • 在CPU加载期间,创建几个线程转储。您可以使用VisualVM或“jstack”命令。在Visual VM中,它位于“线程”选项卡上的“线程转储”。查看堆栈转储并查找“可运行”线程,它们不在某个阻塞/IO API中。查看它们正在执行的操作

  • 如果它在垃圾收集上花费时间。我会进行堆转储并分析内存。您也可以在监视器选项卡的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
      }
    }