当轻量服务器(如阿里云轻量应用服务器、腾讯云轻量服务器等)出现CPU占用过高的情况时,可能会影响服务的响应速度甚至导致服务中断。以下是系统化的排查与处理方法:
一、快速定位高CPU进程
-
登录服务器并查看CPU使用情况
使用以下命令查看实时CPU占用:
top或更直观的:
htop # 需要先安装:sudo apt install htop(Ubuntu/Debian)或 yum install htop(CentOS)在
top中:- 按
P可按CPU使用率排序。 - 查看哪个进程占用了大量CPU。
- 按
-
使用
ps命令查找高负载进程ps aux --sort=-%cpu | head -10这会列出CPU占用最高的前10个进程。
-
检查是否为Web服务相关进程(如PHP、Node.js、Nginx、MySQL)
常见原因包括:
- PHP-FPM 进程过多或脚本执行缓慢
- MySQL 查询未优化,慢查询堆积
- Node.js 应用存在死循环或内存泄漏
- Nginx 处理大量请求或被攻击
二、常见原因及应对措施
1. 网站流量突增
- 现象:访问量突然上升,Web服务器进程(如nginx、apache)或后端(php-fpm、node)CPU飙升。
- 解决:
- 启用缓存(如Redis、Memcached、页面静态化)。
- 使用CDN减轻源站压力。
- 升级服务器配置(临时或长期)。
2. 程序存在性能问题或死循环
- 现象:某个应用进程持续占用高CPU。
- 解决:
- 检查应用日志(如
error.log、access.log)。 - 优化代码逻辑,避免无限循环、递归过深。
- 使用性能分析工具(如XHProf for PHP、Chrome DevTools for Node.js)。
- 检查应用日志(如
3. 数据库查询效率低
- 现象:
mysqld或mariadb进程CPU高。 - 解决:
- 开启慢查询日志,找出执行时间长的SQL。
- 添加索引、优化查询语句。
- 限制并发连接数,避免连接池耗尽。
4. 被恶意攻击(如CC攻击、爬虫)
-
现象:短时间内大量请求来自同一IP或多个IP。
-
解决:
-
使用
netstat或ss查看连接数:netstat -anp | grep :80 | wc -l -
通过Nginx限制请求频率:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; server { location / { limit_req zone=one burst=20; } } -
使用防火墙(如
fail2ban)封禁恶意IP。
-
5. X_X病毒或木马
-
现象:发现陌生进程(如
xmrig、kdevtmpfsi)占用高CPU。 -
解决:
-
执行:
ps aux | grep -i "mining|crypt" -
删除可疑文件,杀掉进程。
-
检查定时任务(
crontab -l、/etc/crontab)是否有恶意命令。 -
更新系统补丁,关闭不必要的端口。
-
安装安全软件(如云厂商的安骑士、云镜)。
-
6. 系统资源不足,频繁GC或Swap
- 现象:内存不足导致频繁使用Swap,间接增加CPU负担。
- 解决:
- 增加内存或升级服务器配置。
- 优化应用内存使用,减少内存泄漏。
三、日常监控与预防
-
安装监控工具
htop、iotop、nethogs实时监控。- 使用
Prometheus + Grafana或云平台自带监控(如腾讯云监控、阿里云云监控)。
-
设置告警
- 当CPU持续 > 80% 时发送邮件或微信告警。
-
定期维护
- 更新系统和软件补丁。
- 清理日志、临时文件。
- 优化数据库和代码。
四、紧急处理建议
-
如果无法立即修复,可临时重启服务缓解:
sudo systemctl restart nginx php7.4-fpm mysql -
但需注意:重启治标不治本,应尽快定位根本原因。
总结
| 步骤 | 操作 |
|---|---|
| 1️⃣ | 使用 top/htop 查看高CPU进程 |
| 2️⃣ | 分析是应用、数据库、攻击还是病毒 |
| 3️⃣ | 对症处理:优化代码、加缓存、封IP、杀病毒 |
| 4️⃣ | 加强监控与安全防护 |
如果经过排查仍无法解决,建议导出 top 快照、日志片段,联系云服务商技术支持协助分析。
需要我帮你分析具体 top 输出或日志内容吗?可以贴出来进一步诊断。
云小栈