当前位置: 首页 > news >正文

uprobe trace多线程mutex等待耗时

问题背景环境

ubuntu2204 服务器支持debugfs uprobe,为了提升应用程序的性能,需要量化不同参数下多线程主程序等待在mutex上的耗时区别

linux document中对uprobe events的说明如下

uprobetracer.rst - Documentation/trace/uprobetracer.rst - Linux source code (v6.1.34) - BootlinElixir Cross Referencer - Explore source code in your browser - Particularly useful for the Linux kernel and other low-level projects in C/C++ (bootloaders, C libraries...)icon-default.png?t=N6B9https://elixir.bootlin.com/linux/v6.1.34/source/Documentation/trace/uprobetracer.rst

uprobe event基本使用

uprobe event 测试追踪共享库中的符号func_test和执行文件中的符号main_test

//test.c 
#include <stdio.h>
int func_test(void)
{printf("uprobe test\n");
}//main.c 
#include <stdio.h>
extern int func_test(void);
void main_test(void)
{printf("main test\n");
}
int main(void)
{func_test();main_test();return 0;
}
//run.sh 
if [ "_$1" = "_set" ]; then
echo build...
gcc -shared -fPIC -o libuptest.so ./test.c 
gcc main.c -o uptestbin -L./ -luptest
else
echo run...
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ 
./uptestbin
fi
//编译完成后文件列表
tree ./
./
├── libuptest.so
├── main.c
├── run.sh
├── test.c
└── uptestbin

查看main_test 与 func_test符号地址

readelf -s ./libuptest.so | grep func_test6: 0000000000001119    26 FUNC    GLOBAL DEFAULT   14 func_test23: 0000000000001119    26 FUNC    GLOBAL DEFAULT   14 func_test
readelf -s ./uptestbin | grep main_test24: 0000000000001169    26 FUNC    GLOBAL DEFAULT   16 main_test
//1.先清一下trace,disable uprobe trace
echo 0 > /sys/kernel/debug/tracing/events/uprobes/enable 
echo "" > /sys/kernel/debug/tracing/trace//2.把追踪事件注册成uprobe events,具体语法参见kernel文档中描述
echo 'p /home/path/test_prj/libuptest.so:0x1119' > /sys/kernel/debug/tracing/uprobe_events 
echo 'r /home/path/test_prj/uptestbin:0x1169' > /sys/kernel/debug/tracing/uprobe_events //3.确认events注册成功
cat /sys/kernel/debug/tracing/uprobe_events
p:uprobes/p_libuptest_0x1119 /home/path/test_prj/libuptest.so:0x0000000000001119
r:uprobes/p_uptestbin_0x1169 /home/path/test_prj/uptestbin:0x0000000000001169tree /sys/kernel/debug/tracingevents/uprobes/
events/uprobes/
├── enable
├── filter
├── p_libuptest_0x1119
│   ├── enable
│   ├── filter
│   ├── format
│   ├── hist
│   ├── id
│   ├── inject
│   └── trigger
└── p_uptestbin_0x1169├── enable├── filter├── format├── hist├── id├── inject└── trigger//4.重新enable uprobe trace
echo 1 > /sys/kernel/debug/tracing/events/uprobes/enable //5.执行程序并查看trace log
./run.sh
cat /sys/kernel/debug/tracing/trace#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |uptestbin-20980   [003] DNZff 109458.753460: p_libuptest_0x1119: (0x7f4fc9d6d119)uptestbin-20980   [003] DNZff 109458.753487: p_uptestbin_0x1169: (0x5576f8d4f195 <- 0x5576f8d4f169)

app源码修改

我们想追踪某一个多个线程调用某个mutex_lock至mutex_unlock的事件,mutex_lock和mutex_unlock被使用的地方太多,需要加以改造加一层函数,改为追踪fake_lock与fake_unlock事件,来排除一下干扰信息

void fake_lock()
{mutex_lock();
}void fake_unlock()
{mutex_unlock();
}

另外uprobe event在追踪共享库中的符号的时候需要指定共享库的绝对路径,同时要保证执行程序的编译时候指定的共享库的路径没有多余的路径(遇到过ldd 结果是../libuptest.so的注册时候用绝对路径trace不到),要么是绝对路径要么没有路径,可以使用ldd uptestbin来检查 。共享库的名称也要注意不要libup_test.so,中间不要有"_"

ldd uptestbin linux-vdso.so.1 (0x00007ffed1dd9000)libuptest.so (0x00007f25f46a9000)

分析trace log

得到trace 到的log,假设fake_lock是0x1119,fake_unlock是0x1169,每次事件都有一个精确到us的时间戳,正符合需求统计耗时

thread-1624   [007] DNZff 21606.070168: p_libuptest_0x1119:
thread-1624   [007] DNZff 21606.080370: p_libuptest_0x1169:
thread-1624   [007] DNZff 21606.080654: p_libuptest_0x1119:
thread-1624   [007] DNZff 21606.090877: p_libuptest_0x1169:

 用awk处理trace.log最终得到奇数与偶数行的差值的平均值

awk -F'[ :]' '{ if(NR%2==0) {sum+=$6} else{sum-=$6};} END {print sum/(NR/2)}' ./trace.log

相关文章:

uprobe trace多线程mutex等待耗时

问题背景环境 ubuntu2204 服务器支持debugfs uprobe&#xff0c;为了提升应用程序的性能&#xff0c;需要量化不同参数下多线程主程序等待在mutex上的耗时区别 linux document中对uprobe events的说明如下 uprobetracer.rst - Documentation/trace/uprobetracer.rst - Linux…...

Linux 和 MacOS 中的 profile 文件详解(一)

什么是 profile 文件&#xff1f; profile 文件是 Linux、MacOS 等&#xff08;unix、类 unix 系统&#xff09;系统中的一种配置文件&#xff0c;主要用于设置系统和用户的环境变量。 在 shell 中&#xff0c;可以通过执行 profile 文件来设置用户的环境变量。shell 有两种运…...

不用技术代码,如何制作成绩查询系统?

为了解决学校无力承担传统学生考试成绩查询平台的高昂费用&#xff0c;老师们可以考虑使用易查分这样的工具来免费制作一个学生考试成绩查询平台。易查分是一种简单易用的在线成绩查询系统&#xff0c;可以帮助老师们快速创建一个个性化的学生考试成绩查询平台。 使用易查分制作…...

flinksql sink to sr often fail because of nullpoint

flinksql or DS sink to starrocks often fail because of nullpoint flink sql 和 flink ds sink starrocks 经常报NullpointException重新编译代码 并上传到flink 集群 验证&#xff0c;有效 flink sql 和 flink ds sink starrocks 经常报NullpointException 使用flink-sta…...

达梦数据库:Error updating database. Cause: dm.jdbc.driver.DMException: 数据未找到

异常&#xff1a;Error updating database. Cause: dm.jdbc.driver.DMException: 数据未找到 在使用达梦数据库批量插入或更新数据时&#xff0c;给我报了一个从来没有遇到过的错误&#xff0c;当时我给的一批数据就只有那么几条数据插入不进去&#xff0c;检查了语法和数据类…...

电脑怎么查看连接过的WIFI密码(测试环境win11,win10也能用)

电脑怎么查看连接过的WIFI密码 方法一&#xff1a;适用于正在连接的WIFI密码的查看 打开设置 点击“网络和Internet”&#xff0c;在下面找到“高级网络设置”点进去 在下面找到 “更多网络适配器选项” 点进去 找到 WLAN &#xff0c;然后双击它 5.然后点击“无线属性” 6.…...

处理数据部分必备代码

1、读取数据出现UTF-8错误 encoding"gbk"2、进行时间系列的平均&#xff0c;并将平均后的数据转化为时间格式 data.index pd.to_datetime(data.index) data data.groupby(data.index.to_period(H)).mean() data.index data.index.to_timestamp() df[hour] df.i…...

layui 集成 ztree异步加载

首先&#xff0c;layui环境搭建&#xff0c;ztree环境引入 ztree的js和css都要引入&#xff0c;我这里暂时用的是core包> 静态&#xff0c;一句话就够了 <!-- 左侧菜单树形组件 --><div class"layui-col-md3"><div class"layui-footer "…...

LeetCode面向运气之Javascript—第27题-移除元素-98.93%

LeetCode第27题-移除元素 题目要求 一个数组nums和一个值val&#xff0c;你需要原地移除所有数值等于val的元素&#xff0c;并返回移除后数组的新长度 举例 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 输入&#xff1a;nums [0,1,2,2,3,0,4,2…...

谷歌云 | 电子商务 | 如何更好地管理客户身份以支持最佳的用户体验

【本文由Cloud Ace整理发布。Cloud Ace是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训…...

行业追踪,2023-08-09

自动复盘 2023-08-09 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

视图、存储过程、函数、触发器

1.视图 视图就是一张基于查询的虚拟表&#xff0c;里面定义的其实就是普通的SQL语句。如果一条复杂查询的SQL语句我们频繁的使用&#xff0c;就可以定义视图&#xff0c;方便操作。创建语法如下&#xff1a; CREATE VIEW <视图名> AS <SELECT语句> 2.存储过程 存…...

数学建模学习(10):遗传算法

遗传算法简介 • 遗传算法&#xff08;Genetic Algorithms&#xff09;是基于生物进化理论的原理发展起来的一种广为 应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之 间的信息交换&#xff0c;搜索不依赖于梯度信息。它是20世纪70年代初期由美国…...

私域流量整合:社群裂变的综合策略

在私域营销的风潮下&#xff0c;社群裂变已经成为许多企业实现增长的利器。然而&#xff0c;如何通过综合策略将社群裂变的影响力最大化&#xff0c;将成为私域流量整合的重要一环。本文将从新的角度探讨社群裂变的影响力策略&#xff0c;以及如何通过整合私域流量开辟新的增长…...

Redis的RDB持久化

Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含着任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;为了方便起见&#xff0c;我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 举个例子&#xff0c;下图展示了一…...

三、MySql表的操作

文章目录 一、创建表&#xff08;一&#xff09;语法&#xff1a;&#xff08;二&#xff09;说明&#xff1a; 二、创建表案例&#xff08;一&#xff09;代码&#xff1a;&#xff08;二&#xff09;说明&#xff1a; 三、查看表结构&#xff08;一&#xff09;语法&#xff…...

【模型加速部署】—— Pytorch自动混合精度训练

自动混合精度 torch. amp为混合精度提供了方便的方法&#xff0c;其中一些操作使用torch.float32&#xff08;浮点&#xff09;数据类型&#xff0c;而其他操作使用精度较低的浮点数据类型&#xff08;lower_precision_fp&#xff09;&#xff1a;torch.float16(half)或torch.…...

【Qt】信号槽的三种连接方式

【Qt】信号槽的三种连接方式 文章目录 【Qt】信号槽的三种连接方式1. 使用 ui 界面控件2. Qt4 的连接语法3. Qt5 的连接语法 Qt 的信号槽最初来源于函数回调&#xff0c;但注册回调函数有一定局限&#xff0c;安全性也没有保证。所以一定程度上可以说信号槽是对回调机制进行了封…...

Jtti:Ubuntu静态IP地址怎么配置

在 Ubuntu 中配置静态 IP 地址需要编辑网络配置文件。以下是在 Ubuntu 20.04 版本中配置静态 IP 地址的步骤&#xff1a; 打开终端&#xff0c;以管理员身份登录或使用 sudo 权限。 使用以下命令打开网络配置文件进行编辑&#xff1a; sudo nano /etc/netplan/00-installer-…...

iconfont 使用

官网地址 iconfont-阿里巴巴矢量图标库 常规操作&#xff1a;注册账号 首页 搜索想要的图片 加入购物车并添加项目没有就创建一个 在线生成链接 复制生成的css 在前端软件创建相关的wxss文件 全局 import "/static/iconfont/iconfont.wxss";page {height: 100%; }…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...