我有一个在 Docker 中运行的应用程序,随着时间的推移会泄漏内存。当内存使用量超过阈值时,我需要定期重新启动此应用程序。我的应用程序可以响应信号或通过触摸tmp/restart.txt
(这是 Rails)...只要我可以运行脚本或在触发限制时发送可配置的信号,我就可以安全地关闭/重新启动我的进程。
我已经研究过使用 Docker 限制内存利用率,但是当达到限制或预留时,我没有看到自定义操作。ASIGKILL
不适合我的应用程序...我需要一些时间来清理。
我将runit用作容器内的最小初始化系统,并将ECS用于容器编排。这感觉像是在应用程序或初始化级别处理的问题......杀死容器而不是重新启动进程似乎很重。
我过去曾为此使用过Monit,但我不喜欢 Monit 处理 pidfile 的方式……Monit 经常失去对进程的控制。我正在尝试Inspeqtor,它似乎非常符合要求,但是虽然它支持 runit,但没有开箱即用的包可以与 runit 一起使用。
所以我的问题是,如果 SIGKILL 不适合我的用例,那么监控进程的内存使用情况然后根据该使用量超过阈值执行清理/重新启动操作的最佳方法是什么?