在过去的三个晚上,我有一个 EC2 服务器开始给出 408 错误以响应 Web 请求。当我早上进来的时候,我不能ssh进来;我必须使用管理控制台重新启动。dhclient 和 sshd 都给出了错误消息,上面写着“fork:无法分配内存”。
据我所知,这只发生在一台服务器上。每次细节都略有不同:
第一天晚上,它首先发生在 19:30 左右(根据 /var/log/messages),但仍然有“绑定到”消息。然后从20:00左右到20:30左右,有很多DHCPREQUEST,之后就没有成功绑定。sshd 错误从大约 21:10 开始(根据 /var/log/secure)。
第二天晚上,我们在 18:45 到 19:15 看到 DHCPREQUEST 行,然后开始出现 fork 错误。sshd 错误从 18:20 开始。
此时我通过 yum 升级了 dhclient,看看是否有帮助。(此时我还没有看到 sshd 错误。)它没有。
第三个晚上看起来和第一个晚上一样,18:30 出现分叉错误,19:00 到 19:30 出现 DHCPREQUEST。但随后在凌晨 4 点 15 分,OOM 杀手进来并杀死了一个 httpd 进程。OOM 杀手头两个晚上都没有出现。sshd 错误从 19:30 开始,在 4:15 出现很多“Received disconnected”错误。
AWS 开发人员论坛上的这个线程表明 dhclient 可能在环境变量中存在内存泄漏,但如果是这样,我看不到它。这似乎也不是一个缓慢的泄漏:它每天晚上都在早些时候发生,但是我在升级 dhclient 后于 17:00 重新启动了服务器,所以第三次它启动了不到两个小时。
我考虑过来自 apache 的内存泄漏,但它似乎与 apache 日志中的任何特定内容不相符,而且我无法通过同时向服务器发送多个内存密集型请求来触发它。在那种情况下,我希望 OOM 杀手整整三个晚上都参与其中。
apache 日志中有一件值得注意的事情,就是三个连续行的时间戳:24/Feb/2017:02:10:05, 23/Feb/2017:18:23:05, 24/Feb/2017:07 :03:20。这些请求中的第二个是 500,而不是 408。所以我猜该请求以某种方式运行了 8 小时或更长时间,这可能会占用内存。前两个晚上没有这样的事。
基本上,我不知道发生了什么。我目前的计划是在同一个归置组中启动一个新服务器,将域指向那个,然后让两者都运行,看看会发生什么。但我正在寻找有关如何诊断和解决此问题的建议。
更新
我已经按照用户ochach 的建议安装了一个简单的ps/cron 监视器后触发了这个。看来我确实是内存不足了, httpd 是罪魁祸首;我不知道为什么OOM杀手没有运行。
安装监控工具并检查哪个进程内存不足。当您知道哪个进程出现内存泄漏时,您可以从那里尝试隔离问题。还要检查 dmesg 是否有内核杀死的任何 oom。
要查明问题,您可以添加“ps aux --sort -rss | head -n 10”以每分钟运行一次并附加到非临时设备上的文件中。
除此之外,你可以安装单独的监控,如 nagios、prometeus 或使用 sar/sysstat。