perf 中的 cpu-cycles event 介绍

perf 中的 cpu-cycles event 介绍

cycles简介

cycles事件记录处理器核心执行的时钟周期数。每个时钟周期代表处理器内部时钟振荡器的一个周期。这个事件通常用于衡量处理器的执行速度,因为它直接反映了指令执行所需的时间。一个较高的cycles计数可能意味着代码执行较慢,因为需要更多的时钟周期来完成任务。

instructions 和 cycles的关系

instructions事件则记录处理器执行的指令数。这通常用来评估指令级别的效率,因为它显示了程序执行了多少条指令。如果一条指令需要多个时钟周期来执行,那么instructions与cycles之间的比率可以用来估算指令级的效率。一个较低的instructions/cycle比率表示更高的指令级并行性或更有效的代码。

在性能分析中,通常会关注这两个指标的比值,即instructions per cycle (IPC),来评估代码的执行效率。IPC越高,表示每时钟周期执行的指令越多,程序的执行效率也就越高。如果一个程序的IPC下降,可能是因为出现了分支预测错误、内存访问延迟或其他性能瓶颈。

perf cycles 分析

看环境是否支持 cycles 采集

[root@localhost ~]# perf list | grep cycles
...cpu-cycles OR cycles                               [Hardware event]
...

查看当前环境cpu频率: 2.6GHz

[root@localhost ~]# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
2600000

写一个简单的程序,让cpu利用率跑100%:

// test.cpp
int main() {while(1);return 0;
}
[root@localhost ~]# g++ test.cpp -o test
[root@localhost ~]# ./test
[root@localhost ~]# perf stat -e cycles -p `pidof test` sleep 1Performance counter stats for process id '515011':2,601,831,429      cycles1.000756985 seconds time elapsed

可以看出这个值近似等于2.6G

进一步测试

写一个程序,让控制cpu利用率在20%左右

#include <iostream>
#include <chrono>
#include <unistd.h>int main() {int ratio = 20;int base_time = 1000;int sleeptime = base_time * (100-ratio);int runtime = base_time * ratio;while(true) {auto start = std::chrono::high_resolution_clock::now();while(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - start).count() < runtime) {}usleep(sleeptime);}return 0;
}

[root@localhost ~]# perf stat -e cycles -p `pidof test` sleep 1Performance counter stats for process id '515142':520,289,676      cycles1.000767149 seconds time elapsed

520,289,676/2,601,831,429=0.199
可以看出,结合cycles 和 系统频率可以换算出cpu利用率,利用perf采集各个线程的cycles,可以计算这个线程的负载。

采用perf record 的 方式

控制采集频率为 50Hz

[root@localhost ~]# perf record -h-a, --all-cpus        system-wide collection from all CPUs-c, --count <n>       event period to sample-e, --event <event>   event selector. use 'perf list' to list available events-F, --freq <freq or 'max'>profile at this frequency
[root@localhost ~]# perf record -e cycles -F 1  -p `pidof test`  sleep 50
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.014 MB perf.data (12 samples) ]
[root@localhost ~]# perf script -i perf.datatest 515142 4507231.759994:          1 cycles:  ffff50d8eeff379c finish_task_switch+0x74 ([kernel.kallsyms])test 515142 4507231.759996:          1 cycles:  ffff50d8eeff379c finish_task_switch+0x74 ([kernel.kallsyms])test 515142 4507231.759997:          1 cycles:  ffff50d8eeff379c finish_task_switch+0x74 ([kernel.kallsyms])test 515142 4507231.760015:      45456 cycles:      ffff904e03cc __kernel_clock_gettime+0xcc ([vdso])test 515142 4507243.582136: 6176126731 cycles:            400a40 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x58 (/home/test)test 515142 4507248.582382: 2593218597 cycles:            4009d4 std::chrono::duration<long, std::ratio<1l, 1000000l> >::count+0x4 (/home/test)test 515142 4507253.582381: 2592326656 cycles:            400a28 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x40 (/home/test)test 515142 4507258.581960: 2591492485 cycles:      ffff904e03f4 __kernel_clock_gettime+0xf4 ([vdso])test 515142 4507263.581284: 2591325615 cycles:            400a28 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x40 (/home/test)test 515142 4507268.580381: 2590221715 cycles:      ffff904e03e4 __kernel_clock_gettime+0xe4 ([vdso])test 515142 4507273.501923: 2596489317 cycles:            400964 std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >::time_since_epoch+0x4 (>test 515142 4507278.502390: 2594059695 cycles:      ffff904e040c __kernel_clock_gettime+0x10c ([vdso])

以1Hz的频率采样,可以看出,当perf稳定下来后,cycles稳定在 2.59e6,相邻的数据事件间隔5s,换算过后,也是相当于20%的cpu占用率。但是这似乎与我的预期不符,我的程序1s中实际会在运行状态下多次,理论上每秒都会采到,采样率1Hz,cpu利用率,采样时间50s, 实际的样本个数才有12个,似乎是 样本个数约等于采样间隔 * 采样频率 * 线程cpu利用率。

通过此方法计算线程的利用率,必须考虑时间戳,或者计算的周期要比采样周期大很多,如果采样1s,每1s计算下占用率,那么就会出现每5s的计算的线程占用率100%,其余是0%;

将程序绑在 core 10 上运行,观察现象。现象基本一致。

[root@localhost ~]# perf record -e cycles -F 1  -C 10  sleep 50
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.417 MB perf.data (11 samples) ]
[root@localhost ~]# perf script -i perf.datatest 515307 [010] 4509711.079092:          1 cycles:            400a10 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x28 (/home/test)test 515307 [010] 4509711.079094:          1 cycles:            400a10 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x28 (/home/test)test 515307 [010] 4509711.079095:          1 cycles:            400a10 std::chrono::operator-<long, std::ratio<1l, 1000000000l>, long, std::ratio<1l, 1000000000l> >+0x28 (/home/test)test 515307 [010] 4509711.079121:      67206 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 [010] 4509726.498642: 8000773091 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 [010] 4509731.213642: 2447049195 cycles:      fffd5d4503e0 __kernel_clock_gettime+0xe0 ([vdso])test 515307 [010] 4509736.170329: 2574579536 cycles:      fffd5d4503e4 __kernel_clock_gettime+0xe4 ([vdso])test 515307 [010] 4509741.066237: 2540232188 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 [010] 4509746.031759: 2575910682 cycles:      fffd5d2f9ba0 clock_gettime@plt+0x0 (/usr/lib64/libstdc++.so.6.0.24)test 515307 [010] 4509750.937614: 2546808087 cycles:      fffd5d45040c __kernel_clock_gettime+0x10c ([vdso])test 515307 [010] 4509755.894792: 2574924584 cycles:            400878 main+0x74 (/home/test)

以固定周期数采样

[root@localhost ~]# perf record -e cycles -c 520000000  -p `pidof test` sleep 10
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.014 MB perf.data (9 samples) ]
[root@localhost ~]# perf script -i perf.datatest 515307 4510198.258890:  520000000 cycles:            400a94 std::chrono::__duration_cast_impl<std::chrono::duration<long, std::ratio<1l, 1000000l> >, std::ratio<1l, 1000l>, long, true, false>::__cast<long, std::ratio<1l, 1000000000l> >>test 515307 4510199.263843:  520000000 cycles:      fffd5d4503e4 __kernel_clock_gettime+0xe4 ([vdso])test 515307 4510200.268764:  520000000 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 4510201.273860:  520000000 cycles:      fffd5d325304 std::chrono::_V2::system_clock::now+0x4c (/usr/lib64/libstdc++.so.6.0.24)test 515307 4510202.278955:  520000000 cycles:            400a8c std::chrono::__duration_cast_impl<std::chrono::duration<long, std::ratio<1l, 1000000l> >, std::ratio<1l, 1000l>, long, true, false>::__cast<long, std::ratio<1l, 1000000000l> >>test 515307 4510203.275996:  520000000 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 4510204.281150:  520000000 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 4510205.286123:  520000000 cycles:      fffd5d4503f4 __kernel_clock_gettime+0xf4 ([vdso])test 515307 4510206.291034:  520000000 cycles:            400ab0 std::chrono::duration<long, std::ratio<1l, 1000000l> >::duration<long, void>+0x14 (/home/test)

这样每秒都可以采到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中指定大小分割数组的一种实现

今天分享一个使用JavaScript分割数组为多个自数组的方法实现。我使用它的场景如下&#xff1a; 给定一个数组 arr 和指定大小 fixed&#xff1a; const arr [{id: 1,name: name1},{id: 2,name: name2},{id: 3,name: name3},{id: 4,name: name4},{id: 5,name: name5},{id: 6,…

2024版本idea集成SpringBoot + Ai 手写一个chatgpt 【推荐】

题目&#xff1a;SpringBoot OpenAi 在这里获取key和url&#xff1a;获取免费key base-url为这两个&#xff1a; 话不多说直接来&#xff01; 一、简介 Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则&#xff08;如可移植性和模块化设计&#xff…

暗区突围pc资格 暗区突围pc端测试资格获取

《暗区突围》的诞生&#xff0c;仿佛在游戏界投下了一枚深水炸弹&#xff0c;它不仅仅是射击游戏的新标杆&#xff0c;更是对玩家策略思维、生存直觉与团队协作能力的一次全面考验。在这个精心构建的虚拟战场中&#xff0c;每一次踏入暗区&#xff0c;都是对未知的探索&#xf…

【练习4】

1.两数之和 暴力&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();vector<int> res(2, -1); // 初始化结果为-1for (int i 0; i < n; i) {int temp nums[i];for (int j i 1; j <…

Python 技巧:满意的逗号放置

当你在 Python 中添加或删除列表、字典或集合中的项目时&#xff0c;记住总是将所有行结尾加一个逗号。这是一个非常有用的技巧&#xff0c;可以帮助你避免一些常见的问题。 不确定我所说的什么&#xff1f;让我给你一个快速示例。假设你在代码中有一個名单列表&#xff1a; …

银行家算法简易实现

这里写目录标题 实验要求内容代码main.cppmyfunc.hmyfunc.cpp 运行结果与分析 实验要求 程序可以针对不同进程的请求进行判断&#xff0c;并决定是否满足其需求。算法程序需要设计合理的数据结构&#xff0c;对资源情况、进程相关数据进行存储。 内容 随机生成数据, 并校验数据…

做视频号小店,怎么找达人合作?这里有详细讲解

大家好&#xff0c;我是电商笨笨熊 做视频号小店是没有自然流量的&#xff0c;这点刚入驻的新玩家还不清楚&#xff1b; 因此很多老电商玩家们还想着继续拿其他平台动销自然流的玩法去做视频号&#xff1b; 只能说这种方式在视频号是完全行不通的&#xff0c;当下想要推广售…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则&#xff08;SRP&#xff09; 三、合成|聚合复用原则&#xff08;CARP&#xff09; 四、开放-封闭原则 五、迪米特法则&#xff08;LoD&#xff09; 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

Python-VBA函数之旅-setattr函数

目录 一、setattr函数的常见应用场景 二、setattr函数使用注意事项 三、如何用好setattr函数&#xff1f; 1、setattr函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog.csdn.net/ygb_1024?…

宏集Panorama SCADA软件获BACnet BTL认证

Panorama 获得BACnet BTL认证 建筑物的组件&#xff08;空调系统、照明传感器等&#xff09;能否使用共同通讯协议&#xff1f;这正是标准化 BACnet协议&#xff08;Building Automation and Control Networks&#xff09;所提供的功能。该协议旨在实现建筑物中各种设备和系统…

【TS】入门

创建项目 vscode自动编译ts 生成配置文件 tsc --init 然后发现终端也改变了&#xff1a;

SOCKET编程(3):相关结构体与函数

相关结构体与函数 sockaddr、sockaddr_in结构体 sockaddr和sockaddr_in详解 struct sockaddr共16字节&#xff0c;协议族(family)占2字节&#xff0c;IP地址和端口号在sa_data字符数组中 /* Structure describing a generic socket address. */ struct sockaddr {__SOCKADDR…

抓大鹅教程电脑端秒通关……

大家好&#xff0c;我是小黄。 最近抓大鹅小程序游戏很火&#xff0c;抓大鹅小游戏是由青岛蓝飞互娱科技股份有限公司开发并推出的一款休闲益智类三消游戏。在游戏中&#xff0c;玩家需要在特定的“购物篮子”背景下&#xff0c;找到三个相同的物品并将其消除。游戏的玩法简单…

社工库信息查询

此网站需要注册账号&#xff0c;新用户注册送3点券&#xff0c;每日签到可获得1.5点券。也可通过充值来查 我这里有方法可以利用缺陷来无限获取点券查人

Python 实战之量化交易

1. Python 实战之量化交易 2..Python量化交易实战-04.量化交易系统架构的设计 Python量化交易实战-04.量化交易系统架构的设计 - 知乎 3.Python量化交易实战-06.通过PythonAPI获取股票数据 Python量化交易实战-06.通过PythonAPI获取股票数据 - 知乎 3.Python量化交易实战…

程序员的归宿。。

大家好&#xff0c;我是瑶琴呀。 相信每个进入职场的人都考虑过自己的职业生涯规划&#xff0c;在不同的年龄段可能面临不同挑战&#xff0c;这点对于 35 的人应该更为感同身受。 对于程序员来说&#xff0c;大部分人的职业道路主要是下面三种&#xff1a;第一条&#xff0c;…

【Delphi 爬虫库 6】使用正则表达式提取猫眼电影排行榜top100

正则表达式库的简单介绍 正则表达式易于使用&#xff0c;功能强大&#xff0c;可用于复杂的搜索和替换以及基于模板的文本检查。这对于输入形式的用户输入验证特别有用-验证电子邮件地址等。您还可以从网页或文档中提取电话号码&#xff0c;邮政编码等&#xff0c;在日志文件中…

人生是旷野,不是轨道

最近看到一句话&#xff0c;很喜欢&#xff0c;分享一下。"人生是旷野&#xff0c;不是轨道"。人生不是固定的方程式&#xff0c;也没有唯一答案&#xff0c;没有谁生来就应该是什么样。别太被太多世俗观念束缚住手脚&#xff0c;每个人都有权利自由生长&#xff0c;…

用友畅捷通T+ keyEdit sql注入漏洞

产品介绍 畅捷通 T 是一款灵动&#xff0c;智慧&#xff0c;时尚的基于互联网时代开发的管理软件&#xff0c;主要针对中小型工贸与商贸企业&#xff0c;尤其适合有异地多组织机构&#xff08;多工厂&#xff0c;多仓库&#xff0c;多办事处&#xff0c;多经销商&#xff09;的…

朋友圈刷屏的粘土风格照片,你体验过了吗?

Remini 的粘土风格真的丑萌丑萌的&#xff01; 从去年“妙鸭相机”的走红&#xff0c;到今年Remini的刷屏&#xff0c;其实可以看出大众对于图片趣玩的兴趣非常大&#xff01; 一张普通的照片经过工具的处理&#xff0c;一下子变成新风格&#xff0c;让人眼前一亮。如果你也对…