运行java服务器时的带宽波动

我们正在运行一个分布式的java服务器系统(os:linux),通过TCP进行大量的计算。 虽然我们的stream量模式突然,但在某些机器上,我们看到networking带宽使用情况的波动如下:

02:56:32 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02:56:33 PM lo 61.00 61.00 8.69 8.69 0.00 0.00 0.00 02:56:33 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:56:33 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02:56:34 PM lo 107.00 107.00 13.70 13.70 0.00 0.00 0.00 02:56:34 PM eth0 15514.00 15794.00 8036.93 7148.15 0.00 0.00 0.00 02:56:34 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02:56:35 PM lo 59.00 59.00 8.85 8.85 0.00 0.00 0.00 02:56:35 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 [pattern continues] 

本质上,带宽使用在0-8MB /秒之间波动。 我们还没有弄清楚这种波动的原因。

任何指针/build议将有很大的帮助。

编辑1:我们有TCPNODELAY设置为true。

编辑2:Java ParNew GC在这些机器上每隔一秒运行一次。

编辑3:我们只运行一个java进程。

编辑4:我们正在运行+ XX:+ DisableExplicitGC

我认为这是你的线索:

Java ParNew GC在这些机器上每秒运行一次。

您的Java应用程序通过networking进行通信。 每隔一秒钟,您正在暂停Java应用程序以运行垃圾收集。 你只能看到每隔一秒钟的networkingstream量,这意味着应用程序只能每隔一秒钟运行一次。

似乎你的networkingstream量模式是完全符合预期的?

每两秒运行一次垃圾收集当然不会帮助你。 如果JVM本身正在运行,则需要更大的堆大小。 如果您使用System.gc()Runtime.gc()请求此集合,请尽量不要频繁请求此集合,并查看stream量模式是否遵循GC暂停。

进入您的特定应用程序垃圾收集的疑难解答是远远超出了本网站的答案的范围,但我会build议select一些对您的应用程序很重要的指标,并衡量该指标,同时尝试不同的堆大小,不同的GC请求间隔以及JVM中的不同GC。 有大量的文章使用垃圾箱来分析GC的性能。

不要太担心停顿的频率,停顿的次数或停顿的时间。 使用垃圾收集器和设置的结果是最好的衡量标准对你的应用程序的重要。

我想你会发现很多Java工程师会说不要手动请求垃圾回收。 JVM开发人员花费大量精力将GC调整为自动智能。 他们知道的不仅仅是像你们这样的凡人。 相信他们。