我在AWS上的docker容器中托管了一个Ruby应用程序。不幸的是,这个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中的资源耗尽(即用尽信用)。如果我定期重启应用程序,服务器永远不会停机。
我在这里非常茫然;为什么内存压力会导致机器锁定?
答案 0 :(得分:2)
显然我提供的解决方案似乎没有帮助提出问题的人,但它可能会帮助那些在这里绊倒的人。以下是我建议的可能导致问题的两件事。
建议1
我猜你正在使用官方的ruby docker镜像,当你运行容器时,ruby在容器内以php artisan migrate
运行。
如果ruby以PID 1
运行,那么OOM杀手就无法杀死它,导致你看到的所有问题。
要解决此问题,您必须确保正确的PID 1
流程运行为init
。
Docker 1.25及更高版本具有PID 1
命令的--init
选项。此选项将确保正确的docker run
处理init
的任务,它还会将所有SIGNAL传递给您的ruby应用程序。
https://docs.docker.com/engine/reference/commandline/run/
- init API 1.25+在容器内运行init,转发信号并重新获得进程
以下是docker用作PID 1
的内容
https://github.com/krallin/tini
建议2
Amazon Linux AMI存在已知问题,可在以下链接https://github.com/aws/amazon-ecs-agent/issues/794找到详细信息。在写作时,我不确定AMI的问题是否已修复。
因此,尝试使用该线程中建议的不同AMI来表示Ubuntu AMI。
答案 1 :(得分:1)
我认为您假设OOM将始终以您的Ruby应用程序为目标,但我不认为是这种情况。你的日志行显示它杀死你tty连接而不是。我打赌它会在你的Ruby进程之前杀死其他进程,这就是为什么你的机器似乎没有响应的原因。您可以阅读OOM的工作原理,它可能会有所帮助。我会专注于你的oom_scores,看看你在那里找到了什么。
http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html
祝你好运