服务器CPU占用过高可能由多种因素引起,需要系统性排查和优化。以下是详细的解决步骤和扩展知识:
1. 定位高CPU进程
使用`top`/`htop`命令:实时查看进程的CPU占用率,重点关注PID、用户、%CPU列。`htop`支持交互式排序和进程树展示。
`ps`命令分析:
bash
ps aux --sort=-%cpu | head -n 10 # 列出前10高CPU进程
扩展知识:若发现异常进程(如未知的`python`或`java`进程),可能是恶意程序或代码漏洞导致,需结合`netstat`检查网络连接。
2. 分析线程级负载
`top -H -p
高级工具:
- `perf`(Linux性能分析工具):生成火焰图定位热点函数。
- `strace`:进程的系统调用,分析是否存在频繁IO或锁竞争。
3. 检查系统负载均衡
`uptime`/`sar`命令:观察1/5/15分钟负载平均值,若持续高于CPU核心数,说明系统过载。
扩展场景:
- CPU负载高但使用率低:可能等待IO(如磁盘或数据库),需用`iostat`或`vmstat`排查。
- 突发流量导致负载飙升:考虑限流(如Nginx的`limit_req`)或自动扩容。
4. 代码与配置优化
数据库优化:
- 慢查询日志分析(MySQL的`slow_query_log`),添加索引或重构SQL。
- 连接池配置(如`max_connections`调整),避免频繁创建连接。
应用层优化:
- 缓存高频数据(Redis/Memcached),减少重复计算。
- 异步处理耗时任务(如消息队列解耦)。
JVM调优:针对Java应用,调整堆大小(`-Xmx`)、GC算法(如G1)避免频繁Full GC。
5. 内核与系统参数调优
调整文件描述符限制:
bash
ulimit -n 65535 # 避免因连接数耗尽导致阻塞
TCP队列优化:
bash
sysctl -w net.core.somaxconn=1024 # 提高TCP连接队列长度
禁用不必要的服务:如`cron`任务、监控插件(如Zabbix Agent)可能周期性占用资源。
--
6. 硬件与架构层面
垂直扩展:升级CPU核心数或频率,特别是计算密集型任务。
水平扩展:通过负载均衡(如Nginx/K8s)分散请求到多台服务器。
容器化隔离:使用Docker/Kubernetes限制单个容器的CPU配额(`--cpus`参数)。
7. 日志与监控
集中式日志:ELK栈分析历史日志,定位周期性高峰。
实时监控:Prometheus+Grafana设置CPU阈值告警,结合APM工具(如SkyWalking)调用链。
8. 安全排查
挖矿病毒检测:
- 检查`/tmp`或`/dev/shm`可疑文件,使用`chkrootkit`扫描。
- 更新系统和软件补丁,避免漏洞利用。
DDoS攻击:通过`iftop`或`tcpdump`分析异常流量,启用云厂商的防护服务。
CPU高占用通常是综合问题,需结合日志、监控和性能工具层层剖析。长期建议建立性能基线,定期进行压力测试和预案演练。