Linux进程CPU排名定时输出 快速定位负载
背景介绍
在Linux服务器运维中,CPU负载过高是常见问题。当系统出现卡顿、响应变慢时,运维人员需要快速找出占用CPU最高的进程。单纯的实时查看难以回溯历史,通过定时输出进程CPU占用排名,可以帮助运维人员快速定位负载来源,为性能调优和故障排查提供依据。
常用命令:top与ps
定位CPU占用主要使用top命令或ps命令。top命令提供了动态刷新的进程列表,而ps命令可以通过参数输出静态快照。在定时任务场景下,ps命令更适合非交互式输出,易于重定向到日志文件。
使用top输出静态快照
top支持批处理模式(batch mode),通过 -b 参数与 -n 1 指定执行一次,再结合 -o 按CPU占用排序:
top -b -n 1 -o %CPU | head -20使用ps按CPU排序
ps命令可以结合 --sort 参数按照CPU占用率排序:
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu | head -20该命令列出PID、用户、CPU占用率、内存占用率和完整命令行,并按CPU占用率降序排列,是定时任务的常用写法。
编写定时输出脚本
为了便于运维使用,可将命令写入脚本,添加时间戳并输出到日志目录。建议使用脚本文件,避免直接编写复杂的crontab命令导致转义错误。
示例脚本:cpu_top.sh
#!/bin/bash
LOG_DIR="/var/log/cpu_monitor"
LOG_FILE="$LOG_DIR/$(date +%Y%m%d_%H%M).log"
mkdir -p "$LOG_DIR"
echo "===== $(date '+%Y-%m-%d %H:%M:%S') ====" >> "$LOG_FILE"
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -15 >> "$LOG_FILE"
echo "" >> "$LOG_FILE"脚本执行时,会创建按日期时间命名的日志文件,记录当前CPU占用排名前15的进程。文件名中已包含时间信息,便于按时间查找历史负载情况。
配置crontab定时任务
运维中常见的需求是每5分钟或每1分钟输出一次快照。使用crontab进行调度,编辑定时任务:
crontab -e添加如下行(示例为每5分钟执行一次):
*/5 * * * * /opt/scripts/cpu_top.sh保存后即生效。日志文件将按分钟、小时保存,不会覆盖历史数据。运维人员在CPU异常时,可查看对应时段的日志,回溯当时的进程占用情况。
进一步优化与注意事项
- 日志轮转:长时间运行会导致日志文件积累,建议使用logrotate或定时清理策略,保留最近一段时间的数据。
- 采样间隔:若需更精确捕捉瞬时飙高,可缩短crontab间隔,但注意磁盘写入频率和性能影响。
- 结合历史负载:可同时记录uptime输出,获得平均负载数据,与进程排名配合分析。
- 权限要求:部分系统进程信息需要root权限才能完整显示,需根据实际情况调整执行用户。
快速定位负载的方法
- 使用top命令实时查看当前高CPU进程。
- 通过ps命令按CPU排序,确认进程PID与名称。
- 查看定时输出的历史日志,比对异常时间段的进程占用,判断是否由于特定业务、脚本或异常进程引起。
- 结合日志时间与系统监控告警,定位负载突增的触发源。
总之,通过ps命令与crontab的简单组合,运维人员可以低成本地构建CPU占用排行历史记录,显著提高快速定位系统负载问题的效率。