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

相关文章

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找到登录请求资源路径位置

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动