跳转到内容

调试 Linux 内核

来自维基教科书,开放的书籍,开放的世界


许多因素会影响 Linux 内核的性能,包括硬件配置、软件配置和工作负载特征。

在这种情况下,Linux 内核的性能优化涉及识别和解决系统中的性能瓶颈。这可能包括调整内核参数、优化系统资源以及识别和修复可能影响性能的错误和其他问题。

鉴于 Linux 内核的复杂性以及影响性能的各种因素,性能优化可能是一项艰巨的任务。但是,借助合适的工具和技术,可以显著提高基于 Linux 的系统的性能和可靠性。

Perf_events

[编辑 | 编辑源代码]

Perf_events(简称为性能事件)是一个强大的接口,可以提供有关系统上运行的软件性能特征的详细信息。通过分析 perf_events 收集的数据,开发人员可以识别性能瓶颈并优化软件以提高性能并减少资源利用率。Perf_events 被设计为一种轻量级的、低开销的监控解决方案,对系统性能的影响最小。


🔧待办


⚲接口

man 1 perf – 性能分析工具
基本命令
man 1 perf-help – 显示关于 perf 的帮助信息
man 1 perf-top – 系统分析工具。
man 1 perf-record – 运行命令并将它的分析记录到 perf.data
man 1 perf-report – 读取 perf.data(由 perf record 创建)并显示分析
其他命令
man 1 perf-annotate – 读取 perf.data(由 perf record 创建)并显示注释过的代码
man 1 perf-archive – 使用在...中找到的构建 ID 创建包含目标文件的存档
man 1 perf-arm-spe – 支持 perf 工具中的 Arm 统计分析扩展
man 1 perf-bench – 针对基准套件的通用框架
man 1 perf-buildid-cache – 管理构建 ID 缓存。
man 1 perf-buildid-list – 列出 perf.data 文件中的构建 ID
man 1 perf-c2c – 共享数据 C2C/HITM 分析器。
man 1 perf-config – 获取和设置配置文件中的变量。
man 1 perf-daemon – 在后台运行记录会话
man 1 perf-data – 数据文件相关处理
man 1 perf-diff – 读取 perf.data 文件并显示差异分析
man 1 perf-dlfilter – 使用动态加载的共享...过滤样本事件
man 1 perf-evlist – 列出 perf.data 文件中的事件名称
man 1 perf-ftrace – 内核 ftrace 功能的简单包装器
man 1 perf-inject – 过滤器,用于在...中添加额外的事件
man 1 perf-intel-pt – 支持 perf 工具中的 Intel 处理器跟踪
man 1 perf-iostat – 显示 I/O 性能指标
man 1 perf-kallsyms – 在运行的内核中搜索符号
man 1 perf-kmem – 用于跟踪/测量内核内存属性的工具
man 1 perf-kvm – 用于跟踪/测量 KVM 客机操作系统的工具
man 1 perf-kwork – 用于跟踪/测量内核工作属性(延迟)的工具
man 1 perf-list – 列出所有符号事件类型
man 1 perf-lock – 分析锁事件
man 1 perf-mem – 分析内存访问
man 1 perf-probe – 定义新的动态跟踪点
man 1 perf-sched – 用于跟踪/测量调度程序属性(延迟)的工具
man 1 perf-script – 读取 perf.data(由 perf record 创建)并显示...
man 1 perf-script-perl – 使用 Perl 脚本处理跟踪数据
man 1 perf-script-python – 使用 Python 脚本处理跟踪数据
man 1 perf-stat – 运行命令并收集性能计数器统计信息
man 1 perf-test – 运行健全性测试。
man 1 perf-timechart – 用于可视化工作负载期间系统整体行为的工具
man 1 perf-trace – 类似 strace 的工具
man 1 perf-version – 显示 perf 二进制文件的版本


⚙️内部机制

man 2 perf_event_open – 设置性能监控
uapi/linux/perf_event.hinc
tools/perfsrc
linux/perf_event.hinc
kernel/events/core.csrc
kernel/profile.c src – 简单分析


📖参考

perf – 用于检测 CPU 性能计数器、跟踪点、kprobes 和 uprobes
https://perf.wiki.kernel.org/


📚进一步阅读

perf 示例
Linux Perf Events 非官方网页


🛠️实用程序

Performance Co-Pilothttps://pcp.io/ – Performance Co-Pilot
Prometheushttps://prometheus.ac.cn/
https://github.com/redhat-nfvpe/container-perf-tools
https://github.com/brendangregg/perf-tools – 基于 Linux perf_events(又称 perf)和 ftrace 的性能分析工具
readprofile – 用于读取内核分析信息的工具


📚进一步阅读

stress-ng – 用于测试各种内核接口
http://trac.gateworks.com/wiki/linux/profiling
分析 RHEL 9 中的应用程序性能
监控和管理 RHEL 9 中的系统状态和性能
实时 Linux

用户空间调试接口

[编辑 | 编辑源代码]

⚲接口

man 1 dmesg – 打印或控制内核环形缓冲区
man 2 syslog – 系统调用,用于控制内核 printk() 缓冲区
man 1 strace – 系统调用和信号跟踪工具
man 2 ptrace – 进程跟踪系统调用
man 3 klogctl
man 5 core
/sys/kernel/debug/ – debugfs
dmesg --console-level <level>
gdb /usr/src/linux/vmlinux /proc/kcore
/proc/self/stack
动态 doc 调试
⌨️动手
echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control


⚙️内部机制

handle_sysrqid


📚 参考资料

内核开发工具 doc
DebugFS doc, samples/qmi/qmi_sample_client.c src
基于 Kprobe 的事件跟踪 doc
动态调试 doc
Linux Magic System Request Key Hacks doc
Magic SysRq 键

跟踪和日志记录

[edit | edit source]

⚲ API

用户空间接口

man 1 dmesg – 打印或控制内核环形缓冲区
man 2 syslog – 系统调用,用于控制内核 printk() 缓冲区
/proc/kmsg
man 1 trace-cmd – 与 Ftrace Linux 内核内部跟踪器 /sys/kernel/debug/tracing/ 交互

最常用的函数

linux/printk.hinc
pr_devel id- 条件调试级别消息
pr_debug id- 条件调试级别或 动态 doc 消息
⌨️动手
echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control
使用其他级别的日志消息
pr_info id, pr_notice id, pr_warn id, pr_err id, pr_crit id, pr_alert id, pr_emerg id
asm-generic/bug.hinc
WARN_ONid
WARNid


⚙️内部机制

printkid
kernel/printk/printk.csrc
arch/x86/kernel/traps.csrc
lib/dump_stack.csrc
kernel/tracesrc
scripts/tracing/draw_functrace.pysrc
logging ltp, tracing ltp
samples/ftracesrc
samples/trace_eventssrc
samples/trace_printksrc
linux/instrumentation.hinc


📚 参考资料

通过打印进行调试
使用 printk 进行消息记录 doc
SystemTap
man 1 stap – systemtap 脚本翻译器/驱动程序
strace
man 1 strace – 跟踪系统调用和信号
LTTng
ftrace
Linux 跟踪技术 doc
跟踪点分析 doc
函数跟踪器 doc – 函数、延迟和事件跟踪
事件跟踪 doc
使用 ftrace 挂钩函数 doc
Fprobe - 函数入口/出口探测 doc
Kprobes doc
基于 Kprobe 的事件跟踪 doc
Uprobe-tracer: 基于 Uprobe 的事件跟踪 doc
使用 Linux 内核跟踪点 doc
子系统跟踪点: kmem doc
子系统跟踪点: power doc
NMI 跟踪事件 doc
内核内内存映射 I/O 跟踪 doc
事件直方图 doc
直方图设计说明 doc
启动时跟踪 doc
硬件延迟检测器 doc
Intel(R) 跟踪中心 (TH) doc
无锁环形缓冲区设计 doc
系统跟踪模块 doc
CoreSight - ARM 硬件跟踪 doc

🔧 TODO. 🚀 高级功能

linux/kmemleak.h inc – 内存泄漏检测器
pr_cont id- 在同一行继续之前的日志消息
print_hex_dump_bytesid
print_hex_dump_debugid
dump_stackid
CONFIG_PRINTK_CALLERid
CONFIG_DEBUG_KERNELid
CONFIG_DEBUG_INFOid
https://git.kernel.org/pub/scm/libs/libtrace/

kgdb 和 kdb

[edit | edit source]

⚲接口

linux/kgdb.hinc
linux/kdb.hinc


⚙️内部机制

kernel/debugsrc


📚 参考资料

使用 kgdb、kdb 和内核调试器内部 doc
kdump
kdump doc
man 8 crash – 分析 Linux 崩溃转储数据或活动系统


⚲ API

man 2 bpfkernel/bpf/syscall.c src


📖参考

eBPF 和 BPF doc


📚进一步阅读

man 7 bpf-helpers
Linux 扩展 BPF (eBPF) 跟踪工具
bpftrace – 用于 Linux eBPF 的高级跟踪语言
BCC – 用于基于 BPF 的 Linux IO 分析、网络、监控等的工具
示例 of trace.py
man 8 stapbpf
用于 Linux 内核跟踪的 eBPF 编程
lockdep - 运行时锁定正确性验证器 doc


看门狗

[edit | edit source]

Linux 内核/Softdog 驱动程序

dev_watchdog id – 网络设备看门狗

NMI 看门狗死锁检测器

⚲ API

/proc/sys/kernel/nmi_watchdog
/proc/sys/kernel/soft_watchdog
/proc/sys/kernel/watchdog
/proc/sys/kernel/watchdog_cpumask
/proc/sys/kernel/watchdog_thresh
/proc/sys/kernel/hardlockup_all_cpu_backtrace
/proc/sys/kernel/hardlockup_panic
/proc/sys/kernel/softlockup_all_cpu_backtrace
/proc/sys/kernel/softlockup_panic
linux/nmi.hinc


👁️ 示例

./lib/test_lockup.c src – 用于生成死锁的测试模块

在不出现 panic 的情况下引发 NMI 看门狗

echo 0 > /proc/sys/kernel/hardlockup_panic
insmod test_lockup.ko disable_irq=1 time_secs=13

⚙️内部机制

kernel/watchdog.c src – 检测系统上的硬死锁和软死锁
kernel/watchdog_perf.c src – 使用 perf 检测系统上的硬死锁
kernel/watchdog_buddy.csrc

📚 参考资料

/proc/sys/kernel/ 的文档 doc
软锁死检测器和硬锁死检测器(也称为 nmi_watchdog) doc
内核参数
nmi_watchdog param
nowatchdog param
nosoftlockup param
softlockup_panic param

⚙️内部机制

arch/x86/kernel/traps.csrc


📖 调试参考资料

Ramoops oops/panic 日志记录器 doc
pstore 块 oops/panic 日志记录器 doc
故障注入 doc
二分查找 bug doc
内核开发工具 doc
linux/tracepoint.hinc


📚进一步阅读

https://drgn.readthedocs.io/ – 可编程调试器
https://crash-utility.github.io/
https://wiki.ubuntu.com/Kernel/Debugging
Linux 应用调试技术
华夏公益教科书