
服务器CPU突然100%,网站卡成幻灯片,这是每个站长迟早会遇到的事故。我处理过不少次,有被采集爬虫刷的,有被挖矿木马钻的,也有自己代码写死循环的。今天把排查流程整理成六步,按顺序走,大部分情况十分钟内能定位。
第一步,确认是不是真的高。登录服务器,跑top,按P键按CPU排序,看哪个进程最吃CPU。如果top显示的CPU不高,但网站就是慢,那是别的瓶颈(比如数据库锁、磁盘IO),别在CPU上死磕。
第二步,看是谁在吃。top里最上面那个进程名是关键。常见几种:php-fpm或apache占满,多半是流量暴增或被爬虫打;奇怪的进程名(随机字母、仿冒系统进程名),先怀疑挖矿木马;mysqld占满,多半有慢SQL或连接数爆了。
第三步,区分是流量还是攻击。看nginx访问日志,按IP统计请求数:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head。单个IP一秒几十上百个请求的,八成是爬虫或攻击,直接防火墙封掉。2026年AI公司的爬虫特别多,robots.txt里写清楚规则,不守规矩的再封IP。
第四步,处理挖矿木马。确认是挖矿进程后,先kill,再查它的启动方式:crontab -l、systemctl、开机启动项、shell配置文件,全查一遍,把定时任务和自启动项清干净,然后改密码、查有没有后门文件。只杀进程不除根,重启又回来。
第五步,处理慢SQL和PHP问题。mysqld吃CPU的话,跑SHOW PROCESSLIST看有没有长时间运行的查询,有就优化SQL或加索引。php-fpm吃CPU,看是不是有死循环——查PHP错误日志,配合strace -p 进程号看它卡在哪个函数。
第六步,预防。处理完事故装个监控:宝塔面板自带CPU告警,或者装个netdata,CPU超过85%持续五分钟就推微信通知。另外把PHP的max_execution_time设个上限,比如30秒,能挡住大部分死循环拖垮整台机器的情况。CPU 100%不可怕,可怕的是发现得太晚。
还木有评论哦,快来抢沙发吧~