【发布时间】: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