| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【调试和性能优化实验】奔跑吧Linux内核 -> 正文阅读 |
|
[系统运维]【调试和性能优化实验】奔跑吧Linux内核 |
printk() 输出函数和动态输出1. 使用printk()输出函数prink() 函数和printf() 函数的一个重要区别就是前者提供了输出等级,内核根据输出等级判断是否在终端或者串口中输出结果。当输出等级高于
宏定义设置输出等级
内核启动参数制定输出等级
系统运行时修改输出等级
实际调试中,输出函数名和代码行号是一个很好的习惯。
内核还提供了一些在实际工程中会用到的有趣的输出函数:
2. 使用动态输出在系统运行时可以由系统维护者动态地打开和关闭指定的 printk() 输出,也可以有选择地打开某些模块的输出,而 printk() 是全局的,只能设置输出等级。要使用动态输出,必须在配置内核时打开 动态输出在 debugfs 文件系统中对应的是 control 文件节点。control 文件节点记录了系统中所有使用动态输出技术的文件名路径、输出语句所在的行号、模块名和将要输出的语句等。 内核代码里使用了大量的
查询control文件节点 获知系统有哪些动态输出语句
除了能够输出pr_debug()/dev_dbg()函数中定义的输出语句外,还能够输出一些额外的信息。例如函数名、行号、模块名和线程ID等。
对于内核启动过程中的系统调试输出 比如用于调试 SMP 初始化的代码,在 topology 模块中有一些动态输出语句。可以在内核启动的命令行中添加 “topology.dyndbg=+plft” 字符串即可。 还可以在各个子系统的Makefile中添加ccflags来打开动态输出的功能
proc 和 debugfsLinux 系统中的 proc 和 sys 两个目录提供了一些内核调试参数。 系统的整体信息可通过 procfs 来获取,设备模型相关信息可以通过 sysfs 来获取。 3. 使用 procfsproc 用于内核和内核模块用来向进程发送消息,可以让用户和内核内部的数据结构进行交互,比如获取进程的有用信息、系统的有用信息等,可以查看系统的信息,比如 /proc/meminfo 用来查看内存的管理信息、/proc/cpuinfo 用来观察 CPU 的信息。这些虚拟文件在查看时会返回大量信息,但是文件本身显示为 0 字节。ps、top 等 shell 命令就是从 proc 文件系统中读取信息的。 proc 文件系统并不是真正意义上的文件系统,虽然存在于内存中,却不占用磁盘空间。proc 文件系统包含有一些结构化的目录和虚拟文件,既可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。 具体该文件目录下的节点信息,可以参考这篇博文:https://www.cnblogs.com/lidabo/p/5628020.html 4. 使用 sysfsLinux2.5 在开发期间设计了一套统一的设备驱动模型,解决了 proc 目录中混乱的内容这个问题,这就是 sysfs。这套新的设备模型是为了对计算机上的所有设备统一地进行表示和操作,包括设备本身和设备之间的连接关系。这套模型建立在对PCI和USB的总线枚举过程的分析上,这两种总线类型能代表当前系统中的大多数设备类型。 很多子系统、设备驱动程序已经将 sysfs 作为与用户空间交互的接口。 5. 使用 debugfsdebugfs 是一种用来调试内核的内存文件系统,内核开发者可以通过 debugfs 和用户空间交换数据,有点类似前文的 procfs 和 sysfs。在进行内核调试时候,经常使用的最原始调试手段是添加输出语句,但是有时候我们需要在运行中修改某些内核的数据,这时候printk()就办不到了,一种可行的办法是修改内核代码并编译,然后重新运行,这种办法效率低下,同时有时候系统并不能重启。 为此,可以使用临时的文件系统把关心的数据映射到用户空间 —— debugfs。 debugfs 一般会挂载到 /sys/kernel/debug 目录,可以通过 mount 命令来实现。
ftraceftrace 最早出现在 Linux 2.6.27 版本中,不仅设计目标简单,而且给予静态代码插桩技术,不需要用户通过额外的编程就能定义 trace 行为。静态代码插桩技术比较可靠,不会因为用户的不当使用而导致内核奔溃。ftrace 这一名字由 function trace 而来,可利用 gcc 编译器的 profile 特性在所有函数入口处添加一段插桩代码,ftrace 则通过重载这段代码来实现 trace 功能。 在使用 ftrace 之前,需要确保内核编译了配置选项。
ftrace 的相关配置选项比较多,针对不同的跟踪器有各自对应的配置选项。ftrace 通过debugfs 文件系统向用户空间提供访问接口,因此需要在系统启动时挂载 debugfs。 /sys/kernel/debug/trace 目录里提供了各种跟踪器(tracer)和事件(event),一些常用的选项如下:
irqsoff 跟踪器 当中断关闭后,CPU 就不能响应其他事件,如果这时候有一个鼠标中断,那么在下一次开中断时才能响应这个鼠标中断,这段延迟称为中断延迟。向 current_tracer 文件写入 irqsoff 字符串即可打开 irqsoff 来跟踪中断延迟。
function 跟踪器 function 跟踪器会记录当前系统运行过程中的所有函数,如果只想跟踪某个进程,可以使用 set_ftrace_pid。
动态 trace 在配置内核时打开 CONFIG_DYNAMIC_FTRACE 选项,就可以支持动态 ftrace 功能。set_ftrace_filter 和 set_ftrace_notrace 这两个文件可以配对使用。前者设置要跟踪的函数,后者指定不要跟踪的函数。 可以支持通配符,如果要跟踪所有 hrtimer 开头的函数,可以使用 事件跟踪
事件跟踪还支持设定跟踪条件,每个跟踪点都定义了 format,又定义了跟踪点支持的域。 6. 使用 ftrace7. 添加新的跟踪点8. 使用示踪标志9. 使用 kernelshark 分析数据使用 trace-cmd 和 kernelshark 工具抓取和分析 ftrace 数据。
trace-cmd 的使用方式遵循 reset->record->stop->report 模式。使用 record 命令搜集数据,Ctrl+C 组合键停止收集动作,在当前目录下生成 trace.dat 文件,然后使用 trace-cmd report 解析 trace.dat 文件。 kernelshark 是图形化的,更方便开发者观察和分析数据。 分析 Oops 错误在编写驱动或内核模块时,常常会显式或隐式地对指针进行非法进行非法取值或使用不正确的指针,导致内核发生Oops错误,Oops表示内核发生了致命错误,当内核检测到致命错误时,就会把当前寄存器的值、函数栈的内容、函数调用关系等信息输出出来,以便开发人员定位问题。 10. 分析 Oops 错误perf 性能分析工具在进行性能优化时通常有两个阶段,一个是性能剖析,另一个是性能优化。性能剖析的目标就是寻找性能瓶颈,通常借助 perf 等工具来实现。
11. 使用 perf 工具进行性能分析12. 采集 perf 数据以生成火焰图内存检测一般的内存访问错误如下:
13. 使用 slub_debug 检查内存泄露小块内存的分配会大量使用 slab/slub 分配器。它提供了一个用于内存检测的小功能,可方便在产品开发阶段进行内存检查。内存访问中比较容易出现错误的地方:
14. 使用 kmemleak 检查内存泄露kmemleak 是内核提供的一种内存泄漏检测工具,它会启动一个内核线程来扫描内存,并输出新发现的未引用对象的数量。kmemleak 有误报的可能性,需要在配置内核时打开选项。 15. 使用 kasan 检查内存泄露kasan 在 linux4.0 中被合并到官方 Linux,是一款用于动态监测内存错误的工具,可以检查内存越界访问和使用已经释放的内存。 16. 使用 valgrind 检查内存泄露valgrind 是 Linux 提供的上一套基于仿真技术的程序调试和分析工具,可以用来检测内存泄漏和内存越界,valgrind 内置了很多功能。
使用 kdump 解决死机问题kdump 内核转储工具,kdump 的核心实现基于 kexec,kernel execution,类似于 Linux 内核中的 exec 系统调用。kexec 可以快速启动新的内核,并且跳过 BIOS 或者 bootloader 等引导程序的初始化阶段。这个特性可以让系统上奔溃时快速切换到备份的内核,这样第一个内核的内存就得到了保留。在第二个内核中,可以对第一个内核产生的奔溃数据进行继续分析。第一个内核通常称为生产内核,是产品或线上服务器主要运行的内核,第二个内核成为捕获内核,当生产内核奔溃时就会快速切换到捕获内核进行信息的收集和转储。 crash 工具是由红帽工程师开发的,可以和 kdump 配套使用来分析内核转储文件。kdump 的工作流程并不复杂,kdump 会在内存中保留一块区域,这块区域用来存放捕获内核。当生产内核在运行过程中遇到奔溃等情况时,kdump 会通过 kexec 机制自动启动到捕获内核,这时会绕过 BIOS,以免破坏第一个内核的内存,然后把生产内核的完整信息转储到指定文件中,然后使用 crash 工具分析这个转储文件,就可以快速定位宕机问题了。
17. 搭建 ARM64 的 kdump 实验环境18. 分析一个简单的宕机案例性能和测试常见的 Linux 性能测试工具
19. 运行 BCC 工具进行性能测试BCC 是一个 Python 库,它对 eBPF 应用层接口进行了封装,并且拥有自动完成编译、解析 ELF、加载 BPF 代码块以及创建 map 等基本功能。
BCC 工具安装在 /usr/sbin 目录下,它们都是以 bpfcc 结尾的可执行的 python 脚本。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 17:21:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |