Linux服务器的Apache HTTPD进程采取I / O等待接近100%,并locking服务器

现在大概有5天了,而且看似突然间,我的linux服务器已经开始不时地locking了。

这个模式总是和我在top和iotop命令开始发生时所说的一样:

一个或多个httpd进程(通常是一个)挂起并开始占用100%的CPU功耗,%wa接近100%,在IO栏中,我看到IO列中有99.99%的httpd进程。

我也通过Apache在这台机器上运行一个SVN服务器,我一直能够重现这一点的一种方式是从这个服务器上的存储库执行SVN提交的新文件或SVN更新(我是只有一个使用这个SVN仓库)。 这总是能够成功地重现这个场景,但直到最近,我在SVN检入/检出方面都没有任何问题。

但是有时候它看起来似乎没有任何可检测的原因。

所以看起来像我的Apache有一些问题,导致它有进程使用了​​大量的读/写某些触发器。

我想知道是否有人能帮我发现这个问题。

编辑:好吧,现在它再次发生:

这是顶部:

[root@server ~]# top top - 10:56:54 up 2:59, 5 users, load average: 171.46, 70.35, 27.01 Tasks: 328 total, 2 running, 326 sleeping, 0 stopped, 0 zombie Cpu(s): 1.9%us, 2.0%sy, 0.0%ni, 0.0%id, 96.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2021144k total, 1968192k used, 52952k free, 2500k buffers Swap: 4194288k total, 2938584k used, 1255704k free, 39008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10390 apache 20 0 2774m 936m 6200 D 2.0 47.4 1:52.27 httpd 2149 root 20 0 927m 13m 1040 S 0.7 0.7 1:50.46 namecoind 11 root 20 0 0 0 0 R 0.3 0.0 0:30.10 events/0 23 root 20 0 0 0 0 S 0.3 0.0 0:17.88 kblockd/1 2049 root 20 0 382m 4932 2880 D 0.3 0.2 0:03.67 httpd 2144 root 20 0 1702m 69m 1164 S 0.3 3.5 5:19.68 bitcoind 6325 root 20 0 15164 1100 656 R 0.3 0.1 0:11.09 top 10311 apache 20 0 387m 9496 7320 D 0.3 0.5 0:01.89 httpd 10313 apache 20 0 391m 10m 7364 D 0.3 0.5 0:02.40 httpd 10466 apache 20 0 399m 12m 7392 D 0.3 0.7 0:02.41 httpd 10599 apache 20 0 391m 9324 7340 D 0.3 0.5 0:00.15 httpd 10628 apache 20 0 384m 7620 4052 D 0.3 0.4 0:00.01 httpd 10633 apache 20 0 384m 7048 3504 D 0.3 0.3 0:00.01 httpd 10634 apache 20 0 384m 8012 4048 D 0.3 0.4 0:00.02 httpd 10638 apache 20 0 400m 22m 9.8m D 0.3 1.1 0:01.93 httpd 10640 apache 20 0 385m 8288 4028 D 0.3 0.4 0:00.03 httpd 10641 apache 20 0 401m 21m 6376 D 0.3 1.1 0:01.45 httpd 10759 apache 20 0 385m 8816 3480 D 0.3 0.4 0:01.45 httpd 10773 apache 20 0 384m 8044 3464 D 0.3 0.4 0:00.02 httpd 

这是一个iotop快照:

 Total DISK READ: 5.93 M/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 10732 be/4 apache 3.76 K/s 0.00 B/s 0.00 % 58.48 % httpd 876 be/3 root 0.00 B/s 52.68 K/s 0.00 % 52.98 % [jbd2/dm-1-8] 10906 be/4 root 124.17 K/s 0.00 B/s 0.00 % 23.03 % sh -c [ -x /usr/local/psa/admin/sbin/backupmng ] && /usr/local/psa/admin/sbin/backupmng >/dev/null 2>&1 2156 be/4 root 206.94 K/s 0.00 B/s 0.00 % 21.15 % bitcoind 10904 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 18.94 % mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock 10773 be/4 apache 7.53 K/s 0.00 B/s 0.00 % 14.77 % httpd 10641 be/4 apache 15.05 K/s 0.00 B/s 0.00 % 11.57 % httpd 10399 be/4 apache 1057.29 K/s 0.00 B/s 43.16 % 10.56 % httpd 10682 be/4 sw-cp-se 158.03 K/s 0.00 B/s 0.00 % 7.45 % sw-engine-cgi -c /usr/local/psa/admin/conf/php.ini -d auto_prepend_file=auth.php3 -u psaadm 10774 be/4 apache 3.76 K/s 0.00 B/s 0.00 % 6.53 % httpd 10624 be/4 apache 0.00 B/s 0.00 B/s 0.00 % 5.53 % httpd 10356 be/4 apache 899.26 K/s 0.00 B/s 35.52 % 4.01 % httpd 10795 be/4 apache 0.00 B/s 0.00 B/s 0.00 % 3.93 % httpd 10804 be/4 apache 7.53 K/s 0.00 B/s 0.00 % 3.08 % httpd 4379 be/4 root 2.89 M/s 0.00 B/s 99.99 % 0.00 % namecoind 10619 be/4 apache 462.80 K/s 0.00 B/s 7.80 % 0.00 % httpd 10636 be/4 apache 3.76 K/s 0.00 B/s 0.00 % 0.00 % httpd 10716 be/4 mysql 105.35 K/s 0.00 B/s 5.92 % 0.00 % mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock 1988 be/4 root 18.81 K/s 0.00 B/s 0.00 % 0.00 % spamd_full.sock 

我也跑了lsof -p,这是顶层命令顶部的顶层命令10390,这是底线,我可以看到这是什么请求,它说CLOSE_WAIT:

 httpd 10390 apache 34u IPv6 315879 0t0 TCP default-domain.com:https->crawl-66-249-65-91.googlebot.com:42907 (CLOSE_WAIT) 

我仍然不确定究竟是什么造成了这一切发生?

我杀了那个服务但%wa和load average保持高,我也停止了mysqld和其他服务。 一旦我完全停止了httpd,它真的只会下降,即使如此,我不能通过“netstat -tulpn”find剩下的挂起的httpd进程,杀死那些或做“killall -9 httpd”,并等待一段时间后循环所有那些然后做/etc/init.d/httpd start

首先,你已经用完了记忆。

你的VPS有2GB的内存和4GB的交换空间。 2GB的RAM全部用完,交换可能是3/4满。 此时,在我pipe理的任何系统上, 每隔五分钟就会有一个重复的警报,直到有人承认问题,这是严重的。

所以你需要弄清楚什么是使用所有的内存。 不幸的是这可能是困难的。

我可以看到, 单独的一个Apache进程正在使用近1GB的内存。 这显然是一个exception,因为其他大多数使用不到每个22MB。

这很困难的原因是Apache允许你直接将Perl或PHP等语言embedded进程中,而且几乎可以肯定这样的脚本已经跑掉了,并吞噬了所有的RAM。

你所有的系统在这个时候都可以进行交换(这正是iotop显示它所做的),直到有人显示它与一个很好的kill -9

所以你的下一步是要弄清楚脚本是干什么的,吃掉你所有的内存。

  10390 apache 20 0 2774m 936m 6200 D 2.0 47.4 1:52.27 httpd 2049 root 20 0 382m 4932 2880 D 0.3 0.2 0:03.67 httpd 10311 apache 20 0 387m 9496 7320 D 0.3 0.5 0:01.89 httpd 10313 apache 20 0 391m 10m 7364 D 0.3 0.5 0:02.40 httpd 10466 apache 20 0 399m 12m 7392 D 0.3 0.7 0:02.41 httpd 10599 apache 20 0 391m 9324 7340 D 0.3 0.5 0:00.15 httpd 10628 apache 20 0 384m 7620 4052 D 0.3 0.4 0:00.01 httpd 10633 apache 20 0 384m 7048 3504 D 0.3 0.3 0:00.01 httpd 10634 apache 20 0 384m 8012 4048 D 0.3 0.4 0:00.02 httpd 10638 apache 20 0 400m 22m 9.8m D 0.3 1.1 0:01.93 httpd 10640 apache 20 0 385m 8288 4028 D 0.3 0.4 0:00.03 httpd 10641 apache 20 0 401m 21m 6376 D 0.3 1.1 0:01.45 httpd 10759 apache 20 0 385m 8816 3480 D 0.3 0.4 0:01.45 httpd 10773 apache 20 0 384m 8044 3464 D 0.3 0.4 0:00.02 httpd 

这显示了D状态下很多apache进程。linux计算负载平均值的方式是运行进程(R)+不间断状态进程(D)

您可以使用top命令轻松找出这些进程,也可以使用

  ps auwx | awk '$8 ~ "D"' 

所以看看输出你的主要问题是I / O。 请在发布期间运行以下命令,然后粘贴输出以进行分析

 sar -u 1 10 --> look for iowait sar -q 1 10 --> look for load avg iowait -x 1 10 --> to get a real picture of I/O iotop --> to see what process causing I/O and its avilable >=5.8 echo t > /proc/sysrq-trigger blktrace --> if you want to dig more about I/O and use to see per I/O basis,I created a video related to that,hope that is helpful 

https://www.youtube.com/watch?v=s0XSWbIF84I&list=PLckUzKjgYDgajJVYOjNztS6Q4SOho0RKY&index=7

只是补充,你不能杀死D状态进程,D状态不会在不可中断的睡眠进程中响应信号,任务被阻塞时发送的任何信号只要返回到进程'R'或'S'状态(通常一旦IO或其他内核活动完成)。

来自wiki的专家

  An uninterruptible sleep state is a sleep state that won't handle a signal right away. It will wake only as a result of a waited-upon resource becoming available or after a time- out occurs during that wait (if specified when put to sleep). It is mostly used by device drivers waiting for disk or network IO (input/output). When the process is sleeping uninterruptibly, signals accumulated during the sleep will be noticed when the process returns from the system call or trap.