0 linux svn centos6 apache-2.2
大约 5 天以来,似乎突然之间,我的 linux 服务器不时开始锁定。
就我从 top 和 iotop 命令开始发生的时间来看,模式总是相同的:
一个或多个 httpd 进程(通常是一个)挂起并开始使用 100% 的 CPU 功率,%wa 接近 100%,在 iotop 中,我看到几个 httpd 进程在 IO 列中使用了 99.99%。
我还在这台机器上通过 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
Run Code Online (Sandbox Code Playgroud)
这是 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
Run Code Online (Sandbox Code Playgroud)
我还为 pid 10390 运行了 lsof -p ,它在 top 命令下位于顶部,这是我可以看到这是什么请求的底线,它说 CLOSE_WAIT:
httpd 10390 apache 34u IPv6 315879 0t0 TCP default-domain.com:https->crawl-66-249-65-91.googlebot.com:42907 (CLOSE_WAIT)
Run Code Online (Sandbox Code Playgroud)
我仍然不确定究竟是什么导致这一切发生?
我终止了该服务,但 %wa 和负载平均值仍然很高,我还停止了 mysqld 和其他服务。它真的只有在我完全停止 httpd 后才会下降,即使那样我也无法启动它,而不会通过“netstat -tulpn”找到剩余的挂起 httpd 进程,杀死这些进程或执行“killall -9 httpd”并等待一段时间后循环遍历所有这些然后执行 /etc/init.d/httpd start
首先,您的内存不足。
您的 VPS 有 2GB 的 RAM 和 4GB 的交换空间。2GB 的 RAM 已全部用完,交换区可能已满 3/4。在这一点上,在我管理的任何系统上,每五分钟都会出现一次警报,直到有人确认问题为止,这就是严重的问题。
所以你需要弄清楚是什么在使用所有内存。不幸的是,这可能很困难。
我可以看到单独一个 Apache 进程正在使用近 1GB 的内存。这显然是一个异常值,因为大多数其他人每个使用不到 22MB。
这之所以困难,是因为 Apache 允许您将 Perl 或 PHP 等语言直接嵌入到进程中,而且几乎可以肯定,这种脚本已经跑掉并耗尽了您的所有 RAM。
在这一点上,您的系统所能做的就是反复进出交换(这正是iotop
它所做的),直到有人对一个放置良好的kill -9
.
因此,您的下一步是尝试找出哪个脚本出了问题并占用了您所有的 RAM。