Linux机器上有两个Java进程(A,B)(CentOS 6.5 64位). A使用套接字向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应用程序进行更多性能调整?
解决方法:
在进行性能调优之前,您需要找出主导CPU时间的因素.
这是一个多方面的主题,您将不得不看看内核正在做什么,以什么速度发出哪些系统调用,您的访问模式是什么,文件系统和其他存储层如何影响各种文件的特征系统操作等
Netflix最近提出了一种方法到get full kernel/userspace/java stacks,这可能是一个有用的起点,但还有许多其他的东西需要监控.
标签:java,linux,jvm,performance
来源: https://codeday.me/bug/20190706/1399355.html