我们有一个位于负载均衡器后面的服务器池。此池中的计算机平均每6秒进行一次垃圾回收。垃圾收集几乎需要半秒钟。我们还看到垃圾收集过程中的CPU峰值。
客户端机器在一天内看到平均时间激增,几乎达到服务器的10%。
理论:CPU忙着做GC,这就是它无法更快地分配连接的原因。
这是一个有效的理论吗?
JVM:IBM GC算法:gencon 托儿所:5 GB 堆大小:18 GB
答案 0 :(得分:3)
我会说很多分配所有的投注都是关闭的 - 随着时间的推移它绝对会变得更糟,我的意思是如果你整天每6秒做一次GC似乎有问题。
您是否可以访问该代码?是否可以重写它以重用对象并更加智能地分配?我已经完成了一些嵌入式系统,其技巧是在系统启动并运行后永远不要调用new(如果你可以控制整个系统,那就非常可行)
如果您无法访问代码,请检查一些可用的GC调整选项(包括选择使用的垃圾收集器) - 两者都随JDK和第三方选项一起分发。您可以通过一些命令行修改来提高性能。
答案 1 :(得分:2)
我猜是可能的。
鉴于垃圾收集是一个如此密集的过程,它是否有任何理由每隔6秒发生一次?我不熟悉您正在使用的IBM JVM或特定的集合算法,因此我无法对这些进行评论。但是,Sun提供了一些很好的调优文档(现在由Oracle提供),它们讨论了不同类型的收集器以及何时使用它们。有关一些想法,请参阅this link。
证明你的理论的一种方法是添加一些代码,记录请求连接的时间和实际分配的时间。如果GC相关的CPU峰值似乎与分配连接的时间更长一致,那么这就证明了你的理论。那么你的问题就会变成如何解决它。