调试 Linux 内核
外观
< Linux 内核
许多因素会影响 Linux 内核的性能,包括硬件配置、软件配置和工作负载特征。
在这种情况下,Linux 内核的性能优化涉及识别和解决系统中的性能瓶颈。这可能包括调整内核参数、优化系统资源以及识别和修复可能影响性能的错误和其他问题。
鉴于 Linux 内核的复杂性以及影响性能的各种因素,性能优化可能是一项艰巨的任务。但是,借助合适的工具和技术,可以显著提高基于 Linux 的系统的性能和可靠性。
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/
📚进一步阅读
🛠️实用程序
- Performance Co-Pilot,https://pcp.io/ – Performance Co-Pilot
- Prometheus,https://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
⚙️内部机制
📚 参考资料
- 内核开发工具 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
- 使用其他级别的日志消息
- asm-generic/bug.hinc
⚙️内部机制
- 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 – 函数、延迟和事件跟踪
- 使用 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]⚲接口
⚙️内部机制
📚 参考资料
- 使用 kgdb、kdb 和内核调试器内部 doc
- kdump
- kdump doc
- man 8 crash – 分析 Linux 崩溃转储数据或活动系统
eBPF
[edit | edit source]⚲ API
📖参考
📚进一步阅读
- man 7 bpf-helpers
- Linux 扩展 BPF (eBPF) 跟踪工具
- bpftrace – 用于 Linux eBPF 的高级跟踪语言
- BCC – 用于基于 BPF 的 Linux IO 分析、网络、监控等的工具
- man 8 stapbpf
- 用于 Linux 内核跟踪的 eBPF 编程
- lockdep - 运行时锁定正确性验证器 doc
看门狗
[edit | edit source]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
👁️ 示例
- ./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
📚 参考资料
⚙️内部机制
📖 调试参考资料
- Ramoops oops/panic 日志记录器 doc
- pstore 块 oops/panic 日志记录器 doc
- 故障注入 doc
- 二分查找 bug doc
- 内核开发工具 doc
- linux/tracepoint.hinc
📚进一步阅读