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

标签 multithreading scala jvm nlp large-text

我们的服务器具有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

希望我能解释清楚。预先感谢您的回答。

最佳答案

我会研究几个领域。

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

  • 如果要花时间在垃圾回收上。我将进行堆转储并分析保留的内存。您也可以在VisualVm的“监视器”选项卡中进行堆转储,并在那里进行粗略分析。

    关于multithreading - 多线程中未知进程的高CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43626679/

    相关文章:

    scala - 运行 stanford LLDA tmt scala 模型时出现线程错误

    scala - '结果的长度应为 3' : How does the ScalaTest DSL work?

    docker - 当运行 JVM 的 docker 容器达到内存限制时会发生什么?

    java - 安装了非法 key 大小 Jvm 8 但项目源/二进制文件是 jdk7

    c# - Winforms 服务器套接字应用程序

    c# - 测试基于 C# 套接字的多线程服务器

    java - 哪种是杀死线程的最简洁和/或最有效的方法

    iphone - 如何用 Objective C 杀死一个线程?

    使用 Scallop 的 Scala 命令行解析器

    java - 符合specjvm2008基准测试