我有一个 Web 服务器,偶尔会完全停止工作。在崩溃之前,Web 请求、CPU 使用率、内存使用率、磁盘使用率或网络使用率都没有出现峰值。只是所有使用率图表突然降至 0,服务器基本无法访问。我仍然可以 ping 服务器,实际上我可以在端口 80 和 22 上建立连接,但除了 ping 响应之外,我从未收到任何响应。
重新启动服务器会导致完全恢复。这种崩溃大约每隔 18-36 小时发生一次。这是一台在 Amazon EC2 上运行 Ubuntu 11.04(带有原版 PHP 5.3、Apache、JVM)的虚拟机。我创建了数十台服务器,结果都一样,所以这不是硬件问题。我尝试使用 Ubuntu 10.10 从头开始重建服务器映像,但没有任何效果。
我可以尝试什么来诊断这个问题?
编辑,更多详细信息:我有一个 cron 作业,以 root 身份每分钟运行一次,记录详细 Apache 状态的输出(正在运行哪些 URL、运行多长时间等)。崩溃前的最后一条日志看起来正常,崩溃发生后 cron 作业甚至没有运行(根据 /var/log/auth.log)。
编辑,为了清楚起见:我可以 telnet 到端口 22,但不能通过 SSH 到它。我可以 telnet 到端口 80,但对 HTTP GET 没有任何响应。
答案1
您的 Java 应用程序有问题。使用 制作 2-3 个线程转储kill -3 <jvm_pid>
。您可以在文件中找到线程转储/proc/<jvm_pid>/fd/1
。将线程转储发送给 Java 开发人员以搜索卡住或锁定的线程。
PHP 也可能发生同样的事情。检查 apache 状态以查看有多少个连接、处于什么状态以及它们位于哪个页面上。
编辑: 作为一种不太好的解决方法,您可以重新启动 java 进程,而不是重新启动 VM。
答案2
您应该检查一下 sar - 希望它已经在运行并且每隔几分钟收集大量的系统统计信息。
以下是一些有关在 ubuntu 上启用 sar 的信息。
启用后,您可以运行sar -A
以查看已收集的统计数据。希望其中的一些信息能为您指明正确的方向,例如,它应该显示您的机器是否突然使用了大量虚拟内存。
dmesg
输出在这里也非常有用——也许是奇怪的驱动程序问题导致机器没有响应?
答案3
您是否已安装并使用 nscd?过去,如果 nscd 死机但留下其 pid,它确实会导致奇怪的死机。