VPS 突然变得很慢,SSH 连接卡顿,网站响应时间飙升?检查一下 CPU 使用率,很可能已经跑满 100% 了。这种情况比想象中常见,但只要掌握正确的排查方法,通常都能快速定位并解决问题。
首先登录 VPS,运行最基础的命令看看当前状态:
top
top 命令会实时显示系统资源使用情况。重点关注这几个数值:
- %Cpu(s) - 总体 CPU 使用率
- us - 用户进程占用
- sy - 系统内核占用
- id - 空闲百分比(这个数值很低就说明 CPU 很忙)
按 P 键可以按 CPU 使用率排序,快速找出哪个进程在吃资源。按 q 退出。
如果想要更友好的界面,可以安装 htop:
# Debian/Ubuntu
apt install htop -y
# CentOS/RHEL
yum install htop -y
# 运行
htop
htop 支持鼠标操作,彩色显示,看起来更直观。
ps aux --sort=-%cpu | head -20
这会列出 CPU 占用最高的前 20 个进程。输出中各列含义:
- USER - 运行进程的用户
- PID - 进程 ID
- %CPU - CPU 占用百分比
- %MEM - 内存占用百分比
- COMMAND - 进程命令
watch -n 1 'ps aux --sort=-%cpu | head -10'
每秒刷新一次,观察 CPU 占用的变化趋势。
找到可疑进程的 PID 后,进一步查看详情:
# 查看进程的完整命令行
cat /proc/<PID>/cmdline | tr '\0' ' '
# 查看进程的工作目录
ls -l /proc/<PID>/cwd
# 查看进程打开的文件
lsof -p <PID>
网站代码出现死循环或低效查询是最常见的原因。
特征:php-fpm、python 进程 CPU 占用持续 100%
排查:
# 查看 PHP-FPM 进程状态
ps aux | grep php-fpm
# 查看正在执行的 PHP 脚本
lsof -c php-fpm | grep '\.php'
解决:
- 检查最近修改的代码
- 查看 PHP 错误日志
/var/log/php-fpm/error.log - 临时重启 PHP-FPM:
systemctl restart php-fpm
MySQL 慢查询会拖垮整个服务器。
特征:mysqld 进程 CPU 占用很高
排查:
# 登录 MySQL 查看当前查询
mysql -e "SHOW PROCESSLIST;"
# 查看慢查询日志(需要先开启)
tail -f /var/log/mysql/slow.log
解决:
- 优化慢查询,添加索引
- 杀掉卡住的查询:
mysql -e "KILL <process_id>;" - 考虑升级 VPS 配置或使用独立数据库服务器
这是个严重问题,需要立即处理。
特征:
- 陌生进程名,如
kdevtmpfsi、kinsing、随机字符串 - 进程隐藏或无法正常 kill
- CPU 持续 100% 但找不到原因
排查:
# 检查定时任务
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
# 检查可疑的启动项
systemctl list-unit-files --type=service | grep enabled
# 检查异常的网络连接
netstat -antp | grep ESTABLISHED
解决:
- 立即杀掉可疑进程
- 清理定时任务中的恶意条目
- 修改所有密码,检查 SSH 密钥
- 更新系统和所有软件
- 严重情况下建议重装系统
Nginx、Apache 的 worker 数量设置过多,或 PHP-FPM 进程池配置过大。
排查:
# 查看 Nginx worker 数量
ps aux | grep nginx | wc -l
# 查看 PHP-FPM 进程数量
ps aux | grep php-fpm | wc -l
解决:根据 VPS 配置调整参数。1 核 VPS 建议:
- Nginx workers: 1-2
- PHP-FPM pm.max_children: 5-10
后台运行的系统任务可能临时占满 CPU。
特征:apt、yum、rsync、gzip 等进程 CPU 高
解决:通常等待任务完成即可。如果不急,可以降低优先级:
# 降低进程优先级(19 是最低)
renice 19 -p <PID>
# 正常终止
kill <PID>
# 强制终止(进程无响应时使用)
kill -9 <PID>
# 按进程名批量杀
pkill -f <进程名关键词>
使用 cpulimit 工具限制特定进程的 CPU 占用:
# 安装
apt install cpulimit -y
# 限制某进程最多使用 50% CPU
cpulimit -p <PID> -l 50
# 启动时设置低优先级
nice -n 19 <命令>
# 修改运行中进程的优先级
renice 10 -p <PID>
# 安装 nmon
apt install nmon -y
nmon
# 或者安装 glances(功能更全)
pip3 install glances
glances
写个简单的监控脚本,CPU 超过阈值时发送通知:
#!/bin/bash
CPU_THRESHOLD=90
CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | awk '{print int($2)}')
if [ $CPU_USAGE -gt $CPU_THRESHOLD ]; then
echo "CPU 使用率 ${CPU_USAGE}% 超过阈值" | mail -s "VPS CPU 告警" [email protected]
fi
添加到 crontab 每 5 分钟检查一次:
*/5 * * * * /path/to/cpu_monitor.sh
如果 CPU 经常跑满,除了优化代码和配置,可能需要考虑:
- 升级 VPS 配置 - 增加 CPU 核心数
- 使用更高频率的 CPU - 部分服务商提供高性能实例
- 分离服务 - 将数据库、缓存等分离到独立服务器
- 添加缓存层 - Redis、Memcached 减少计算压力
- 使用 CDN - 减轻服务器静态资源负担
CPU 跑满 100% 的排查流程:
top或htop确认 CPU 状态ps aux --sort=-%cpu找出高占用进程- 分析进程类型,判断是正常任务还是异常
- 针对性处理:优化代码、调整配置、杀掉恶意进程
- 建立长期监控,防止问题再次发生
大多数情况下,按照这个流程都能快速定位问题。如果实在找不到原因,可以考虑逐个停止服务来排除,或者直接重启 VPS 临时恢复,再慢慢排查。
