在Linux系统中,监控和管理CPU占用率是系统管理员和开发人员的常见任务,Awk作为一种强大的文本处理工具,能够高效地从系统日志或命令输出中提取和分析CPU使用数据,本文将介绍如何使用Awk工具来监控和分析Linux系统中的CPU占用情况,包括基本用法、高级技巧以及实际应用场景。

Awk基础与CPU监控原理
Awk是一种用于文本处理的编程语言,特别适合处理结构化数据,在Linux系统中,CPU占用信息通常存储在/proc/stat文件中,该文件包含系统启动以来的CPU统计信息,包括用户态、内核态、空闲时间等,通过解析这些数据,可以计算出实时的CPU使用率。
要查看/proc/stat,可以使用以下命令:
cat /proc/stat
输出示例中,第一行以cpu开头,包含以下字段:
user:用户态时间nice:低优先级用户态时间system:内核态时间idle:空闲时间iowait:等待I/O的时间irq:处理硬件中断的时间softirq:处理软件中断的时间steal:虚拟机被 hypervisor 强制等待的时间guest:运行虚拟CPU的时间
使用Awk计算CPU占用率
通过两次读取/proc/stat并计算时间差,可以得出CPU的实时占用率,以下是一个简单的Awk脚本示例:
#!/bin/bash
# 获取初始CPU统计
prev_total=$(awk '/^cpu / {print $2+$3+$4+$5+$6+$7+$8+$9}' /proc/stat)
prev_idle=$(awk '/^cpu / {print $5}' /proc/stat)
# 等待1秒
sleep 1
# 获取当前CPU统计
curr_total=$(awk '/^cpu / {print $2+$3+$4+$5+$6+$7+$8+$9}' /proc/stat)
curr_idle=$(awk '/^cpu / {print $5}' /proc/stat)
# 计算CPU占用率
total_diff=$((curr_total - prev_total))
idle_diff=$((curr_idle - prev_idle))
cpu_usage=$((100 * (total_diff - idle_diff) / total_diff))
echo "CPU占用率: ${cpu_usage}%"
该脚本通过计算总时间差和空闲时间差,得出CPU的占用率百分比。

多核CPU监控
对于多核CPU,/proc/stat文件中会为每个核心提供单独的统计行(如cpu0、cpu1等),可以使用Awk分别处理每个核心的数据,以下是一个监控所有核心的脚本:
#!/bin/bash
awk '
BEGIN {
print "核心t占用率(%)"
}
/^cpu[0-9]+/ {
core = substr($1, 4)
total = $2 + $3 + $4 + $5 + $6 + $7 + $8 + $9
idle = $5
if (prev_total[core] != "") {
diff_total = total - prev_total[core]
diff_idle = idle - prev_idle[core]
usage = 100 * (diff_total - diff_idle) / diff_total
printf "%st%.2fn", core, usage
}
prev_total[core] = total
prev_idle[core] = idle
}' /proc/stat
该脚本会输出每个核心的CPU占用率,格式清晰易读。
结合top命令使用Awk
top命令是Linux中常用的系统监控工具,其输出可以通过Awk进一步处理,提取占用CPU最高的进程:
top -bn1 | awk 'NR>7 {print $9, $12}' | sort -nr | head -5
该命令会显示CPU占用率最高的前5个进程及其名称。
自动化监控脚本
可以将上述功能整合到一个自动化监控脚本中,定期输出CPU使用情况,每5秒记录一次CPU占用率并保存到日志文件:

#!/bin/bash
log_file="cpu_usage.log"
while true; do
cpu_usage=$(awk '/^cpu / {u=$2; n=$3; s=$4; i=$5; total=u+n+s+i; usage=(total-i)/total*100; printf "%.2f", usage}' /proc/stat)
echo "$(date): CPU占用率 ${cpu_usage}%" >> $log_file
sleep 5
done
常见问题与优化
在使用Awk监控CPU时,可能会遇到以下问题:
- 数据精度问题:由于
/proc/stat的更新频率,短时间间隔可能导致计算不准确,建议至少间隔1秒。 - 多核CPU的识别:确保脚本正确处理
cpu0、cpu1等行,避免遗漏核心。
以下是优化后的脚本,支持多核并排除I/O等待时间:
#!/bin/bash
awk '
BEGIN {
print "核心t用户态t内核态t空闲t占用率(%)"
}
/^cpu[0-9]+/ {
core = substr($1, 4)
user = $2
system = $3
idle = $5
total = user + system + $4 + idle + $6 + $7 + $8 + $9
if (prev_total[core] != "") {
diff_total = total - prev_total[core]
diff_idle = idle - prev_idle[core]
usage = 100 * (diff_total - diff_idle) / diff_total
printf "%st%.2ft%.2ft%.2ft%.2fn", core, user, system, idle, usage
}
prev_total[core] = total
prev_idle[core] = idle
}' /proc/stat
相关问答FAQs
问题1:为什么使用Awk而不是其他工具(如Python)监控CPU?
解答:Awk是Linux内置的轻量级工具,无需额外安装,处理速度极快,特别适合简单的文本提取和计算任务,对于需要实时监控的场景,Awk的效率更高。
问题2:如何监控特定进程的CPU占用率?
解答:可以使用ps命令结合Awk实现,监控PID为1234的进程:
ps -p 1234 -o %cpu --no-headers | awk '{print "PID 1234的CPU占用率: " $1 "%"}'
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/65392.html