CPU性能分析工具深度指南:top、vmstat、perf、strace

admin 2026-01-13 15:00:51 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章系统梳理top、vmstat、perf、strace四大LinuxCPU性能分析工具,给出命令速查、字段释义、交互技巧及可落地脚本,覆盖实时监控、系统调用追踪、性能计数器采样、负载瓶颈判定全流程,附综合排障脚本可直接集成运维平台。 综合评分: 92 文章分类: 安全工具,安全运营,实战经验,安全建设,解决方案


cover_image

CPU 性能分析工具深度指南:top、vmstat、perf、strace

原创

刘军军

运维星火燎原

2026年1月12日 00:01 山西

一、工具定位与选择矩阵

二、top – 实时进程监控

2.1 top 基础用法

# 启动top
top

# 批处理模式,运行3次,间隔2秒
top -b -n 3 -d 2

# 指定排序字段(CPU使用率)
top -o %CPU

# 监控特定用户进程
top -u username

# 保存输出到文件
top -b -n 1 > top_output.txt

2.2 top 交互命令(运行时按键)

# 常用交互命令:
1       : 显示所有CPU核心的详细 usage
P       : 按CPU使用率排序(默认)
M       : 按内存使用率排序
T       : 按运行时间排序
z       : 切换颜色显示
x       : 高亮显示排序的列
W       : 保存当前配置到 ~/.toprc
q       : 退出top

# 高级功能:
V       : 显示进程树状结构
f       : 选择显示的字段
o       : 设置过滤条件
k       : 杀死进程

2.3 top 输出关键字段解析

# 顶部系统信息区:
top - 18:30:01 up 10 days,  3:15,  1 user,  load average: 0.05, 0.10, 0.15
# ↳ 当前时间 | 运行时间 | 登录用户数 | 1,5,15分钟负载

Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie
# ↳ 进程总数 | 运行中 | 睡眠中 | 停止 | 僵尸进程

%Cpu(s):  2.3 us,  1.2 sy,  0.0 ni, 96.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# ↳ 用户空间 | 内核空间 | 优先级调整 | 空闲 | I/O等待 | 硬件中断 | 软件中断 | 虚拟化偷取

# 进程信息区:
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
1234 www-data  20   0  2.5g   1.2g   100m S  45.6  7.8  10:30.15 nginx
# ↳ 进程ID | 用户 | 优先级 | 友好值 | 虚拟内存 | 常驻内存 | 共享内存 | 状态 | CPU% | 内存% | 运行时间 | 命令

2.4 实战:使用 top 分析 CPU 瓶颈

#!/bin/bash
# top-cpu-analysis.sh

echo"=== Top CPU性能分析 ==="
echo"1. 获取系统快照..."
top -bn1 | head -5

echo -e "\n2. 分析CPU使用前10进程:"
top -bn1 -o %CPU | awk&nbsp;'/^ *[0-9]/ {if(NR<=15) printf "PID: %-6s USER: %-8s CPU: %-5s MEM: %-5s COMMAND: %s\n", $1, $2, $9, $10, $12}'

echo&nbsp;-e&nbsp;"\n3. 检查系统负载:"
echo"CPU核心数:&nbsp;$(nproc)"
load=$(cat /proc/loadavg | awk&nbsp;'{print $1}')
cores=$(nproc)
echo"当前负载:&nbsp;$load, CPU核心:&nbsp;$cores"

if&nbsp;(( $(echo"$load&nbsp;>&nbsp;$cores"&nbsp;| bc -l) ));&nbsp;then
&nbsp; &nbsp;&nbsp;echo"警告: 系统负载过高!"
else
&nbsp; &nbsp;&nbsp;echo"系统负载正常"
fi

三、vmstat – 系统性能统计

3.1 vmstat 基础用法

#&nbsp;基本用法:间隔2秒,显示5次
vmstat 2 5

#&nbsp;显示磁盘I/O统计
vmstat -d 2 3

#&nbsp;显示分区统计
vmstat -p /dev/sda1 2 3

#&nbsp;显示详细内存信息
vmstat -s

#&nbsp;显示 slab 信息
vmstat -m

3.2 vmstat 输出字段详解

#&nbsp;vmstat 2 1 输出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
&nbsp;r &nbsp;b &nbsp; swpd &nbsp; free &nbsp; buff &nbsp;cache &nbsp; si &nbsp; so &nbsp; &nbsp;bi &nbsp; &nbsp;bo &nbsp; in &nbsp; cs us sy id wa st
&nbsp;1 &nbsp;0 &nbsp; &nbsp; &nbsp;0 123456 &nbsp;78900 456789 &nbsp; &nbsp;0 &nbsp; &nbsp;0 &nbsp; &nbsp;10 &nbsp; &nbsp;20 &nbsp;100 &nbsp;200 10 &nbsp;5 85 &nbsp;0 &nbsp;0

#&nbsp;字段解析:
#&nbsp;procs:
#&nbsp; &nbsp;r = 运行队列中的进程数
#&nbsp; &nbsp;b = 等待I/O的阻塞进程数

#&nbsp;memory (KB):
#&nbsp; &nbsp;swpd = 使用的虚拟内存量
#&nbsp; &nbsp;free = 空闲内存量
#&nbsp; &nbsp;buff = 用作缓冲区的内存
#&nbsp; &nbsp;cache = 用作缓存的内存

#&nbsp;swap:
#&nbsp; &nbsp;si = 从磁盘交换进内存的量
#&nbsp; &nbsp;so = 从内存交换到磁盘的量

#&nbsp;io (blocks/s):
#&nbsp; &nbsp;bi = 从块设备接收的块数
#&nbsp; &nbsp;bo = 发送到块设备的块数

#&nbsp;system (interrupts/s):
#&nbsp; &nbsp;in&nbsp;= 每秒中断数
#&nbsp; &nbsp;cs = 每秒上下文切换数

#&nbsp;cpu (%):
#&nbsp; &nbsp;us = 用户空间CPU时间
#&nbsp; &nbsp;sy = 内核空间CPU时间
#&nbsp; &nbsp;id = 空闲CPU时间
#&nbsp; &nbsp;wa = 等待I/O的CPU时间
#&nbsp; &nbsp;st = 虚拟化偷取时间

3.3 实战:vmstat 性能分析脚本

#!/bin/bash
# vmstat-performance-analysis.sh

echo"=== Vmstat 系统性能分析 ==="
echo"采集5次数据,间隔2秒..."
echo""

# 收集数据
vmstat 2 5 > /tmp/vmstat_output.txt

# 分析数据
echo"1. CPU使用情况分析:"
awk&nbsp;'NR>2 {us+=$13; sy+=$14; id+=$15; wa+=$16; count++} END {
&nbsp; &nbsp; printf "用户空间: %.1f%%, 内核空间: %.1f%%, 空闲: %.1f%%, I/O等待: %.1f%%\n",
&nbsp; &nbsp; us/count, sy/count, id/count, wa/count
}'&nbsp;/tmp/vmstat_output.txt

echo&nbsp;-e&nbsp;"\n2. 内存和交换分析:"
awk&nbsp;'NR>2 {swpd+=$3; free+=$4; cache+=$6; count++} END {
&nbsp; &nbsp; printf "平均交换使用: %.1fKB, 平均空闲内存: %.1fKB, 平均缓存: %.1fKB\n",
&nbsp; &nbsp; swpd/count, free/count, cache/count
}'&nbsp;/tmp/vmstat_output.txt

echo&nbsp;-e&nbsp;"\n3. I/O活动分析:"
awk&nbsp;'NR>2 {bi+=$9; bo+=$10; count++} END {
&nbsp; &nbsp; printf "块设备读取: %.1f blocks/s, 块设备写入: %.1f blocks/s\n",
&nbsp; &nbsp; bi/count, bo/count
}'&nbsp;/tmp/vmstat_output.txt

echo&nbsp;-e&nbsp;"\n4. 系统活动分析:"
awk&nbsp;'NR>2 {in+=$11; cs+=$12; count++} END {
&nbsp; &nbsp; printf "中断频率: %.1f/s, 上下文切换: %.1f/s\n", in/count, cs/count
}'&nbsp;/tmp/vmstat_output.txt

# 清理临时文件
rm -f /tmp/vmstat_output.txt

echo&nbsp;-e&nbsp;"\n5. 性能瓶颈判断:"
if&nbsp;[ $(vmstat 1 2 | tail -1 | awk&nbsp;'{print $16}') -gt 20 ];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"⚠️ &nbsp;检测到I/O等待过高,可能存在磁盘瓶颈"
fi

if&nbsp;[ $(vmstat 1 2 | tail -1 | awk&nbsp;'{print $1}') -gt $(nproc) ];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"⚠️ &nbsp;运行队列过长,可能存在CPU瓶颈"
fi

四、perf – 性能计数器分析

4.1 perf 安装与基础用法

#&nbsp;Ubuntu/Debian 安装
sudo apt install linux-tools-common linux-tools-$(uname -r)

#&nbsp;CentOS/RHEL 安装
sudo yum install perf

#&nbsp;查看可用事件
perf list

#&nbsp;基本性能统计
perf stat -a sleep 5

#&nbsp;监控特定进程
perf stat -p <PID>

#&nbsp;记录性能数据
perf record -a -g sleep 10

#&nbsp;生成报告
perf report

4.2 perf 常用命令详解

# 1. perf stat - 性能计数器统计
perf&nbsp;stat&nbsp;-e cycles,instructions,cache-misses,branch-misses -a sleep 5

# 2. perf record - 记录性能数据
perf record -F 99 -a -g -- sleep 30 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 全系统采样,99Hz
perf record -F 99 -p <PID> -g -- sleep 10 &nbsp; &nbsp;# 特定进程采样
perf record -e cache-misses -a sleep 5 &nbsp; &nbsp; &nbsp;&nbsp;# 特定事件采样

# 3. perf report - 分析性能数据
perf report --stdio &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 文本模式报告
perf report --sort comm,dso &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 按命令和共享对象排序
perf report -n --stdio &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 显示样本数量

# 4. perf top - 实时性能监控
perf top &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 实时监控系统
perf top -e cache-misses &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 监控缓存未命中
perf top -p <PID> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 监控特定进程

# 5. perf annotate - 代码级分析
perf annotate -s <function_name> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 函数级注解

4.3 实战:perf 性能分析案例

#!/bin/bash
# perf-cpu-analysis.sh

echo"=== Perf CPU性能深度分析 ==="

# 1. 系统级性能概览
echo"1. 系统级性能计数器(运行5秒):"
perf&nbsp;stat&nbsp;-e cycles,instructions,cache-references,cache-misses,branch-misses,branches -a sleep 5 2>&1 | grep -E&nbsp;"(cycles|instructions|cache|branch)"

# 2. CPU使用热点分析
echo&nbsp;-e&nbsp;"\n2. CPU使用热点分析:"
echo"采集10秒性能数据..."
perf record -F 99 -a -g -- sleep 10 > /dev/null 2>&1

echo"生成热点报告:"
perf report --stdio --sort comm,dso | head -20

# 3. 缓存效率分析
echo&nbsp;-e&nbsp;"\n3. 缓存效率分析:"
perf&nbsp;stat&nbsp;-e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores,LLC-loads,LLC-load-misses -a sleep 3 2>&1 | grep -E&nbsp;"(L1|LLC)"

# 4. 进程级详细分析
read&nbsp;-p&nbsp;"输入要分析的进程PID(直接回车跳过): "&nbsp;pid
if&nbsp;[ -n&nbsp;"$pid"&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"分析进程&nbsp;$pid&nbsp;的性能特征..."
&nbsp; &nbsp; perf&nbsp;stat&nbsp;-p&nbsp;$pid&nbsp;sleep 5 2>&1 | grep -E&nbsp;"(seconds|task-clock|cycles|instructions)"
fi

# 5. 生成火焰图(需要额外工具)
echo&nbsp;-e&nbsp;"\n5. 高级分析建议:"
echo"生成火焰图: perf record -F 99 -a -g -- sleep 30 && perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg"
echo"函数级分析: perf annotate -s <function_name>"

# 清理临时文件
rm -f perf.data

五、strace – 系统调用追踪

5.1 strace 基础用法

#&nbsp;追踪命令执行
strace ls -l

#&nbsp;追踪运行中的进程
strace -p <PID>

#&nbsp;统计系统调用
strace -c ls -l

#&nbsp;显示时间戳
strace -t ls -l

#&nbsp;显示相对时间
strace -r ls -l

#&nbsp;显示调用时间
strace -T ls -l

#&nbsp;追踪特定系统调用
strace -e open ls -l

#&nbsp;输出到文件
strace -o output.txt ls -l

5.2 strace 常用选项详解

# 常用选项组合:
strace -ttt -T -f -o trace.log <command> &nbsp; &nbsp;# 详细追踪,包含时间戳和耗时
strace -c -f <command> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 统计系统调用频率
strace -e trace=file <command> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 只追踪文件相关调用
strace -e trace=network <command> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 只追踪网络相关调用
strace -e trace=process <command> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 只追踪进程相关调用

# 高级过滤:
strace -e trace=open,read,write <command> &nbsp;&nbsp;# 追踪特定系统调用
strace -P /path/to/file <command> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 追踪特定路径的文件访问

5.3 实战:strace 系统调用分析

#!/bin/bash
# strace-system-call-analysis.sh

echo"=== Strace 系统调用分析 ==="

# 1. 基本系统调用统计
echo"1. 分析 'ls -l' 的系统调用:"
strace -c ls -l /tmp 2>&1 | head -20

# 2. 详细调用追踪
echo&nbsp;-e&nbsp;"\n2. 详细系统调用追踪(显示耗时):"
strace -T ls -l /tmp 2>&1 | head -10

# 3. 分析特定进程
read&nbsp;-p&nbsp;"输入要分析的进程PID(直接回车使用示例): "&nbsp;pid
if&nbsp;[ -n&nbsp;"$pid"&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"追踪进程&nbsp;$pid&nbsp;的系统调用(5秒)..."
&nbsp; &nbsp; timeout 5 strace -p&nbsp;$pid&nbsp;-c 2>&1 | grep -A5&nbsp;"系统调用"
else
&nbsp; &nbsp;&nbsp;echo"使用示例进程分析..."
&nbsp; &nbsp; strace -e open,read,write -T head -n 1 /etc/passwd 2>&1 | grep -E&nbsp;"(open|read|write)"
fi

# 4. 文件访问分析
echo&nbsp;-e&nbsp;"\n4. 文件访问模式分析:"
strace -e trace=file -f find /tmp -name&nbsp;"*.tmp"&nbsp;2>&1 | grep -E&nbsp;"(open|stat)"&nbsp;| head -5

# 5. 性能瓶颈识别
echo&nbsp;-e&nbsp;"\n5. 系统调用性能分析:"
echo"运行一个测试命令并分析耗时..."
strace -c -T -f bash -c&nbsp;'for i in {1..1000}; do echo "test" >/dev/null; done'&nbsp;2>&1 | tail -10

# 6. 错误分析
echo&nbsp;-e&nbsp;"\n6. 错误调用分析:"
strace -e trace=open -z&nbsp;false&nbsp;2>&1 | grep -v ENOENT | head -5

六、综合实战:CPU 性能问题排查

6.1 完整的 CPU 性能分析流程

#!/bin/bash
# comprehensive-cpu-analysis.sh

echo"=== 完整的CPU性能问题排查流程 ==="
echo"开始时间:&nbsp;$(date)"
echo""

# 1. 快速系统状态检查
echo"1. 📊 快速系统状态检查..."
top -bn1 | head -5
echo""

# 2. 详细性能统计
echo"2. 📈 详细性能指标采集(5秒)..."
vmstat 1 5
echo""

# 3. 进程级分析
echo"3. 🔍 进程级CPU使用分析..."
echo"CPU使用前10进程:"
ps aux --sort=-%cpu | head -11 | awk&nbsp;'NR>1 {printf "%-10s %-6s %-8s %s\n", $11, $3, $1, $2}'
echo""

# 4. 系统调用分析
echo"4. 📞 系统调用频率分析..."
# 找出CPU使用最高的进程
high_cpu_pid=$(ps aux --sort=-%cpu | awk&nbsp;'NR==2 {print $2}')
if&nbsp;[ -n&nbsp;"$high_cpu_pid"&nbsp;];&nbsp;then
&nbsp; &nbsp;&nbsp;echo"分析高CPU进程&nbsp;$high_cpu_pid&nbsp;的系统调用..."
&nbsp; &nbsp; timeout 3 strace -c -p&nbsp;$high_cpu_pid&nbsp;2>&1 | head -15
else
&nbsp; &nbsp;&nbsp;echo"未找到高CPU进程"
fi
echo""

# 5. 性能计数器分析
echo"5. ⚡ 性能计数器分析(3秒)..."
perf&nbsp;stat&nbsp;-e cycles,instructions,cache-misses -a sleep 3 2>&1 | grep -E&nbsp;"(cycles|instructions|cache-misses|seconds)"
echo""

# 6. 上下文切换分析
echo"6. 🔄 上下文切换分析..."
vmstat 1 3 | awk&nbsp;'NR>2 {cs+=$12}

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军《CPU 性能分析工具深度指南:top、vmstat、perf、strace》

评论:0   参与:  0