服务器定期无响应,OOM杀手无效?

时间:2018-05-01 16:07:05

标签: ruby linux amazon-web-services docker out-of-memory

我在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中的资源耗尽(即用尽信用)。如果我定期重启应用程序,服务器永远不会停机。

  • 我没有禁用OOM Killer或更改任何default docker memory config
  • 我正在运行亚马逊Linux AMI版本2017.03 内核。
  • 此行为发生在AWS
  • 中的多个虚拟实例中

我在这里非常茫然;为什么内存压力会导致机器锁定?

2 个答案:

答案 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

祝你好运