0

0

系统调用追踪_使用perf与ftrace分析程序性能

P粉602998670

P粉602998670

发布时间:2026-02-06 15:00:02

|

589人浏览过

|

来源于php中文网

原创

ftrace与perf是Linux内核级系统调用追踪的两大核心工具:ftrace适用于轻量级函数级静态/动态追踪,perf侧重事件采样与高精度分析。

系统调用追踪_使用perf与ftrace分析程序性能

如果您需要深入理解程序在内核层面的行为,例如系统调用的触发频率、耗时分布或调用路径,则必须借助内核内置的追踪机制。perf 与 ftrace 是 Linux 系统中两种互补且高效的底层性能分析工具,分别适用于事件采样与函数级静态/动态追踪。以下是使用这两种工具进行系统调用追踪的具体操作步骤:

一、使用ftrace追踪系统调用入口

ftrace 通过挂载 debugfs 并配置 tracing_options 来启用 syscall_enter 事件,可精确捕获每个系统调用的发起时刻及参数。该方法不依赖用户态符号,适合轻量级、低开销的长期监控。

1、执行 mount -t debugfs nodev /sys/kernel/debug 挂载 debugfs 文件系统。

2、执行 echo function_graph > /sys/kernel/debug/tracing/current_tracer 切换至函数调用图模式。

3、执行 echo sys_enter_* > /sys/kernel/debug/tracing/set_ftrace_filter 过滤所有系统调用进入点。

4、执行 echo 1 > /sys/kernel/debug/tracing/tracing_on 启动追踪。

5、运行目标程序,例如 ./test_program

6、执行 echo 0 > /sys/kernel/debug/tracing/tracing_on 停止追踪。

7、执行 cat /sys/kernel/debug/tracing/trace_pipe 实时读取追踪输出。

二、使用perf record捕获系统调用事件

perf record 可基于内核 perf_event 子系统对 sys_enter 和 sys_exit 事件进行采样,支持按 PID 或 CPU 范围过滤,并生成可离线分析的二进制数据文件。该方式适合高精度计数与火焰图生成。

1、执行 perf list | grep syscall 确认系统支持的系统调用事件名,如 syscalls:sys_enter_read

2、执行 perf record -e 'syscalls:sys_enter_*' -p $(pidof test_program) -g 对指定进程的所有系统调用入口事件进行带调用图记录。

3、等待程序运行结束后,自动保存至 perf.data 文件。

4、执行 perf script 解析原始事件流,显示每条系统调用的 PID、时间戳、参数值及用户态调用

5、执行 perf report --sort comm,symbol --no-children 汇总各命令触发的系统调用次数分布。

三、启用ftrace的syscall插件并导出结构化日志

ftrace 提供 syscall 插件(需内核配置 CONFIG_FTRACE_SYSCALLS=y),可将系统调用事件格式化为字段对齐的日志行,便于后续用 awk 或 Python 解析。该方式避免了 trace_pipe 的实时性限制,适合批量处理。

1、确认内核支持:执行 ls /sys/kernel/debug/tracing/events/syscalls/ 应列出 sys_enter_* 和 sys_exit_* 子目录。

冰舟分类信息系统
冰舟分类信息系统

冰舟分类信息系统说明:本次更新修改了部分错误,增加了自定义标签管理,这个版本后所有页面均可调用一个标签,大大的提升了效率使用前请先 运行 install.asp 文件进行安装程序!!安装时请填写好 ACCESS文件目录以及ACCESS文件名,请确保填写的信息与FTP上的完全吻合,否则会出错!!安装玩后请,务必删除 install.asp 文件! 本2.1版本含有强大的模板编辑功能,且初始模板均为D

下载

2、执行 echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_openat/enable 单独启用 openat 调用追踪。

3、执行 echo 1 > /sys/kernel/debug/tracing/options/latency-format 开启延迟格式以包含时间戳。

4、执行 echo 1 > /sys/kernel/debug/tracing/options/event-fork 启用子进程事件继承。

5、运行目标程序后,执行 cat /sys/kernel/debug/tracing/trace 获取结构化输出,每行含时间、CPU、PID、系统调用名、参数十六进制值。

四、结合perf probe动态添加系统调用参数解析

默认 perf 仅显示系统调用号与原始寄存器值,无法识别语义化参数。perf probe 可基于内核头文件或 vmlinux 符号,在 sys_enter_* 探针处注入参数解析逻辑,将 raw_syscall_args 映射为 filename、flags 等可读字段。

1、执行 perf probe -l 查看当前已定义探针,确认无冲突。

2、执行 perf probe 'sys_enter_openat filename:string flags:u32 mode:u32' 根据系统调用 ABI 定义参数类型与名称。

3、执行 perf record -e probe:sys_enter_openat -p $(pidof test_program) 记录增强型事件。

4、执行 perf script -F comm,pid,tid,event,trace 输出含解析后参数的完整调用记录。

5、若提示找不到 vmlinux,需先执行 perf buildid-cache -v /usr/lib/debug/lib/modules/$(uname -r)/vmlinux 注入调试符号。

五、禁用ftrace动态过滤器并重置状态

多次实验后,ftrace 的 filter 设置可能残留影响后续追踪。必须显式清空所有过滤规则并关闭 tracer,否则新会话仍将沿用旧配置,导致事件丢失或误匹配。

1、执行 echo > /sys/kernel/debug/tracing/set_ftrace_filter 清空函数过滤器。

2、执行 echo > /sys/kernel/debug/tracing/set_event 清空事件过滤器。

3、执行 echo nop > /sys/kernel/debug/tracing/current_tracer 切回空 tracer。

4、执行 echo 0 > /sys/kernel/debug/tracing/tracing_on 确保追踪已停止。

5、执行 echo > /sys/kernel/debug/tracing/trace 清空 trace 缓冲区内容。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

606

2023.08.02

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

397

2023.09.04

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

864

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

439

2024.06.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

403

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

582

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1478

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

710

2023.06.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号