轻量应用服务器 CPU 占用率达到 100% 是一个常见的性能问题,可能由多种原因引起。以下是排查和解决该问题的步骤:
一、初步排查:确认 CPU 使用情况
-
登录服务器
通过 SSH 登录到你的轻量应用服务器。 -
查看 CPU 使用情况
使用以下命令查看系统整体 CPU 使用率:top或者更直观的:
htop # 如果未安装,可先执行:sudo apt install htop(Debian/Ubuntu)或 yum install htop(CentOS)- 观察
%CPU列,看是否有某个进程持续占用高 CPU。 - 按
P可按 CPU 使用率排序。
- 观察
二、定位高 CPU 占用的进程
在 top 或 htop 中找到占用 CPU 最高的进程,记下其 PID 和 进程名。
例如:
php-fpmnginxnodemysqljava- 或某个脚本(如
python script.py)
你可以使用以下命令进一步查看:
ps aux --sort=-%cpu | head -10
查看 CPU 占用最高的前 10 个进程。
三、常见原因及解决方案
1. 网站流量突增或遭受攻击
- 表现:Web 服务进程(如 Nginx、Apache、Node.js)CPU 占用高。
- 检查方法:
# 查看访问日志是否有大量请求 tail -f /var/log/nginx/access.log # 或 Apache tail -f /var/log/apache2/access.log - 可能问题:
- DDoS 攻击
- 爬虫频繁抓取
- 恶意请求(如扫描、爆破)
- 解决方案:
- 使用防火墙限制 IP(如
ufw或iptables) - 配置 Nginx 限流
- 使用 CDN 或 WAF 防护
- 使用防火墙限制 IP(如
2. 程序存在死循环或性能瓶颈
- 表现:某个脚本或应用进程持续 100% 占用 CPU。
- 检查方法:
- 查看应用日志
- 检查是否有无限循环、递归调用、大循环未优化
- 解决方案:
- 优化代码逻辑
- 增加日志调试,定位具体函数
- 使用性能分析工具(如 Python 的
cProfile,Node.js 的clinic)
3. 数据库查询性能差
- 表现:
mysql或mariadb进程 CPU 高。 - 检查方法:
mysql -u root -p SHOW PROCESSLIST;查看是否有慢查询或长时间运行的 SQL。
- 解决方案:
- 优化 SQL 查询,添加索引
- 开启慢查询日志分析
- 限制查询频率或使用缓存(如 Redis)
4. 病毒或恶意程序
- 表现:陌生进程占用高 CPU,如
xmrig、kdevtmpfsi、systemd(伪装) - 检查方法:
ps aux | grep -i 'mining|crypt|tmp' top -c # 显示完整命令路径检查
/tmp、/dev/shm等目录是否有可疑文件。 - 解决方案:
- 终止恶意进程:
kill -9 PID - 删除可疑文件
- 检查定时任务:
crontab -l和/etc/cron.d/ - 更新系统和软件,修复漏洞
- 安装安全工具如
rkhunter、clamav
- 终止恶意进程:
5. 定时任务(Cron)执行频繁或出错
- 检查方法:
crontab -l ls /etc/cron.d/看是否有每分钟执行的脚本,且脚本本身执行时间长或有 bug。
- 解决方案:
- 优化脚本执行效率
- 增加执行间隔
- 添加日志输出便于排查
6. 服务器配置过低
- 轻量服务器(如 1核1G)运行多个服务时容易过载。
- 解决方案:
- 升级服务器配置
- 关闭不必要的服务
- 使用缓存减少计算压力
四、临时缓解措施
-
终止高 CPU 进程(谨慎操作):
kill -9 PID -
重启服务:
systemctl restart nginx systemctl restart mysql -
重启服务器(最后手段):
reboot
五、预防建议
- 安装监控工具:如
netdata、prometheus + node_exporter - 设置告警:CPU 超过 80% 发送通知
- 定期更新系统和软件
- 使用防火墙限制不必要的端口访问
- 备份重要数据
六、腾讯云/阿里云轻量服务器特别提示
- 登录控制台查看 监控图表,确认是持续 100% 还是瞬时峰值。
- 使用平台提供的 一键诊断 或 安全中心 检测病毒。
- 轻量服务器默认安全组可能开放较多端口,建议关闭非必要端口。
如果你能提供:
- 具体的高 CPU 进程名称
- 应用类型(如 WordPress、Node.js、Python)
- 是否有异常日志
我可以给出更精准的解决方案。
云知识