内核性能调试–ftrace

2024-02-17 08:08
文章标签 性能 调试 内核 ftrace

本文主要是介绍内核性能调试–ftrace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.chinaunix.net/uid-20589411-id-3501525.html

“调试难度本来就是写代码的两倍.因此,如果你写代码的时候聪明用尽,根据定义,你就没有能耐去调试它了.” – Brian Kernighan


某手机公司的研发总监谈到内核调试时问我怎么android手机上解决有时整机响应慢甚至无响应的情况。 我说可以首先使能内核的调试选项检查是否存在内核死锁,再通过内核的kprobe/ftrace检查中断和系统调用情况,blabla… 没想到该总说“我们公司几百号人都没有用trace,你能用得起来?”。难怪即使几百号人做手机,每个人还得被强制加班?


据说,linus等大神级内核开发者不用调试器,顶多用printk打印信息。 对于寻常百姓来说, 每改一行代码都希望能马上看到效果,一次次的编译内核,就像盲人摸象一样,这时printk就像烧火棍一样, 难堪重用,调试效率效率非常的低。ftrace是内核内置的跟踪器,可用于跟踪内核函数调用,中断延迟,调度延迟, 系统调用等,在debugfs下使用文本命令交互,很合适内核开发者使用。


使用 ftrace
首先使用CONFIG_DEBUG_FS,CONFIG_FTRACE_*选项后重新编译内核。需要注意的是, 由于这时编译器打开-pg选项,内核映像加入了大量的调试信息,内核运行速度会变慢。 所以正式发布的版本都应该关闭此选项。


# mount -t debugfs nodev /sys/kernel/debug
# cd /sys/kernel/debug/trace
该目录下包含很多文件,用于设定/过滤/查看等,如:


内核中断
查看当前系统的中断情况


# echo 0 > tracing_on
# echo > trace
# echo nop > current_tracer
# echo irq > set_event
# echo 1 > tracing_on
# cat trace_pipe
 tracer: nop
 entries-in-buffer/entries-written: 0/0   #P:1


                              _-----=> irqs-off
                             / _----=> need-resched
                            | / _---=> hardirq/softirq
                            || / _--=> preempt-depth
                            ||| /     delay
           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
              | |       |   ||||       |         |
cat-1449  [000] d.h.  3927.679420: irq_handler_entry: irq=4 name=serial
...
内核调用
查看内核函数的调用情况


# echo > set_event
# echo 0 > tracing_on
# echo > trace
# echo function_graph > current_tracer
# echo 1 > tracing_on
# cat trace_pipe


tracer: function_graph


CPU  DURATION                  FUNCTION CALLS
 |     |   |                     |   |   |   |
0) + 26.523 us   |                      }
0)               |            finish_task_switch() {
0)   ==========> |
0)               |              smp_apic_timer_interrupt() {
0)               |                irq_enter() {
0)   0.911 us    |                  rcu_irq_enter();
0)   6.503 us    |                }
0)               |                hrtimer_interrupt() {
0)   0.585 us    |                  _raw_spin_lock();
0)   1.124 us    |                  ktime_get_update_offsets();
CPU:0 [LOST 163499 EVENTS]
------------------------------------------
0)  kworker-691   =>    cat-1464   
------------------------------------------


0)               |                              serial8250_default_handle_irq() {
0)   0.954 us    |                                io_serial_in();
...
内核函数的profile
打印当前内核的函数profile


# echo > current_tracer
# echo 1 > function_profile_enabled
# cat trace_stat/function0 
Function                               Hit    Time            Avg             s^2
--------                               ---    ----            ---             ---
__schedule                            7113    968683296 us     136184.9 us     2108946573 us 
schedule                              1687    954817829 us     565985.6 us     1349415472 us 
sys_poll                                25    63786678 us     2551467 us     582022796 us 
do_sys_poll                             25    63786547 us     2551461 us     566803126 us 
poll_schedule_timeout                   25    63771744 us     2550869 us     1312623772 us 
schedule_hrtimeout_range                25    63771626 us     2550865 us     1305229109 us 
schedule_hrtimeout_range_clock          25    63771510 us     2550860 us     1293434582 us 
schedule_timeout                        29    34992964 us     1206653 us     1503283302 us 
...
上面仅列出ftrace的三种应用场景,其它更多的说明可见Documentation/trace/ftrace.txt。 通过ftrace可以实时的跟踪内核的运行情况,通过分析它的日志,一般能较快的找出内核的性能瓶颈。


这篇关于内核性能调试–ftrace的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717180

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置