【问题标题】:How to reduce JAVA applications CPU usage?如何降低 JAVA 应用程序的 CPU 使用率?
【发布时间】:2015-11-01 20:48:00
【问题描述】:

Linux 机器(CentOS 6.5 64bit)上有两个 Java 进程(A、B)。 A 使用套接字向 B 发送大量二进制数据。 B 将数据写入磁盘。每秒有 50-100MB 数据写入磁盘。在四核处理器上,CPU 几乎 100% 被使用。之前我们运行了一个类似的应用程序,但是用 C 编写,只使用了 25% 的 CPU。

我们做了很多调整。我们了解到epoll的一些bug,然后我们将JDK版本升级到1.8。我们还做了一些 JVM 调优。现在总的 CPU 使用率比以前低了,但我们并不满意。我们认为我们可以进一步减少它。

有大量数据写入磁盘。我们认为磁盘不是瓶颈。因为我们使用的是大型 RAID。我们之前用更大的磁盘带宽运行了类似的 C 编写的应用程序,一切正常。

但我们也发现了一个问题。当内核将脏数据刷新到磁盘时,CPU 使用率会非常高。所以我们增加 /proc/sys/vm/dirty_background_ratio 以尽可能地进行异步刷新。我们改了值之后,好像可以了,但是过了一会,CPU高的问题又来了。

我们能否对高 IO 带宽的 Java 应用程序进行更多的性能调优?

【问题讨论】:

  • RAID-究竟是什么,我们在谈论条带化还是镜像。后者对磁盘吞吐量没有帮助。并且不要认为 SATA3 速度是您从实际磁盘中获得的速度,即使是我最强大的系统上的 10K RPM grunter 磁盘也能达到大约 150M/s 的持续吞吐量。
  • 可能是套接字代码。没有看到就不可能说出来。
  • 或者使用简单的流 I/O 代替 NIO 之类的东西。
  • @chrylis 这究竟是如何导致 100% 的 CPU 使用率的?除非他们一次读取一个字节,这在没有 NIO 的情况下是可以避免的。
  • 我说“天真”。也许没有包装在缓冲区中。

标签: java linux performance jvm


【解决方案1】:

在进行性能调优之前,您需要找出主导 CPU 时间的因素。

这是一个多方面的话题,你必须看看内核在做什么,以什么速率发出哪些系统调用,你的访问模式是什么,文件系统和其他存储层如何影响特性各种文件系统操作等。

Netflix 最近向get full kernel/userspace/java stacks 提出了一种方法,这可能是一个有用的起点,但还有许多其他事情需要监控。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2013-02-07
    • 2023-04-03
    相关资源
    最近更新 更多