内核性能调试–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

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C