服务器CPU使用率过高,核心对策是:先定位再处置,查进程、看日志、分场景优化,必要时扩容或降载。绝大多数情况下,CPU飙升并非硬件故障,而是软件层面的进程异常、流量攻击或代码缺陷,下面这套排查与处置流程,按优先级排列,照着做即可。
服务器CPU使用率过高怎么排查
排查阶段的核心目标是找出吃CPU的元凶,不要盲目重启,重启只能暂时清空负载,问题复发的概率极高。
第一步:登录服务器,执行top命令
SSH登录后,第一时间输入 top 然后回车,重点关注%Cpu(s)那行数据,其中us代表用户态占用,sy代表内核态占用,如果us很高,通常是业务程序(如PHP-FPM、Java、MySQL)在消耗资源;如果sy很高,则可能是系统调用频繁或内核模块异常。
按 Shift + P 键,top会按CPU占用率从高到低排序,此时记下排名靠前的PID(进程ID)和对应的进程名,之后按 q 退出。
第二步:核对进程身份与启动时间
用 ps -ef | grep PID(将PID替换为实际数字)查看该进程的完整启动命令和所属用户,这一步用于判断进程是否属于你的业务。
- 如果是www-data或nginx用户启动的PHP/Python进程,基本可以确定是网站业务问题。
- 如果是root启动的陌生进程,且路径在
/tmp、/var/tmp下,极可能是挖矿木马或僵尸程序。
常见恶意进程常伪装成kworker、kthreadd之类的系统名,但真正的系统线程不占高CPU,看到名字眼熟但CPU占用一直在30%以上的进程,建议用 ls -l /proc/PID/exe 查看其真实执行路径。
第三步:结合时间点与日志交叉验证
登录宝塔面板或云厂商控制台查看CPU监控图表,确认飙升的起始时间,然后回查该时间点的业务日志:
# 查看Nginx访问日志,确认是否有单一IP大量请求
tail -n 10000 /www/wwwlogs/访问日志.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# 查看系统日志中的OOM或异常记录
dmesg | tail -n 50
如果发现某个IP请求量惊人,基本可以判定为CC攻击或爬虫吸血,如果日志时间与CPU飙升时间吻合但无明显异常IP,则大概率是代码逻辑缺陷,比如死循环、短时间重复任务。
如何降低服务器CPU使用率:分场景处置
排查结束后,根据定位结果选择对应的处置方案,以下四个场景涵盖绝大多数情况。
业务流量高峰导致CPU满载
如果CPU在每日固定时段飙升,与访问高峰重合,且load average与CPU核数基本匹配或略高,这是正常现象,处理思路是分摊压力而非限制进程。
- 检查Nginx配置中的
worker_processes,通常设置为CPU核数即可。 - PHP-FPM的
pm.max_children设置过大时会在高峰期启动大量进程,建议根据单进程内存占用调整,将pm.max_children控制在物理内存可承受范围内。 - 启用OPcache或Redis缓存,减少PHP脚本重复编译和数据库查询次数。
- 长期流量增长趋势下,考虑升级CPU核数或配置负载均衡。
MySQL数据库查询慢导致CPU飙升
数据库慢查询是CPU使用率过高的常见诱因,登录MySQL后执行:
SHOW PROCESSLIST;
查看是否有大量State为Sending data或Sorting result的查询,这些通常对应无索引的全表扫描或复杂排序。
处理路径:
- 开启慢查询日志,定位具体的SQL语句。
- 对
WHERE和ORDER BY涉及的字段添加合适的索引。 - 改写低效SQL,避免
SELECT,只取所需字段。 - 将高频查询结果缓存到Redis或Memcached,降低MySQL重复计算压力。
行业共识认为,索引缺失导致的慢查询能占到数据库类CPU问题的六成以上。
被恶意攻击或爬虫消耗资源
攻击型CPU飙升的特点是:进程正常,但连接数爆表,带宽占用异常,以Nginx为例,执行:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
查看来源IP的分布,如果是单IP或少数IP持续大流量挤压,可在云服务商的安全组或防火墙中封禁该IP,也可以安装Fail2ban自动识别并封锁高频请求的IP。
对于搜索引擎爬虫的过度抓取,在robots.txt中设置Crawl-delay参数,或使用Nginx的limit_req模块限制单IP每秒请求数,这两步操作对降CPU效果非常直接。
CPU被挖矿木马或僵尸进程占用
这种情况通常表现为CPU满载但业务访问量很低,且top中有一个或多个进程各占100%以上,处置流程:
# 1. 立即暂停可疑进程,观察CPU是否回落 kill -STOP PID # 2. 确认后终结进程 kill -9 PID # 3. 删除其对应的定时任务(挖矿木马常写Crontab实现持久化) crontab -l crontab -e # 4. 检查并清理SSH免密登录配置和公钥文件 cat ~/.ssh/authorized_keys
业内专家指出,挖矿木马通常通过Redis未授权访问、Web漏洞或弱口令进入服务器,处置完成后,务必修改所有服务的密码,并关闭不需要的对外端口。
服务器CPU使用率过高会影响网站打开速度吗
影响非常大,CPU是服务器的计算核心,使用率过高会导致请求排队,当CPU占用持续在90%以上时,所有PHP、数据库查询和静态文件响应的速度都会指数级下降,具体表现为:
- 网页加载时间从1秒内拉长到5秒以上。
- 并发请求时频繁出现502 Bad Gateway或504 Gateway Timeout。
- 数据库连接数告急,新的查询无法建立连接。
CPU长时间满负荷运行会让服务器内部温度升高,可能触发硬件保护机制导致自动重启,对在线交易类网站来说,每次重启都意味着一段时间的业务完全中断。CPU使用率超过85%并持续10分钟以上时,建议立即介入处理,不要等到宕机才排查。
服务器CPU使用率高的日常预防方案
与其每次故障时手忙脚乱,不如建立一套预防机制,以下是轻量级且行之有效的常规做法。
配置监控告警规则
在云监控或宝塔面板中,为CPU使用率设置告警阈值,推荐两级告警:
- 警告级:CPU使用率超过80%持续5分钟,短信或邮件通知。
- 严重级:CPU使用率超过95%持续1分钟,紧急通知。
告警规则的关键在于持续时长的设置,仅瞬时超过阈值不算故障,但持续超过则说明负载没有及时回落。
建立定期巡检习惯
每月登录服务器执行一次简单的状态体检:
uptime查看平均负载。free -h查看内存剩余,确认是否不足导致SWAP频繁交换。df -h查看磁盘使用率,磁盘写满会导致程序异常退出门并引发CPU波动。
优化代码与架构
从源头降低CPU负载,比事后扩容更经济。
- 定时任务脚本用
flock加锁,防止上一轮未执行完就开启下一轮。 - 大文件读取用流式处理,避免一次性载入内存和CPU高频运行。
- 按模块拆分业务逻辑,将偏计算型的服务单独部署,避免影响主站。
升级硬件与配置
如果以上手段均已执行,CPU使用率在业务高峰期依然达到90%以上,说明服务器的计算能力已达到瓶颈,根据自身业务规模合理扩容即可,更换更高主频的CPU或增加实例数,是最直接的解决路径。
Q&A:关于服务器CPU使用率过高的常见疑问
Q1:服务器CPU使用率一直100%,但网站打开还是很快,需要处理吗?
需要处理,页面快可能因为静态资源由CDN或Nginx直接返回,未经过后端计算,但CPU持续满载意味着核心服务随时可能超时或崩溃,一次流量波动就可能导致整个站点不可访问,建议立刻排查。
Q2:重启服务器能解决CPU使用率过高吗?
能临时解决,但不根治,重启会清空进程状态,如果是内存泄漏或临时性高并发,重启后确实会恢复平静,但如果是代码死循环、定时任务重叠或木马程序,重启后短时间内就会复发,重启前先执行top截图记录进程信息,方便排查。
Q3:如何判断服务器CPU使用率过高是不是黑客入侵了?
重点看进程的可疑特征:一是进程名称与系统常规进程相似但不完全匹配;二是启动路径位于/tmp或/var/tmp;三是进程持续占用CPU超过50%;四是网络连接中存在大量未知的外部IP,满足其中两条以上,入侵概率较大,建议立即离线备份数据并重装系统,然后再恢复业务。
服务器CPU使用率过高并非无解难题,核心在于快速定位、精准处置、日常预防,先将监控告警配起来,再根据每次事故的根因复盘调整代码或架构,绝大多数服务器的CPU负载都能维持在健康区间。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771080.html


