如何降低JAVA应用程序的CPU使用率?

如何降低JAVA应用程序的CPU使用率?,java,linux,performance,jvm,Java,Linux,Performance,Jvm,Linux机器(CentOS 6.5 64位)上有两个Java进程(A、B)。A使用套接字向B发送大量二进制数据。B将数据写入磁盘。每秒向磁盘写入50-100MB数据。在四核处理器上,CPU的使用率接近100%。以前,我们运行了一个类似的应用程序,但它是由C编写的,只使用了25%的CPU 我们做了很多调整。我们了解到epoll有一些bug,然后我们将JDK版本升级到1.8。我们还进行了一些JVM调优。现在总的CPU使用率比以前低了,但我们并不满意。我们认为我们可以减少更多 有大量数据写入磁盘。我

Linux机器(CentOS 6.5 64位)上有两个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\u background\u比率,以便尽可能多地进行异步刷新。在我们更改了值之后,它似乎工作了,但是过了一会儿,高CPU问题再次出现


我们可以为具有高IO带宽的Java应用程序进行更多的性能调整吗?

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

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


Netflix最近提出了一种解决方法,这可能是一个有用的起点,但还有许多其他方面需要监控。

RAID究竟是条带化还是镜像。后者对提高磁盘吞吐量没有帮助。不要认为SATA3的速度是你从实际磁盘上得到的,即使是我最强大的系统上的10K RPM grunter磁盘也会以150M/s的持续吞吐量达到最大。可能是套接字代码。不可能不看到它就说。或者使用简单的流I/O而不是像NIO这样的东西。@chrylis这到底会导致100%的CPU使用率吗?除非他们一次读取一个字节,这在没有NIO的情况下是可以避免的。可能没有包装在缓冲区中。