在一个Linux机器(CentOS 6.5 64位)上有两个Java进程(A,B)。A使用sockets向B发送大量二进制数据。B将数据写入磁盘。每秒钟会写入50-100MB的数据。在四核处理器上,CPU几乎达到100%。之前我们运行过一个类似的应用程序,但是采用了C编写,只使用了25%的CPU。
我们进行了很多调优。我们了解到epoll存在一些错误,因此我们将JDK版本升级到了1.8。我们还进行了一些JVM调优。现在总体CPU使用率比以前低,但我们并不满意。我们认为我们可以进一步降低它。
有大量的数据写入磁盘。我们认为磁盘不是瓶颈所在,因为我们使用的是大型RAID。我们以前运行过采用更高磁盘带宽的C编写的类似应用程序,并且一切正常。
但是我们也发现了一个问题。当内核将脏数据刷新到磁盘时,CPU使用率会非常高。因此,我们增加了/proc/sys/vm/dirty_background_ratio以尽可能进行异步刷新。更改值后,似乎可以工作,但过了一段时间之后,高CPU问题又会出现。
我们能否对具有高IO带宽的Java应用程序进行更多性能调优?
我们进行了很多调优。我们了解到epoll存在一些错误,因此我们将JDK版本升级到了1.8。我们还进行了一些JVM调优。现在总体CPU使用率比以前低,但我们并不满意。我们认为我们可以进一步降低它。
有大量的数据写入磁盘。我们认为磁盘不是瓶颈所在,因为我们使用的是大型RAID。我们以前运行过采用更高磁盘带宽的C编写的类似应用程序,并且一切正常。
但是我们也发现了一个问题。当内核将脏数据刷新到磁盘时,CPU使用率会非常高。因此,我们增加了/proc/sys/vm/dirty_background_ratio以尽可能进行异步刷新。更改值后,似乎可以工作,但过了一段时间之后,高CPU问题又会出现。
我们能否对具有高IO带宽的Java应用程序进行更多性能调优?