我将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中的资源枯竭(即用尽了积分)。如果我定期重新启动应用程序,则服务器将永远不会关闭。
  • 我没有禁用OOM Killer或更改任何default docker memory config
  • 我正在运行库存Amazon Amazon AMI版本2017.03。
  • 此行为在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。

    09-10 07:55
    查看更多