我将Ruby应用程序托管在AWS的docker容器中。不幸的是,众所周知该Ruby应用程序会泄漏内存,因此最终它将消耗所有可用内存。
我也许天真地期待OOM杀手级程序被调用并杀死Ruby进程,但是什么也没有发生。最终,机器变得无响应(Web服务器无响应,ssh被禁用)。我们强制从AWS控制台重启机器,并在消息日志中获得以下信息,因此在重启时它确实还处于事件状态:
Apr 30 23:07:14 ip-10-0-10-24 init: serial (ttyS0) main process (2947) killed by TERM signal
我不认为这是AWS中的资源枯竭(即用尽了积分)。如果我定期重新启动应用程序,则服务器将永远不会关闭。
我在这里很茫然。为什么内存压力会导致计算机锁定?
最佳答案
显然,我提供的解决方案似乎并没有帮助提出该问题的人,但可能会帮助在这里绊倒的其他人。以下是我建议的可能导致此问题的两件事。
建议1
我猜您正在使用正式的ruby docker镜像,并且当您运行容器时,ruby在容器内以PID 1
的形式运行。
如果 ruby 以PID 1
的身份运行,那么OOM杀手将无法将其杀死,从而导致您所看到的所有问题。
要解决此问题,您将必须确保正确的init
进程作为PID 1
运行。
Docker 1.25及更高版本具有--init
命令的docker run
选项。此选项将确保正确的init
处理PID 1
的任务,并且还将所有SIGNAL传递给您的ruby应用程序。
https://docs.docker.com/engine/reference/commandline/run/
以下是docker用作init
的内容
https://github.com/krallin/tini
建议2
Amazon Linux AMI存在一个已知问题,可以在以下链接https://github.com/aws/amazon-ecs-agent/issues/794中找到详细信息。在撰写本文时,我不确定AMI的问题是否已解决。
因此,请按照该线程中的建议尝试使用另一个AMI,例如Ubuntu AMI。