Apache 导致系统锁定/冻结

Apache 导致系统锁定/冻结

标题中的结论可能是错误的,因为这个问题已经存在将近一年了,而且我刚刚才能够获得有关该问题的一些信息。这是在 centos 5 上运行的,运行在具有 384 MB Ram 的旧 PIII 上。请注意,大约一年前,当我不记得具体发生了什么变化时,这台服务器运行良好。不过,它可能运行的是较旧的 CentOS。

uname 显示“Linux localhost.localdomain 2.6.18-410.el5.centos.plus #1 SMP 2016 年 5 月 11 日星期三 21:46:57 EDT i686 i686 i386 GNU/Linux”

问题表现为每隔几天就会随机冻结一次,有时一天两次。这种冻结并不是真正的冻结,因为如果我尝试使用 ssh 连接到服务器,几分钟后,我会收到用户提示,而过了很长时间后,我会因超时而断开连接,因此我无法输入密码。但最终,如果我让它“冻结”一两天,它就会完全锁定。

唯一的解决办法是按下按钮重新启动。

昨天我终于从物理服务器得到提示,即在冻结时 HDD 指示灯完全亮起(之前我没有注意到,因为我并没有真正注意),所以我启动了 IOTOP 来监控活动并让它在 putty 窗口中运行。

刚才它突然卡住了。以下是屏幕截图。

截屏

我看到有很多 httpd 进程、几个 mysqld 进程,最上面的是 jurnaling。

我不知道在我的服务器冻结的情况下如何解释这些百分比。

我强烈地感觉到这是一个配置问题,我应该能够通过调整一些配置来控制它,但我无法猜出那是什么。

我确实知道每隔几个小时重启一次 Apache 会延长服务器正常运行的时间。如果我的流量增加(从每天很少的几次访问开始),那么服务器会在几个小时内冻结。

还有什么需要检查的吗?或者需要调整哪些配置?

谢谢。

答案1

经过多次尝试和错误之后,我找到了一个解决方法,因为我还没有找到这个问题的根本原因。(我的意思是,似乎每隔 1-2 天就会有随机 IP 针对我的服务器)。我使用 htpd 服务器状态页面,然后使用 atop 实用程序查看在冻结期间占用了哪些资源,最后发现是磁盘的问题。

经过多次尝试,我终于想出了以下脚本。首先,允许的 httpd 子进程数量有上限,因为在我的例子中,正常操作不会生成超过 20 个子进程。仅进行该检查是不够的,因为有几次服务器冻结后需要大约 24 小时才能开始计算进程数。因此需要进行 iostat 检查,该检查以 5+5 秒的间隔进行 2 次,以避免本地硬盘使用率激增。

cnt=`ps -Af | grep httpd | grep -v rotatelogs | grep -v grep | wc -l`
now=`date +%Y-%m-%d_%H-%M`

if [ $cnt -ge 40 ]
then
  /usr/bin/wget -q -O /root/apache_status_$now http://<your server here>/server-status
  /sbin/service httpd restart
fi

# your hdd here
dsk=`/usr/bin/iostat -dx /dev/hda 5 2 | grep hda | tail -1 | awk '{print $12}'`

if (( $(echo "$dsk > 98" |bc -l) ))
then
  /bin/sleep 5
  dsk=`/usr/bin/iostat -dx /dev/hda 5 2 | grep hda | tail -1 | awk '{print $12}'`
  if (( $(echo "$dsk > 98" |bc -l) ))
  then
    /sbin/service httpd restart
  fi
fi

以上内容在 cron 作业中运行,如下所示

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /root/monitor-apache.sh

希望这可以帮助人们处理类似的情况。

相关内容