错开 Java Linux 进程启动以防止 OOM

错开 Java Linux 进程启动以防止 OOM

我在一台 Linux 机器上运行了许多 Java 进程。从内存和计算的角度来看,当一切处于静态时,一切都很好。

但是,我们会定期使用配置管理包升级 jar 或 war 文件,并重新启动 java 进程。

问题是,它会相对较快地重新启动它们,因此我们会同时重新启动大约 10 个 Java VM(我们使用 daemontools 来停止/启动服务),这会对机器造成严重破坏,无论是 OOM 还是运行速度都非常慢。这是因为它同时生成了 10x 个 JVM。

除了尝试错开启动时间外,还有其他更智能的方法来处理这个问题吗?也许是 sysctl 调整性能参数,或者 JVM 参数?

答案1

我认为这个概念CF引擎正在使用对您来说很棒。我不会费心进行 sysctl 调整 - 毕竟这可能会损害实际运行时性能! - 但采用与 cfengine 相同的方法。

那么它能做什么呢?cfengine 有展开时间- 如果您配置了 1000 个客户端节点来连接主服务器并询问是否有新任务要执行,则每个客户端节点都将在配置的时间 + 扩展时间连接服务器。因此,您可以将节点配置为在 00:00、01:00、02:00 连接服务器...但其中一些节点将在 00:00:00 连接服务器,一些节点将在 00:00:30 连接服务器,一些节点将在 00:01:00 连接服务器...无论您将扩展范围配置为多少。

我并不建议你真正使用 cfengine,我只是提到了 splay 时间。继续模仿它的行为吧。:-)

如果我是你,我不会尝试同时启动 10 个 Java VM,这听起来会对服务器造成严重的折磨。

答案2

是否有可以调用的脚本来启动 Java 进程,并在调用下一个 Java 应用程序之前使用计时器或监控资源使用情况来监控它?如果我不得不尝试,这听起来像是下一步要尝试的事情。

另一个解决方案是为其投入更多内存。我知道一旦一切安定下来,它就没问题了,但如果它在重新启动进程时(以及在服务器启动时)会产生如此多的抖动,投入硬件可能是解决问题最省时的方法。我从播客中依稀记得,这是 Atwood 在引导 StackOverflow/ServerFault/Superuser 网站时的理念;硬件很便宜,所以如果资源紧张,就增加更多。不过可能是记错了。只是一个想法。

答案3

另一种方法是编辑不同 Java 守护进程的运行文件,并在执行守护进程之前设置任意随机睡眠。在其他情况下手动重新启动时,这可能不是您想要的,但它可以帮助降低所有进程同时启动时的负载。

sleep $[ $RANDOM % 300 ]

相关内容