【Linux】测试程序怎么测 CPU 占用率?一篇讲透

前言

最近做算法性能测试时,遇到一个很典型的问题:测试程序跑起来后,怎么知道它占了多少 CPU?用 top 看总感觉不够精确,有没有更靠谱的办法?

这个问题看似简单,实则踩了不少坑。网上大部分教程都在讲 top、pidstat 怎么看 CPU 占用,但不同场景下该用哪个工具、结果怎么解读、有哪些坑,往往语焉不详。

这篇文章把整个排查过程整理出来,包括:

  • Linux 查看 CPU 占用率的常用方法及适用场景
  • 怎么找到测试程序对应的进程
  • 短生命周期程序怎么测才靠谱(核心)
  • 结果解读与常见坑

一、Linux 查看 CPU 占用率的常用方法

先快速过一遍基础工具,按场景选:

场景推荐命令
日常排查top/htop
看多核负载是否均衡mpstat -P ALL 1
找吃 CPU 的进程ps aux --sort=-%cpu | head或pidstat -u 1
历史/趋势分析sar -u
写脚本取数值读/proc/stat或解析mpstat

1. top —— 最常用

top

第一行%Cpu(s)显示整体占用:

  • us:用户态
  • sy:内核态
  • id:空闲率(CPU 占用率 ≈ 100 - id)
  • wa:IO 等待
  • st:被虚拟化偷走的时间

按1展开每个核心,按P按 CPU 排序,按q退出。

2. mpstat —— 看每个核心

mpstat-PALL1# 每 1 秒刷新,显示所有核心

需安装sysstat。%idle是空闲率,100 - %idle即该核心占用率。

3. vmstat —— 整体概况

vmstat15# 每秒采样,共 5 次

关注us、sy、id、wa列。

4. ps —— 查某进程

psaux--sort=-%cpu|head-10# 按 CPU 占用降序取前 10ps-p<PID>-o%cpu,cmd# 查看指定进程

5. pidstat —— 按进程持续统计

pidstat-u15# 每秒采样,共 5 次pidstat-u-p<PID>1# 只看某个进程

6. sar —— 历史数据

sar-u15# 实时sar-u-f/var/log/sa/sa15# 某天的历史数据

7. 脚本里直接取数值

读/proc/stat两次采样求差值:

readcpu a b c idle rest</proc/statt1=$((a+b+c+idle));i1=$idlesleep1readcpu a b c idle rest</proc/statt2=$((a+b+c+idle));i2=$idleecho"CPU 占用率:$((100-(i2-i1)*100/(t2-t1)))%"

二、怎么找到测试程序对应的进程

1. pgrep / pidof —— 按进程名

pgrep-a程序名# 列出 PID + 完整命令行pgrep-af关键字# -f 匹配完整命令行(推荐)pidof 程序名# 只输出 PID

如果启动命令是./my_test --config a.txt,用-f才能匹配到。

2. ps + grep

ps-ef|grepmy_test|grep-vgreppsaux|grepmy_test|grep-vgrep

grep -v grep排除 grep 自身。

3. top / htop 里搜

top# 运行中按 o,输入 COMMAND=my_test 回车过滤# 或按 u 输入用户名,只看自己的进程

htop 里按F4输入名字过滤。

4. 只知道端口 / 文件,反查进程

ss-lntp|grep端口号lsof-i:端口号ls-l/proc/*/exe2>/dev/null|grepmy_testls-l/proc/*/cwd2>/dev/null|grep/your/workdir

5. 找到后看细节

ps-fp<PID>cat/proc/<PID>/cmdline|tr'\0'' '# 完整启动命令(含参数)top-p<PID>pidstat-u-p<PID>1

常见坑

现象原因 / 解决
pgrep my_test查不到用pgrep -f my_test匹配完整命令行
结果里有 grep 自己加grep -v grep或用pgrep -a
进程名被截断(15 字符)用ps -ef看 CMD 列,或cat /proc/PID/cmdline
脚本(bash/python)启动进程名是解释器,要用-f按脚本名查
多实例pgrep -af全部列出,ps -fp PID1 PID2逐个看

三、核心问题:短生命周期程序怎么测才靠谱?

程序生命周期短(比如跑几秒就结束),最大的问题是:等你敲完 top/pidstat 命令,程序可能已经结束了。针对这种场景,按推荐程度给出几种方法。

方案一:/usr/bin/time -v(最推荐,一步到位)

/usr/bin/time-v./your_algorithm

输出里直接有这几行,直接读就行:

User time (seconds): 8.50 System time (seconds): 0.30 Percent of CPU this job got: 88% Elapsed (wall clock) time: 0:00:10

Percent of CPU this job got就是整个进程生命周期内的平均 CPU 占用率,已经帮你算好了。单核程序一般 ≤100%;多线程程序可能 >100%(比如 4 线程跑满显示 400%)。

注意要用/usr/bin/time(GNU time),不要用 shell 内置的time,内置的没有-v和 CPU% 字段。

如果只想要简单版:

time./your_algorithm# 输出 real / user / sys# CPU% = (user + sys) / real × 100

方案二:perf stat(硬件级计数,精度高)

perfstat./your_algorithm

输出关键行:

10.012345 task-clock (msec) # 0.998 CPUs utilized

CPUs utilized就是 CPU 占用率(0.998 ≈ 99.8%,多线程可能 >1)。perf stat直接统计 CPU 周期/任务时钟,不依赖时间片采样,对短窗口比读/proc/stat更可靠。

如果只想看利用率:

perfstat-etask-clock ./your_algorithm

方案三:脚本逐秒采样 /proc/PID/stat(想看波动时用)

如果你不仅想要平均值,还想知道程序运行期间 CPU 占用是怎么变化的(比如启动峰值、稳态、结束),用脚本启动程序并持续采样:

#!/bin/bash./your_algorithm&PID=$!echo"PID=$PID"# 每 0.5 秒采样一次,直到进程结束whilekill-0$PID2>/dev/null;doawk'{print "utime="$14" stime="$15" (jiffies)"}'/proc/$PID/stat2>/dev/nullsleep0.5donewait$PID

更实用的版本是直接算百分比(基于/proc/PID/stat的 utime+stime 增量除以时间增量,再除以getconf CLK_TCK):

#!/bin/bash./your_algorithm&PID=$!CLK=$(getconf CLK_TCK)prev=0;prev_t=$(date+%s.%N)whilekill-0$PID2>/dev/null;dosleep1read-r_ _ _ _ _ _ _ _ _ _ _ _ _ utime stime _</proc/$PID/stat2>/dev/null||breakcur=$((utime+stime))now=$(date+%s.%N)dt=$(echo"$now-$prev_t"|bc)dcpu=$((cur-prev))pct=$(echo"scale=1;$dcpu* 100 / ($CLK*$dt)"|bc)echo"t=${dt}s CPU=${pct}%"prev=$cur;prev_t=$nowdonewait$PID

方案四:pidstat 配合后台启动(可行,但注意时序)

pidstat 只能监控已存在的进程,程序跑得快的话,需要先启动再立刻拿到 PID:

./your_algorithm&PID=$!pidstat-u-p$PID1wait$PID

pidstat 会每秒输出一行该进程的%CPU,最后你再求平均。缺点是启动到 pidstat 开始采样之间可能有几百毫秒延迟,会漏掉最开始的一小段。如果启动开销不重要,这个方法够用。

方案五:top 批处理模式(不推荐用于短程序)

./your_algorithm&PID=$!top-b-d1-p$PID

能看,但 top 的第一次采样往往不准,短窗口内有效数据点少,不如前面几种方法直接。

四、关键注意事项

1. 多核 / 多线程:占用率可以 >100%

  • 单线程跑满一个核 → 约 100%
  • 4 线程跑满 4 个核 → 约 400%

/usr/bin/time -v的Percent of CPU和perf stat的CPUs utilized都遵循这个规则,别看到 380% 就以为出错了。

2. 单次测量噪声大,建议多跑几次

系统后台任务、频率调节、缓存冷热都会影响单次结果。建议至少跑 3~5 次取平均,并观察离散程度:

foriin12345;do/usr/bin/time-f"%e s, CPU %P"./your_algorithmdone

%P就是Percent of CPU,%e是 wall time。

3. 区分“启动开销”和“稳态”

如果程序启动阶段有大量初始化(加载模型、分配内存、预热缓存),这部分会拉低平均 CPU 占用率。想测稳态性能,可以在程序内部加一个“预热 + 计时”的机制,只统计核心计算段的 CPU 时间,而不是整个进程生命周期。

4. 容器 / 虚拟化环境下的注意点

在 Docker 或虚拟机里测 CPU 占用,top显示的可能是宿主机的整体负载,而不是容器实际分配到的配额。此时建议:

  • 用docker stats看容器 CPU 使用
  • 用cat /sys/fs/cgroup/cpu/cpuacct.usage读容器累计 CPU 时间
  • 注意st(steal time)列,它表示被宿主机偷走的时间,虚拟化环境下可能偏高

5. 别忽略 IO 等待

如果程序大量读写磁盘,CPU 占用率看起来不高,但实际运行时间很长。此时wa列会偏高,说明瓶颈在 IO 而不是 CPU。测性能时要结合iostat一起看,避免误判。

五、总结

场景推荐工具
日常快速查看top/htop
看多核分布mpstat -P ALL 1
找进程pgrep -af/ps aux --sort=-%cpu
短程序平均占用/usr/bin/time -v(最推荐)
高精度计数perf stat
看波动曲线脚本采样/proc/PID/stat
历史趋势sar -u

核心结论:短生命周期程序,直接用/usr/bin/time -v或perf stat,一步到位拿到平均 CPU 占用率;想看波动再上脚本采样。别再用 top 去追一个已经跑完的程序了。

相关新闻

前端表格公式能力新选择|智表 ZCell 公式引擎深度剖析

前端表格公式能力新选择|智表 ZCell 公式引擎深度剖析

前言做填报系统、财务测算、报表平台&#xff0c;在线表格的公式计算能力是绕不开的硬需求。很多前端表格组件只实现简单加减运算&#xff0c;函数支持寥寥无几&#xff1b;跨表引用、命名区域、自定义函数能力缺失&#xff1b;导入导出 Excel 时公式直接丢失&#xff0c;业务流…

2026/10/21 2:37:57 阅读更多 →
AI 生图人物不一致?从参考图输入到结果审核的排查清单

AI 生图人物不一致?从参考图输入到结果审核的排查清单

给同一个角色做一组图片&#xff0c;第一张在室内&#xff0c;第二张换到街上&#xff0c;脸也跟着变了。继续往提示词里加“同一个人”“保持一致”&#xff0c;仍然未必有用。 先检查参考图有没有真正参与生成&#xff0c;再看它和文字要求是否一致。 第一&#xff0c;模型…

2026/10/21 2:37:57 阅读更多 →
实验操作开启DHCP和Telnet

实验操作开启DHCP和Telnet

一&#xff5c;DHCP 动态 IP 分配实验完整实操记录 &#x1f4cc;实验拓扑&#xff1a;Router路由器 1 台 S3700 二层交换机 2 台 PC 终端 4 台 R1-G0/0/0 连接左侧交换机&#xff0c;接入 PC1、PC2&#xff08;网段&#xff1a;192.168.1.0/24&#xff09; R1-G0/0/1 连接右…

2026/10/21 2:37:57 阅读更多 →

最新新闻

原生JavaScript实现五个经典网页特效:原理、代码与避坑指南

原生JavaScript实现五个经典网页特效:原理、代码与避坑指南

前阵子帮一个朋友的个人作品集站点做改版&#xff0c;对方提的唯一需求就是“别那么素&#xff0c;加点JavaScript特效让我打开第一眼就觉得高级”。这个需求听起来简单&#xff0c;实际上挺考验分寸感&#xff1a;特效加多了页面卡成PPT&#xff0c;特效选错了又像十年前的个人…

2026/10/21 3:22:21 阅读更多 →
基于YOLOv8的投篮自动计分系统:从数据标注到部署全解析

基于YOLOv8的投篮自动计分系统:从数据标注到部署全解析

每次投篮训练&#xff0c;身边要放个本子手动记分&#xff0c;一场下来还要回看录像数到底进了几个&#xff0c;这种场景我想很多经常打球或者带训练的人都不陌生。后来我干脆用YOLOv8做了一个投篮自动计分系统&#xff0c;摄像头架在篮架侧面&#xff0c;球员投篮完成&#xf…

2026/10/21 3:22:21 阅读更多 →
Nacos配置中心长轮询与动态刷新原理深度解析

Nacos配置中心长轮询与动态刷新原理深度解析

1. 项目概述&#xff1a;为什么说Nacos配置中心“超简单”其实是种误解很多人第一次看到“Nacos配置中心工作原理&#xff08;超简单&#xff09;”这个标题&#xff0c;会下意识点开——毕竟谁不想用最短时间搞懂一个分布式系统的核心组件&#xff1f;但实话讲&#xff0c;我带…

2026/10/21 3:22:21 阅读更多 →
基于YOLOv8的投篮计分系统:目标检测与状态机实战解析

基于YOLOv8的投篮计分系统:目标检测与状态机实战解析

1. 为什么执着于“投篮计分”这个点子&#xff1a;需求与选型练球的人大概都有过这种经历&#xff1a;想统计自己练了一个晚上到底进了多少球&#xff0c;只能把手机架在篮架旁边录像&#xff0c;练完再拖回去一帧帧数。数球不算难&#xff0c;但真的累&#xff0c;尤其是面对上…

2026/10/21 3:22:21 阅读更多 →
Java后端面试新趋势:微服务架构、安全工程与AI落地的核心考察点

Java后端面试新趋势:微服务架构、安全工程与AI落地的核心考察点

做技术这行十多年&#xff0c;帮人改简历、模拟面试的次数我自己都数不清了。今年明显感觉 Java 后端面试的评判标准变了&#xff0c;大厂后端岗位的需求&#xff0c;已经从“会用 Spring Boot 能调接口”进化成了“微服务架构落地能力 安全工程意识 AI 应用工程化”三位一体…

2026/10/21 3:22:21 阅读更多 →
高性能双通道音频功率放大器D7050

高性能双通道音频功率放大器D7050

在现代音频设备中&#xff0c;音频功率放大器的性能直接影响到音质的表现和设备的功耗。D7050 双通道音频功率放大器&#xff0c;以其低功耗、高输出功率和简洁的设计&#xff0c;为音频设备提供了卓越的放大解决方案。产品简介D7050 是一款高性能的双通道音频功率放大器&#…

2026/10/21 3:21:21 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →