服务器 CPU 使用率一直保持在 60% 多,这个数值虽然不算特别高(比如没到 90%+),但持续处于中高位也可能是潜在问题的信号。你可以按照以下思路排查和优化:
? 一、确认是否为异常情况
-
观察趋势:
- 是不是最近才开始出现这种情况?
- 是否有周期性规律?(如每天某个时间点)
-
查看负载类型:
- 使用
top或htop查看具体是哪个进程占用了 CPU。 - 检查是否有多个进程共同占用 CPU。
- 使用
-
结合内存、磁盘、网络使用情况:
- 使用
free -h,iostat,vmstat,sar,iftop等工具综合判断系统资源使用状况。
- 使用
? 二、常见排查命令
✅ 1. 查看当前 CPU 占用高的进程
top
或
ps aux --sort=-%cpu | head -n 15
✅ 2. 实时监控 CPU 使用情况
mpstat -P ALL 1
✅ 3. 查看每个进程的详细 CPU 使用
pidstat -u 1
✅ 4. 查看线程级别的 CPU 使用(适用于 Java 等多线程应用)
top -H
? 三、可能原因及解决方案
| 可能原因 | 描述 | 解决建议 |
|---|---|---|
| 程序 bug / 内存泄漏 / 死循环 | 某个服务或脚本进入死循环导致 CPU 持续占用 | 定位进程后检查日志,修复代码逻辑 |
| 定时任务频繁执行 | 如 crontab 每分钟运行脚本 | 检查 /etc/crontab 和 crontab -l |
| 数据库查询效率低 | 高频复杂查询未优化 | 增加索引、优化 SQL、考虑缓存 |
| 爬虫或攻击行为 | 被恶意请求打满 | 检查 Nginx/Apache 日志,限制 IP 访问 |
| 后台同步任务/备份任务 | 如 rsync、logrotate、备份脚本等 | 推迟至低峰期执行 |
| Java 应用 GC 频繁 | JVM 频繁 Full GC 导致 CPU 高 | 分析 GC 日志,调整堆大小或回收器 |
| 虚拟机/容器环境性能损耗 | 宿主机资源不足或争抢 | 检查宿主机负载,尝试物理机测试 |
? 四、进一步分析建议
- 记录日志与监控数据:使用 Prometheus + Grafana 或 Zabbix 进行长期监控。
- 开启 profiling 工具:对于 Java、Python 等语言,可以使用
jstack、py-spy等进行性能分析。 - 安全审计:检查服务器是否有病毒、异常进程(可用
chkrootkit、rkhunter)。
?️ 示例:查找 CPU 占用最高的线程
# 查找 CPU 占用最高的进程 PID
ps aux --sort=-%cpu | head -n 5
# 查看该进程下的所有线程
ps -T -p <PID>
# 找出最消耗 CPU 的线程 TID
top -H -p <PID>
然后可以将 TID 转换为 16 进制,再用 jstack 等分析具体线程在做什么。
✅ 总结步骤
- 用
top看整体 CPU 使用情况; - 用
ps或pidstat找出占用 CPU 最高的进程; - 用
top -H或jstack查看具体线程; - 结合日志、代码、监控数据定位根源;
- 优化或修复问题。
如果你愿意提供更多信息(例如操作系统、服务类型、CPU 核数、截图或命令输出),我可以帮你更具体地分析。
CDNK博客