![apache 出现 408 错误,dhclient 和 sshd 出现“fork:无法分配内存”](https://linux22.com/image/699550/apache%20%E5%87%BA%E7%8E%B0%20408%20%E9%94%99%E8%AF%AF%EF%BC%8Cdhclient%20%E5%92%8C%20sshd%20%E5%87%BA%E7%8E%B0%E2%80%9Cfork%EF%BC%9A%E6%97%A0%E6%B3%95%E5%88%86%E9%85%8D%E5%86%85%E5%AD%98%E2%80%9D.png)
连续三个晚上,我的 EC2 服务器在响应 Web 请求时都出现 408 错误。早上我进来时,无法通过 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 出现 fork 错误,19:00 至 19:30 出现 DHCPREQUEST。但第二天早上 4:15,OOM 终止程序出现并终止了一个 httpd 进程。前两个晚上 OOM 终止程序没有出现。sshd 错误从 19:30 开始,4:15 出现大量“已收到断开连接”错误。
此主题AWS 开发人员论坛上的一篇文章称,dhclient 的环境变量中可能存在内存泄漏,但我看不出来。这似乎也不是缓慢泄漏:它每晚都发生得更早,但我在升级 dhclient 后于 17:00 重启了服务器,因此第三次启动时还不到两个小时。
我考虑过 Apache 内存泄漏,但它似乎与 Apache 日志中的任何特定内容都不相符,而且我无法通过向服务器发送多个同时占用大量内存的请求来触发它。在这种情况下,我预计 OOM 杀手在这三个晚上都参与其中。
Apache 日志中有一件值得注意的事情,那就是三行连续的时间戳:2017 年 2 月 24 日:02:10:05、2017 年 2 月 23 日:18:23:05、2017 年 2 月 24 日:07:03:20。这些请求中的第二个是 500,而不是 408。所以我猜那个请求不知怎么地运行了 8 个小时或更长时间,这可能消耗了内存。前两个晚上没有出现这种情况。
基本上,我真的不知道发生了什么。我目前的计划是在同一个放置组中启动一个新服务器,将域指向该服务器,让两者保持运行,看看会发生什么。但我正在寻找有关如何诊断和修复此问题的建议。
更新
自从按照用户 ochach 的建议安装了一个简单的 ps/cron 监视器后,我就触发了这个问题。看来我确实内存不足了,罪魁祸首是 httpd;我不知道为什么 OOM 杀手没有运行。
答案1
安装监控工具并检查哪个进程占用大量内存。然后,当您知道哪个进程发生内存泄漏时,您可以尝试隔离问题。此外,检查 dmesg 以查看内核是否终止了任何 oom。
为了查明问题,您可以添加“ps aux --sort -rss | head -n 10”每分钟运行一次并将其附加到非瞬时设备上的文件中。
除此之外,您还可以安装单独的监控程序,例如 nagios、prometeus 或使用 sar/sysstat。