使用 perf probe测量Linux用户空间代码的执行时间

news/2024/11/16 2:58:16/文章来源:https://www.cnblogs.com/testing-/p/18383538

1 Linux perf 简介

perf 是 Linux 内核自带的一个强大的性能分析工具,它能够深入到内核和用户空间,提供丰富的性能计数器和事件跟踪功能,帮助开发者和系统管理员精确地定位系统性能瓶颈。

image

1.1 perf 的主要功能:

  • 性能事件采样: 可以采样各种硬件性能事件,如 CPU 周期、缓存命中率、指令退休率等,从而分析程序在 CPU 上的执行情况。
  • 软件事件跟踪: 可以跟踪内核和用户空间的函数调用、系统调用等软件事件,分析程序的执行流程和函数调用关系。
  • 性能计数器: 提供了大量的硬件性能计数器,可以用来分析 CPU、内存、缓存等硬件资源的使用情况。
  • 火焰图生成: 可以生成火焰图,直观地展示程序的调用栈,快速定位性能热点。
  • 实时监控: 可以实时监控系统的性能指标,帮助快速发现性能问题。

1.2 perf 的工作原理:

perf 主要通过以下方式来收集性能数据:

  • 硬件性能计数器: 利用 CPU 内置的性能计数器,直接获取硬件的性能数据。
  • 软件事件跟踪: 在内核和用户空间插入探针,跟踪软件事件的发生。
  • 内核协作: perf 与内核紧密协作,通过内核接口获取性能数据。

1.3 perf 的常用命令:

  • perf list: 列出所有可用的性能事件。
  • perf stat: 统计性能事件的计数。
  • perf record: 记录性能数据。
  • perf report: 分析记录的数据,生成报告。
  • perf top: 实时显示占用 CPU 时间最多的函数。
  • perf trace: 追踪系统调用和软中断。

1.4 perf 的应用场景:

  • 定位性能瓶颈: 通过分析性能数据,找出程序中消耗时间最长的部分。
  • 优化代码: 根据性能分析结果,有针对性地优化代码。
  • 分析系统问题: 分析系统性能问题,如 CPU 负载过高、内存泄漏等。
  • 调优内核参数: 调整内核参数,提高系统性能。

1.5 perf 的优势:

  • 功能强大: 提供了丰富的性能分析功能。
  • 灵活易用: 命令行界面简单易学。
  • 开源免费: 作为 Linux 内核的一部分,完全免费。
  • 社区活跃: 有一个庞大的社区,提供丰富的文档和支持。

2 使用 perf probe测量Linux用户空间代码的执行时间

2.1 测量的示例程序evenodd.c

#include <stdio.h>
#include <unistd.h>void even(void)
{printf("it is even\n");
}void odd(void)
{printf("it is odd\n");
}
int main()
{int i;for (i = 0; ;i++) {usleep(500);if (i % 2)odd();elseeven();}
}

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • https://bristot.me/using-perf-probe-to-measure-execution-time-of-user-space-code-on-linux/
  • 如需技术支持联系钉ding或微信pythontesting , 邮箱: xurongzhong#126.com

2.2 使用调试符号编译 even odd:

# gcc -o -g evenodd evenodd.c
# perf probe --line even -x evenodd
<even@/root/code/evenodd.c:0>0  void even(void){2       printf("it is even\n");3  }void odd(void){

2.3 添加探针

在 even() 函数的开头添加 perf 探针,请运行以下命令:

# perf probe -x evenodd 'even'

要获取给定函数的执行时间,我们需要在函数的最后一行添加探针。如 perf probe -line 示例所示,是第 3 行。下面的命令在 evenondd 二进制文件的函数 event() 的第 3 行添加了名为 even_end event 的探针。

# perf probe -x evenodd 'even_end=even:3'

开始运行evenodd应用程序后,运行以下命令记录 even() 执行 10 秒的进入和退出探针:

# perf record -e probe_evenodd:even -e probe_evenodd:even_end -a sleep 10

记录结束后,可以使用以下命令打印跟踪结果:

# perf scriptevenodd 2342328 [034] 1232877.416865:     probe_evenodd:even: (4006c4)evenodd 2342328 [034] 1232877.416875: probe_evenodd:even_end: (4006d8)evenodd 2342328 [034] 1232877.417990:     probe_evenodd:even: (4006c4)evenodd 2342328 [034] 1232877.417996: probe_evenodd:even_end: (4006d8)evenodd 2342328 [034] 1232877.419109:     probe_evenodd:even: (4006c4)
...

2.4 python分析

还可以使用 perf python脚本自动计算执行时间。捕获这两个事件的跟踪后,以下命令将生成名为 perf-script.py 的 python 脚本框架:

# perf script -g python

然后编辑探测处理程序,计算执行时间:

# perf script event handlers, generated by perf script -g python
# Licensed under the terms of the GNU GPL License version 2# The common_* event handler fields are the most useful fields common to
# all events.  They don't necessarily correspond to the 'common_*' fields
# in the format files.  Those fields not available as handler params can
# be retrieved using Python functions of the form common_*(context).
# See the perf-script-python Documentation for the list of available functions.from __future__ import print_functionimport os
import syssys.path.append(os.environ['PERF_EXEC_PATH'] + \'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')from perf_trace_context import *
from Core import *def trace_begin():print("in trace_begin")def trace_end():print("in trace_end")start=0
def probe_evenodd__even(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, __probe_ip, perf_sample_dict):global startstart=(common_secs * 1000000000) + common_nsecsdef probe_evenodd__even_end(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, __probe_ip, perf_sample_dict):now=common_secs * 1000000000 + common_nsecsduration=now - startprint("even runtime: " + str(duration) + " ns")def trace_unhandled(event_name, context, event_fields_dict, perf_sample_dict):print(get_dict_as_string(event_fields_dict))print('Sample: {'+get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')def print_header(event_name, cpu, secs, nsecs, pid, comm):print("%-20s %5u %05u.%09u %8u %-20s " % \(event_name, cpu, secs, nsecs, pid, comm), end="")def get_dict_as_string(a_dict, delimiter=' '):return delimiter.join(['%s=%s'%(k,str(v))for k,v in sorted(a_dict.items())])

然后,运行以下命令,就可以打印出函数 even 的执行时间:

# perf script -s perf-script.py  | tail
even runtime: 6540 ns
even runtime: 7080 ns
even runtime: 6770 ns
even runtime: 7220 ns
even runtime: 6850 ns
even runtime: 6390 ns
even runtime: 6910 ns
even runtime: 6760 ns
even runtime: 7460 ns
in trace_end

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

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

相关文章

【SpringBoot】SmartLifecycle 的执行过程以及执行顺序

1 前言 之前看过 SpringBoot 启动后,Tomcat监听端口也就是正式接收请求的开启时机以及启动时向注册中心注册服务的时机,都是在刷新上下文的 finishRefresh() 阶段通过执行生命周期的 Bean 来得到执行的。 当有多个 Bean 的话他们的执行顺序有没有什么说法呢,出于这个思考,…

读软件开发安全之道:概念、设计与实施11安全地编程

安全地编程1. 安全地编程 1.1. 在一个完整的软件设计过程中,我们要在创建和审查时就将安全性放在心中,但这只是产品开发过程的开始,接下来是实现、测试、部署、运行、监控、维护,并最终在生命周期结束时将其淘汰 1.2. 开发人员不仅必须忠实地实现一个优良设计中明确的安全规…

使用RMBG-1.4进行抠图(背景移除)

使用RMBG-1.4进行抠图(背景移除) 说明:首次发表日期:2024-08-28 RMBG-1.4 Hugging Face 地址: https://huggingface.co/briaai/RMBG-1.4准备工作 创建环境并安装依赖:: # 如果`~/.local/lib/python3.10/site-packages`里面存在python模块,需要禁用。 ## 可以直接删除该…

maven远程仓库配置及含义解释

0 下载依赖的过程1 默认情况下maven会去中央仓库central找依赖或插件无需额外配置2 配置多个repository仓库时会先查找central仓库再依此查找多个repository仓库需要配置<profile><id>myprofile1</id><!--依赖仓库配置--><repositories><!--配…

迁移Swift项目到OC项目

文件迁移我直接把GuitarTunerApp文件夹迁移过去了 直接运行,提示 2个问题: 2.我们在我们先解决第2个,选择swift的版本: 选择项目文件,然后选择你的目标(Target)。 点击 "Build Settings" 选项卡。 确保 Swift Compiler - Language 下的 Swift Version 设置正确,…

Spring Boot+Dubbo

介绍Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目。这里是需要使用到Zookeeper的,可以理解为Nacos和OpenFeign,需要把不同的服务注册到Zookeeper然后不同服务之间需要相互调用,则…

3.外设GPIO、中断

GPIO:通用输入输出端口GPIO特点:1.快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)2.每个IO口都可以做中断3.支持8种工作模式GPIO电气特性:STM32工作电压范围:2 V ≤ VDD ≤ 3.6 VGPIO识别电压范围:  COMS端口:-0.3V ≤ VIL ≤ 1.164V(0);1.833V …

桌面软件/exe程序软件自动化大宝剑--lackey之初识

C/S架构端下的软件在IT发展长河中,渐渐的在大多数从业者已经淡忘。现有的PC端上的软件 也是在极力的前浪推后浪,更新替代一些老派的语言追寻潮流。互联网的软件开发就是IOT,HTTPclient ,鲜有 exe的桌面软件;某也喜欢追新潮学互联网技 术,自动化就接触APP WEB API并使用网…

全网最适合入门的面向对象编程教程:40 Python常用复合数据类型-枚举和enum模块的使用

在 Python 中,枚举(Enumeration, Enum)是一种复合数据类型,用于表示一组相关但不同的常量值。枚举类型允许我们使用人类可读的名称代替代码中的魔法数字或字符串,Python 提供了 enum 模块来实现枚举类型。全网最适合入门的面向对象编程教程:40 Python 常用复合数据类型-…

rn node 版本问题

报错信息:Command PhaseScriptExecution failed with a nonzero exit codeFailed to construct transformer: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:79:19)at Object.createHash (node:crypto:139:10)at sta…

替代BeyondCompare,四款免费文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…

替代BeyondCompare,免费四款文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…