上一篇 下一篇 分享链接 返回 返回顶部

Linux进程CPU排名定时输出 快速定位负载

发布人: 发布时间:6 天前 阅读量:30

背景介绍

在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权限才能完整显示,需根据实际情况调整执行用户。

快速定位负载的方法

  1. 使用top命令实时查看当前高CPU进程。
  2. 通过ps命令按CPU排序,确认进程PID与名称。
  3. 查看定时输出的历史日志,比对异常时间段的进程占用,判断是否由于特定业务、脚本或异常进程引起。
  4. 结合日志时间与系统监控告警,定位负载突增的触发源。

总之,通过ps命令与crontab的简单组合,运维人员可以低成本地构建CPU占用排行历史记录,显著提高快速定位系统负载问题的效率。

目录结构
全文
企业微信 企业微信
微信公众号 微信公众号
服务热线: 400-790-1688
电子邮箱: 3310008520@qq.com