![是什么消耗了我的 CPU?](https://linux22.com/image/201453/%E6%98%AF%E4%BB%80%E4%B9%88%E6%B6%88%E8%80%97%E4%BA%86%E6%88%91%E7%9A%84%20CPU%EF%BC%9F.png)
我面临着一个困难的处境。 100% CPU,但我看不到在 top 或 htop 中使用太多的单个进程。
我运行这个命令:
:~$ ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10
%CPU PID USER COMMAND
5.1 34 root [kswapd0]
2.4 1 root /sbin/init
2.3 1815 mysql /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
0.6 25583 super top
0.5 12964 mysite /usr/bin/php-cgi7.2
0.4 13313 mysite /usr/bin/php-cgi7.2
0.4 13311 mysite /usr/bin/php-cgi7.2
0.4 13310 mysite /usr/bin/php-cgi7.2
0.4 13309 mysite /usr/bin/php-cgi7.2
这并不能解释为什么 top 和 htop 显示 100% CPU。
top - 22:17:15 up 3:14, 2 users, load average: 104.14, 102.73, 87.49
Tasks: 392 total, 103 running, 251 sleeping, 1 stopped, 0 zombie
%Cpu(s): 25.7 us, 72.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 1.6 si, 0.0 st
KiB Mem : 2040972 total, 77924 free, 1666072 used, 296976 buff/cache
KiB Swap: 3906244 total, 1093324 free, 2812920 used. 187268 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
34 root 20 0 0 0 0 S 17.7 0.0 11:06.77 kswapd0
1815 mysql 20 0 1395428 24804 600 S 7.2 1.2 4:11.76 mysqld
1 root 20 0 225472 4396 2768 S 4.6 0.2 4:50.26 systemd
31359 root 20 0 189660 68472 2124 R 2.0 3.4 0:02.34 /usr/share/webm
12975 mysite 20 0 522728 16780 2500 R 1.0 0.8 0:08.91 php-cgi7.2
13278 mysite 20 0 522728 17000 5372 R 1.0 0.8 0:08.27 php-cgi7.2
13311 mysite 20 0 522728 16468 3092 R 1.0 0.8 0:08.07 php-cgi7.2
28715 super 20 0 32716 2112 1108 S 1.0 0.1 0:04.79 htop
7 root 20 0 0 0 0 R 0.7 0.0 0:23.60 ksoftirqd/0
12964 mysite 20 0 522728 17032 2504 R 0.7 0.8 0:09.36 php-cgi7.2
13008 mysite 20 0 522728 15728 2752 R 0.7 0.8 0:08.70 php-cgi7.2
13031 mysite 20 0 522728 18820 5808 R 0.7 0.9 0:08.72 php-cgi7.2
13039 mysite 20 0 522728 15856 2412 R 0.7 0.8 0:08.75 php-cgi7.2
13053 www-data 20 0 199312 6332 4336 R 0.7 0.3 0:00.46 apache2
13085 mysite 20 0 522728 16700 2440 R 0.7 0.8 0:08.60 php-cgi7.2
13094 www-data 20 0 199312 6896 4608 R 0.7 0.3 0:00.49 apache2
13125 mysite 20 0 522728 11152 2764 R 0.7 0.5 0:08.54 php-cgi7.2
13134 mysite 20 0 522728 19504 2780 R 0.7 1.0 0:08.58 php-cgi7.2
13161 mysite 20 0 522728 15324 2728 R 0.7 0.8 0:08.55 php-cgi7.2
13164 mysite 20 0 522728 15444 2480 R 0.7 0.8 0:08.54 php-cgi7.2
13174 mysite 20 0 522728 11712 2816 R 0.7 0.6 0:08.65 php-cgi7.2
13178 mysite 20 0 522728 12808 2768 R 0.7 0.6 0:08.57 php-cgi7.2
13185 mysite 20 0 522728 16080 2388 R 0.7 0.8 0:08.51 php-cgi7.2
13208 mysite 20 0 522728 13268 2424 R 0.7 0.7 0:08.38 php-cgi7.2
13210 mysite 20 0 522728 12744 2824 R 0.7 0.6 0:08.42 php-cgi7.2
13229 mysite 20 0 522728 15552 2704 R 0.7 0.8 0:08.46 php-cgi7.2
13230 mysite 20 0 522728 14944 2484 R 0.7 0.7 0:08.43 php-cgi7.2
13235 mysite 20 0 522728 15592 2468 R 0.7 0.8 0:08.42 php-cgi7.2
13236 mysite 20 0 522728 13832 2724 R 0.7 0.7 0:08.34 php-cgi7.2
13267 mysite 20 0 522728 16212 2488 R 0.7 0.8 0:08.36 php-cgi7.2
13275 mysite 20 0 522728 16228 3036 R 0.7 0.8 0:08.28 php-cgi7.2
13280 mysite 20 0 522728 15872 3140 R 0.7 0.8 0:08.23 php-cgi7.2
13284 mysite 20 0 522728 17144 5536 R 0.7 0.8 0:08.14 php-cgi7.2
13287 mysite 20 0 522728 15416 6132 R 0.7 0.8 0:08.31 php-cgi7.2
13288 mysite 20 0 522728 16024 3088 R 0.7 0.8 0:08.17 php-cgi7.2
13289 mysite 20 0 522728 14048 6344 R 0.7 0.7 0:08.23 php-cgi7.2
13291 mysite 20 0 522728 16468 2828 R 0.7 0.8 0:08.09 php-cgi7.2
13294 mysite 20 0 522728 15120 6196 R 0.7 0.7 0:08.16 php-cgi7.2
13296 mysite 20 0 522728 11564 3236 R 0.7 0.6 0:08.10 php-cgi7.2
13300 mysite 20 0 522728 17032 3104 R 0.7 0.8 0:08.15 php-cgi7.2
13303 mysite 20 0 522728 15636 3108 R 0.7 0.8 0:08.19 php-cgi7.2
13306 mysite 20 0 522728 17340 5720 R 0.7 0.8 0:08.12 php-cgi7.2
我尝试了这个:我停止了 mySQL,CPU 下降到 20%~30% 范围(主要是 htop 中的 apache 进程)。我停止了 apache,CPU 下降到 0%~2% 范围。我启动了 mySQL,CPU 停留在 0%~2% 的范围内。我启动了 apache,CPU 立即达到 100%。
即使服务器处于 100% 状态,我也可以使用工作台与 mySQL 进行通信(尽管提取在 2 秒内完成,而不是 0.08 秒)。然而Apache完全没用,而且超时了。谢谢你的帮助。
更新#1
我有 7 个大型进程 >1%cpu(总共 49.4%cpu):
303 mysql 15.00% /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
34 root 10.40% [kswapd0]
12926 root 10.10% [/usr/share/webm] <defunct>
13082 root 5.80% /usr/share/webmin/authentic-theme/stats.cgi
10154 root 2.90% /usr/share/webmin/virtual-server/collectinfo.pl
1 root 2.50% /sbin/init
32750 super 1.10% htop
我有 100 个进程,例如(CPU 总量的 40%):
mysite 0.40% /usr/bin/php-cgi7.2
我有 6 个小进程 <1%cpu(总共 1.6%cpu):
我有 152 个小进程,例如 <0.0%cpu(??% cpu 总计):
www-data 0.0% /usr/sbin/apache2 -k start
我有 134 个小进程 <0.0%cpu(??%cpu 总计)
152 和 134 个小进程的总数必须约为 9%,因为其余进程的总数为 91%。
更新#2 为什么我有 152 个 apache 进程在运行?这是我的 apache mpm_prefork.conf 文件。我想我达到了 MaxRequestWorkers 限制?
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
我的服务器是否受到攻击或者这是正常现象吗?在删除所有内容并从头开始安装之前,有什么想法可以解决这个问题吗?
更新#3
我认为这是一次 DoS 攻击。我在 VPS 控制面板(VPS 本身之外)中创建了防火墙,并仅允许来自我的私有 IP 的传入流量。 CPU 下降至 0.7%。我不认为我的顾客一天之内就增加了100倍!在我们发言时,我的 VPS 提供商正在研究这个问题。我会更新。