如何测量 Linux 中的真实 CPU 使用率?

2024-03-11

我知道有类似的工具top and ps用于测量 CPU 使用率,但他们测量 CPU 使用率的方法是测量空闲任务未运行的时间。因此,例如,即使 CPU 由于缓存未命中而出现停顿,这些工具仍然会认为 CPU 被占用。然而,我想要的是分析工具在停顿期间将 CPU 视为空闲状态。有没有什么工具可以做到这一点?


像top和ps这样的工具用于测量CPU使用率,..通过测量空闲任务没有运行的时间来测量CPU使用率。

不,他们不测量空闲,他们只是通过 /proc/stat 读取内核对其 CPU 使用情况的看法(尝试vmstat 1工具也)。您是否检查过系统范围的用户+系统时间仅由idle?我认为,内核只是导出调度程序的一些统计信息,它记录重新调度时的用户/系统状态,包括系统计时器和阻塞系统调用(可能是调用者之一)cpuacct_charge http://lxr.free-electrons.com/ident?v=3.16;i=cpuacct_charge, like update_curr - 更新当前任务的运行时统计信息。).

/proc/stat 示例:

cat /proc/stat
cpu  2255 34 2290 22625563 6290 127 456

并解码为http://www.linuxhowtos.org/System/procstat.htm http://www.linuxhowtos.org/System/procstat.htm

第一个“cpu”行聚合了所有其他“cpuN”行中的数字。这些数字标识 CPU 执行不同类型工作所花费的时间量。时间单位为 USER_HZ 或Jiffies(通常为百分之一秒)。

各列的含义从左到右如下:

user: normal processes executing in user mode
nice: niced processes executing in user mode
system: processes executing in kernel mode
idle: twiddling thumbs

当我们听到 jiffie 时,这意味着调度程序用于获取数字,而不是估计idle任务(顶部甚至看不到此任务或 pid 0 的任务)。

因此,例如,即使 CPU 由于缓存未命中而出现停顿,这些工具仍然会认为 CPU 被占用。

基本上(当没有SMT https://en.wikipedia.org/wiki/Simultaneous_multithreading与 Intel 中的 HT 类似),当您的任务由于内存访问(或无序而采取错误路径)而导致管道停顿时,CPU 就会被占用。操作系统无法运行其他任务,因为任务切换比等待这一任务的成本更高。

SMT 的情况有所不同,因为有些硬件要么在单个硬件上切换两个逻辑任务,要么甚至(在细粒度 SMT 中)将它们的指令(微操作)混合到单个流中以在共享硬件上执行。通常有SMT统计计数器来检查实际的混合情况。

然而,我想要的是分析工具在停顿期间将 CPU 视为空闲状态。有没有什么工具可以做到这一点?

性能监控单元可能有对此有用的事件。例如,perf stat报道了一些(在桑迪布里奇)

$ perf stat /bin/sleep 10

 Performance counter stats for '/bin/sleep 10':
      0,563759 task-clock                #    0,000 CPUs utilized          
             1 context-switches          #    0,002 M/sec                  
             0 CPU-migrations            #    0,000 M/sec                  
           175 page-faults               #    0,310 M/sec                  
       888 767 cycles                    #    1,577 GHz                    
       568 603 stalled-cycles-frontend   #   63,98% frontend cycles idle   
       445 567 stalled-cycles-backend    #   50,13% backend  cycles idle   
       593 103 instructions              #    0,67  insns per cycle        
                                         #    0,96  stalled cycles per insn
       115 709 branches                  #  205,246 M/sec                  
         7 699 branch-misses             #    6,65% of all branches        

  10,000933734 seconds time elapsed

因此,它表示 sleep 10 使用了 0,5 jiffie(任务时钟)。它太低,无法在经典 rusage 中计算,并且 /usr/bin/time 得到 0 jiffie 作为任务 CPU 使用率(用户 + 系统) ): $ /usr/bin/时间睡眠 10 0.00user 0.00system 0:10.00elapsed 0%CPU (0avgtext+0avgdata 2608maxresident)k 0 个输入+0 个输出(0 个主要+210 个次要)页面错误 0 个交换

然后 perf 测量(在 PMU 的帮助下计数)任务执行的实际周期和实际指令(以及代表任务的内核) -cycles and instructions线。 Sleep 使用了 888k 个周期,但只完成了 593k 条有用指令,这意味着IPC https://en.wikipedia.org/wiki/Instructions_per_cycle为 0.6-0.7(30-40% 失速)。大约丢失了 30 万个周期;和桑迪桥上perf报告他们失踪的地点 -stalled-cycles-*前端事件(解码器 - 由于分支未命中或代码未预取到 L1I,CPU 不知道要执行什么)和后端事件(无法执行,因为指令需要内存中的一些数据,而这些数据在正确的时间不可用 -内存停滞)。

为什么我们在 CPU 内部看到更多的停顿,而实际上应该只有 300k 个周期而没有执行任何指令?这是因为现代处理器通常是超标量和无序的 - 它们可以在每个 CPU 时钟周期开始执行多个指令,甚至重新排序它们。如果您想查看执行端口利用率,请尝试ocperf(性能包装)来自 Andi Kleen'spmu工具 https://github.com/andikleen/pmu-tools以及一些有关 PMU 计数器的 Intel 手册。还有toplev.py脚本为“识别工作负载的微架构瓶颈“无需手动选择英特尔事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测量 Linux 中的真实 CPU 使用率? 的相关文章

随机推荐

  • Delphi拖拽能否“提升”为对接?

    我有一个TPageControl其页面都是使用附加的各种形式ManualDock 用户应该能够通过拖动选项卡来重新排列选项卡 这已经可以使用了 然而 也应该可以取消停靠的表单 现在我有以下代码 procedure TMainForm Pag
  • Git 提交后挂钩:如何在 Windows 中启动 bat 文件

    我有一个带有名称的bat文件jenkins bat开始在詹金斯服务器上构建进程 现在我想在 git 中将这个 bat 文件作为 post commit hook 执行 因此创建了以下文件post commit在文件夹中 git hooks
  • cd:参数太多 - 空格正确转义+引号?

    使用 cygwin 终端 我的 bashrc 中有以下内容 export WINHOME cygdrive c Users userName export TUTORING WINHOME Desktop Coding Projects T
  • 如何计算OpenCV中Mat的最大像素值[重复]

    这个问题在这里已经有答案了 我想 这应该是显而易见的 但我找不到简单的方法来找到 OpenCV Mat 中所有像素中的最大值 当然 我可以对每种像素类型执行以下操作 但一般的 max 函数仍然有用 double cvMax cv Mat m
  • Woocommerce:支付网关自定义感谢页面

    我正在创建一个 Woocommerce 自定义支付网关插件 它基本上将用户重定向到支付服务页面 然后支付服务页面将用户重定向回指定的 URL 一切都按预期工作 但我似乎无法创建自定义感谢页面从插件 我所说的 来自插件 的意思是 如果有人安装
  • 使Python程序可执行

    from distutils core import setup import py2exe sys os sys argv append py2exe setup options py2exe bundle files 1 windows
  • 使用ansible复制本地文件(如果存在)

    我正在一个项目中工作 我们使用 ansible 来创建部署服务器集群 我必须实现的任务之一是将本地文件复制到远程主机 前提是该文件本地存在 现在我正在尝试用这个来解决这个问题 hosts 127 0 0 1 connection local
  • boost::container::vector 无法使用 C++03 编译器进行编译

    以下示例在使用带有 std c 0x 标志的 GCC 4 4 6 时可以正常编译 但在 C 03 模式下无法编译 include
  • 在 iOS 上读取实时摄像头流的 getUserMedia() 替代方案?

    我们正在使用 QuaggaJS 构建一个移动条形码扫描仪 它可以直接从设备的摄像头流中读取条形码 在桌面 Android 上运行良好 但在 iOS 上根本不起作用 从最初的研究来看 我发现 iOS 根本不支持 WebRTC getUserM
  • 关于客户端安全,CORS 除了破坏同源策略之外还有其他作用吗?

    如果没有 它真的可以提高客户端安全性吗 我正在考虑来自服务器 X 的脚本使用 XHR 从服务器 Y 支持 CORS 获取并运行不受信任的代码的情况 显然评估不受信任的代码是不好的 我根本不使用 CORS 来提高安全性 我使用 CORS 访问
  • 如何使用 iOS 版 Facebook App Invite SDK 邀请“谁”?

    我一直在尝试让 谁 在我的应用程序上邀请某人 但没有成功 查看了 FB 文档 却一无所获 我的意思是 用户 邀请 朋友 朋友 点击 FB 对话框上的安装 将他带到 App Store 在那里他 她安装我的应用程序 安装应用程序后 应用程序链
  • Javascript中如何判断现在是白天还是晚上? [复制]

    这个问题在这里已经有答案了 我想根据浏览器的时间将不同的 CSS 表应用到我的网站 例如 如果是白天 则显示 day css 或 night css 表示夜间 我可以使用 PHP 执行此操作 但它基于服务器时间 而不是浏览器本地时间 有没有
  • dbpedia SPARQL 查询获取给定城市的某些值

    我确信我想做的事情非常简单 但我似乎无法正确查询 我在数据集中有记录 其中包含城市名称等值 例如 纽约 及其相应的国家 地区代码 例如 美国 我还可以访问完整的国家 地区名称和国家 地区 ISO 代码 我想通过使用 where 子句从 db
  • pear邮件功能密件抄送不会发送

    我从网站复制了 PEAR 邮件的代码 并输入了我的数据 有用 它发送邮件 但是 我想使用密件抄送发送给很多人并保持他们的地址匿名 并且它将发送到 to 收件人 但不是 bcc 代码
  • 如何分别删除有关 Firebase/Analytics 和 swizzing 的 Firebase 警告和控制台消息?

    不知道为什么 firebase 会发出警告说我没有包含Firebase Analytics虽然我不需要它 我在用着Firebase Messaging尽管 我知道消息传递正在按预期工作 那么 我该如何删除这样的警告 Pods Firebas
  • Composer - 使用本地存储库

    我是一名 Composer 初学者 我试图使一个项目依赖于另一个项目 而这两个项目仅存在于我的本地计算机上 我的库项目 ProjectA 中的composer json是 name project util type library 我在这
  • Haskell 中是否有一个内置函数可以获取列表中大小为 n 的所有连续子序列?

    例如 我需要一个函数 gather Int gt a gt a gather n list where gather 3 Hello Hel ell llo ol 我有一个有效的实现 gather Int gt a gt a gather
  • 如何为mysql中的一组记录提供相同的序列号

    我是 mysql 的新手 我在购物车表中有如下记录 id code 1 100 2 101 3 102 4 100 5 100 6 101 我的例外输出如下 id code serial number 1 100 1 2 101 2 3 1
  • Windows 7 Aero 主题进度条错误?

    我在 Windows 7 上遇到了我认为是进度条错误的问题 为了演示该错误 我创建了一个带有按钮和进度条的 WinForm 应用程序 在按钮的 单击 句柄中 我有以下代码 private void buttonGo Click object
  • 如何测量 Linux 中的真实 CPU 使用率?

    我知道有类似的工具top and ps用于测量 CPU 使用率 但他们测量 CPU 使用率的方法是测量空闲任务未运行的时间 因此 例如 即使 CPU 由于缓存未命中而出现停顿 这些工具仍然会认为 CPU 被占用 然而 我想要的是分析工具在停