我遇到了看似随机的服务器挂起(特别是 OOM-ing)并且没有足够的技能来尝试追踪它。
我使用的是 Debian 5 VS,带有 Apache/mySQL/PHP。我还使用 mySQL 运行 Postfix。
上次发生这种情况时,我通过 ssh 登录,使用 top 查看:1. 平均负载猛增至 25 以上 2. CPU 为 49.8%wait,48.6%idle,所以是某种 IO 阻塞?3. 13 个 apache2 进程,共占用 41.4% 的内存 4. mySQL 仅显示 2.6% 的内存
内存显示:内存:总计 524512k,已使用 518144k,可用 6368k,缓冲区 800k;交换:总计 262136k,已使用 261024k,可用 1112k,缓存 22824k
我已经安装了 Munin,它并没有显示(在我这没经验的眼里)在发生这种情况时发生的任何真正异常情况 - 甚至 Postfix 在队列大小方面也没有做太多事情
df 告诉我,我只使用了 58% 的磁盘空间,所以还远没有达到极限。
php.ini 设置为最大内存 128M,最大执行时间为 30 秒
我一直在检查 apache 和 mySQL 日志,但什么也没看到。
有人能建议我下一步可以在服务器上放置什么额外的监控或进一步的日志记录吗?
最好的祝愿
彼得
答案1
触发 OOM-killer 并不奇怪,因为您已经用完了内存!您只有 512 MB 内存,现在内存已经不多了,而且您所有的 256 MB 交换空间都已在使用中。
我的建议是您购买更多内存模块并将其添加到您的服务器中。
哪些进程被 OOM-killer apache2 杀死了?您应该在 /var/log/messages 中检查这一点。
答案2
您可以尝试 ab(apache 基准)来对服务器进行压力测试,但如果“恶意代码”位于代码深处,则需要更好的调试。您应该将慢查询记录到您的数据库中。
您还可以使用 sar 来记录系统统计信息。遗憾的是,查看正在发生的事情的更好方法是记录机器上正在发生的事情,并查看每个进程正在做什么。您也可以为此编写一个脚本,但它可能会因为负载而无法运行。