有个问题让我抓狂。在我尝试修复 VPS 的 CPU 使用率问题的第二天,CPU 负载从 60% 增长到了 150%,我不知道是什么原因造成的。请帮帮我。
我在一台 1024 的 Linode 上安装了一份 mediawiki。wiki 运行在 Niginx + PHP-fpm + MySql 上。wiki 的流量不大,每天只有大约 4000 个请求,大部分来自 Google 和 Bing 机器人。之前它一直使用大约 60%(Linode 上总共 400%)的 CPU。我觉得有点高,所以两天前,我试图解决这个问题(不知道等待我的是什么)。我什么也没做,只是在 wiki 的配置文件中添加了一个新的空行,这会更改配置文件的修改时间,然后所有缓存的页面文件都将设置为无效。我以前做过这件事,这会导致 CPU 使用率过高,但通常只需几个小时就可以让一切恢复正常。这次不是,我的 CPU 使用率已经两天多的时间保持在 150% 左右了。
php-fpm 占用了大部分 CPU 资源。三个核心使用 100% 并不罕见。我以前没见过这种情况。Linode 上还有其他网站,但应该是 wiki。因为如果我离线 wiki,CPU 使用率很快就会降回 40% 左右。
那天我也复制了php-fpm.conf,并打开了它,但没有改变它。
我不知道我做错了什么。我在这里寻求帮助,以免自己发疯!!!它是 php-fpm。有没有办法找出它在做什么?我的意思是哪些脚本相关以及正在运行哪些函数代码?
顶部:
top - 06:34:33 up 10 days, 4:23, 2 users, load average: 1.10, 1.24, 1.37
Tasks: 76 total, 4 running, 72 sleeping, 0 stopped, 0 zombie
Cpu(s): 61.1%us, 3.1%sy, 0.0%ni, 32.8%id, 2.9%wa, 0.0%hi, 0.0%si, 0.1%st
Mem: 1028684k total, 945192k used, 83492k free, 89580k buffers
Swap: 524284k total, 18084k used, 506200k free, 530380k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26721 www-data 20 0 208m 54m 34m R 99 5.4 0:09.07 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
26592 www-data 20 0 207m 45m 26m R 91 4.5 0:12.77 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
26706 www-data 20 0 196m 43m 34m S 47 4.3 0:15.19 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
26583 www-data 20 0 197m 45m 35m S 33 4.5 0:19.08 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
26787 www-data 20 0 206m 36m 18m R 25 3.7 0:00.41 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
26661 www-data 20 0 207m 46m 26m S 13 4.6 0:19.87 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
1971 mysql 20 0 155m 57m 3952 S 8 5.7 383:57.81 /usr/sbin/mysqld
242 root 20 0 0 0 0 S 1 0.0 0:51.36 [kworker/3:1]
5711 root 20 0 139m 95m 580 S 1 9.5 0:41.30 /usr/local/bin/memcached -d -u root -m 128 -p 11211
19463 root 20 0 190m 3984 1284 S 1 0.4 0:02.66 /opt/php5/sbin/php-fpm --fpm-config /opt/php5/etc/php-fpm.conf
29100 www-data 20 0 10928 5540 820 S 1 0.5 4:49.05 nginx: worker process
vmstat 30
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 16912 81456 90784 554172 0 0 4 6 3 2 11 1 87 1
0 0 16912 78036 91000 555356 0 0 38 34 1397 375 12 1 87 0
4 0 16912 31776 91528 557508 0 0 78 42 3197 487 45 1 52 1
1 0 16912 83356 91768 558576 0 0 35 56 2608 449 32 1 67 1
1 0 16912 81548 92040 559720 0 0 41 31 1243 432 8 1 91 1
2 0 16912 53056 92332 562744 0 0 105 33 2013 581 17 1 81 1
2 0 16912 73236 92552 564844 0 0 68 36 1968 615 16 1 82 1
0 0 16912 91612 92904 566676 0 0 69 35 1845 692 13 1 85 1
1 0 16912 71248 93180 568428 0 0 58 33 1952 604 15 1 82 1
1 0 16868 55952 93516 572660 1 0 144 42 1801 637 12 1 86 1
2 0 16868 48324 94416 577844 0 0 189 66 2058 702 17 1 80 2
1 0 16928 58644 94592 578184 0 2 160 49 2578 723 25 1 70 3
5 0 16928 22600 94980 580568 0 0 89 32 1496 361 13 0 85 1
0 0 16988 49256 94500 576396 0 2 41 37 1601 426 14 1 85 0
5 0 18084 24336 86032 502748 0 37 83 68 2989 562 42 1 56 0
1 0 18084 123604 86376 506996 0 0 118 41 2201 573 22 1 76 1
2 0 18084 126984 86752 508876 0 0 64 53 1620 490 13 1 85 1
2 0 18084 103104 87148 510768 0 0 71 37 2757 602 33 1 64 1
答案1
尝试使用strace -p 26721
来查看进程正在做什么。要查看哪个文件句柄是哪个,请使用lsof -p 26721
。
答案2
您可以从减少 Google 和 Bing 请求开始... 您是否设置了 robots.txt?从抓取中排除 ScriptPath,以便只索引规范页面 URL,而不索引任何带有 api.php 或 index.php 参数的 URL。如果需要,还可以设置抓取延迟。
许多 MediaWiki 网站由于一些小的配置错误而被搜索引擎减慢了速度。
答案3
在我的例子中,运行 top 之后,确定了占用 CPU(用户时间为 11.8%us)的 top 的 pid(3174):
top - 12:43:19 up 1:35, 2 users, load average: 0.97, 1.05, 1.11
Tasks: 265 total, 2 running, 263 sleeping, 0 stopped, 0 zombie
Cpu(s): 11.8%us, 0.4%sy, 0.0%ni, 87.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16333780k total, 11207464k used, 5126316k free, 6464k buffers
Swap: 2097144k total, 0k used, 2097144k free, 10078524k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3174 nginx 20 0 705m 49m 23m S 33.5 0.3 1:12.21 php-fpm
3173 nginx 20 0 711m 56m 25m S 28.5 0.4 1:08.62 php-fpm
3187 nginx 20 0 711m 49m 17m S 26.2 0.3 1:00.80 php-fpm
3191 nginx 20 0 717m 59m 21m R 6.6 0.4 1:04.29 php-fpm
运行以下命令来识别导致故障的因素:
strace -ffttTo /tmp/strace.out -p 3174
该文件/tmp/strace.out.3174
充满了以下几行
12:55:17.417008 open("/var/log/php-fpm/www-error.log", O_WRONLY|O_CREAT|O_APPEND, 0644) = -1 EACCES (Permission denied) <0.000024>
12:55:17.417120 write(2, "NOTICE: PHP message: PHP Depreca"..., 186) = 186 <0.000016>
运行后:
chown -R nginx:root /var/log/php-fpm
问题已经解决。
答案4
CPU 处于 %user 状态,尝试在 top 输出中找到有关消耗最多资源的 PID 的更多信息。如前所述,在其上运行 strace -ffttTo /tmp/strace.out -p 以了解它卡在哪里或连续系统调用需要多少时间。如果有延迟,您可以从那里识别它。
此外,lsof、fuser 也是可行的选择。