在Linux机器(CentOS 6.564位)上有两个Java进程(A,B)。A使用套接字向B发送大量二进制数据。B将数据写入磁盘。每秒有50-100MB的数据被写入磁盘。在四核处理器上,CPU的使用率接近100%。之前我们运行了一个类似的应用程序,但是用C语言写的,只使用了25%的CPU。
我们已经做了很多调整。我们了解到epoll有一些bug,于是我们将JDK版本升级到1.8。我们还做了一些JVM调优。现在CPU的总使用率比以前低了,但我们并不满意。我们认为我们可以减少更多。
有大量数据写入磁盘。我们认为磁盘不是瓶颈。因为我们使用的是大型突袭。我们之前用更多的磁盘带宽运行了用C编写的类似的应用程序,一切正常。
但我们也发现了一个问题。当内核将脏数据刷新到磁盘时,CPU使用率将非常高。因此,我们增加/proc/sys/vm/脏背景比率,以便尽可能多地进行异步刷新。在我们改变值之后,它看起来是有效的,但是过了一段时间,高CPU的问题又出现了。
我们能为高IO带宽的Java应用程序做更多的性能调优吗?
发布于 2015-08-11 16:04:01
在进行性能调优之前,您需要找出主宰CPU时间的因素。
这是一个多方面的话题,你必须看看内核在做什么,以什么速率发出哪些系统调用,你的访问模式是什么,文件系统和其他存储层如何影响各种文件系统操作的特征等。
Netflix最近提出了一种get full kernel/userspace/java stacks的方法,这可能是一个有用的起点,但还有许多其他事情需要监控。
https://stackoverflow.com/questions/31911073
复制相似问题