7 Linux内核调试与性能优化

计算机系统性能优化理论 #

描述了实际项目中性能优化的五个方面

Profile——针对优化目标进行性能测试摸底

  • 不同应用场景不同的采样工具(perf、VTurn)

Analyze——分析性能的瓶颈和焦点

Root——刨根问底,找出问题的根本原因

Optimize——设法突破瓶颈和优化性能

Test——测试验证性能优化成效

上述过程是一个迭代循环过程

printk——简单强大调试工具 #

内核提供的格式化显示输出函数 [环形缓冲机制]

输出级别——在终端或串口输出的判断依据

  • 输出级别不低于控制台输出级别的消息将会在控制台显示输出

系统运行时输出级别的查看与修改

  • cat /proc/sys/kernel/printk
    • 15 4 1 7
    • 分别对应控制台输出级别、消息默认输出级别、控制台输出级别最小取值和控制台默认输出级别
    • #echo 7 > /proc/sys/kernel/printk
    • $ cat /proc/sys/kernel/printk
    • 7 4 1 7
  • 函数名及代码行号的显示输出
    • printk("FunctionName[%s] LineNo[%d]\n", __func__, __LINE__);

debugfs 文件系统及动态输出 #

动态输出(Dynamic printk)

  • 由系统维护者动态选择打开内核输出
    • 动态输出对应于内核代码中有关函数 pr_debug() 和 dev_debug() 的输出信息
    • 可指定内核子系统或内核模块
    • 要求在内核编译配置时打开宏 CONFIG_DYNAMIC_DEBUG
    • 需要系统挂载 debugfs 文件系统,并在其 control 节点加以查看,具体记录了系统中所有使用动态输入输出技术的文件名路径、输出所在行号、模块名字以及要打印的信息描述
    • cat/more + grep 查看方式

proc 文件系统(系统及进程信息) #

内核和内核模块向用户空间发送消息的机制

  • 方便用户或用户进程访问内核数据结构以获取进程或系统的有关信息

本质上并非真正意义的文件系统,存在于内存,而不占用磁盘空间

典型应用场景

  • 通过/proc/meminfo 查看内存管理信息
  • 通过/proc/cpuinfo 查看处理器信息
  • 查看进程信息
  • ps、top 等 Shell 命令

sys 文件系统及新型设备驱动模型 #

引入缘由

  • 包括设备驱动等在内的内核模块造成了/proc 文件系统目录的杂乱无章
  • Linux2.5 起建立了统一的设备驱动模型,也由此诞生了 sys 这一新的内存型虚拟文件系统

新型设备驱动模型

  • 对计算机系统中的所有设备进行统一的表示和操作,包括设备本身及设备之间的连接关系
  • 建立在 PCI 和 USB 的总线枚举过程分析基础之上
  • CPU⬄PCI 总线设备⬄PCI 设备(USB 总线设备)⬄外部 USB 设备(譬如 USB 鼠标/键盘)关电与加电次序

OOPS 错误分析及示例 #

OOPS(Out-of-Process Space)

  • 内核空间中,指针非法取值或访问

OOPS 内核模块示例(Makefile、OOPS_LKM.c)

实验过程及工具

  • 编译生成内核模块 OOPS_LKM.ko
  • 加载内核模块 OOPS_LKM.ko
  • 执行 dmesg 命令检查内核空间输出信息
  • 利用反汇编工具 objdump 检查汇编代码
  • decodecode 脚本程序(/usr/src/linux-headers-4.4.0-21/scripts/decodecode)
  • 利用内核调试工具 gdb

内存检测工具及应用 #

slub-debug

  • slab/slub 分配器提供的内存错误访问检测功能

kmemleak

  • 用于检测内核内存泄露(只申请不释放)情况

kasan(kernel address sanitizer)

  • 用于检测内核内存越界/已释放访问等错误情况

valgrind

  • 用于检测应用程序的内存泄漏及越界访问情况

kdump

  • 用于系统崩溃时的内核空间内存内容的转移存储

基于 slub-debug 的内存检测

  • 内核编译配置
    • 利用 slub_debug 选项打开 slub-debug 检测功能
  • slabinfo 工具
    • 在 linux-4.8.8/tools/vm 目录下 make 编译生成
  • 内存错误访问型 Linux 内核模块
    • Makefile、源程序 SlubDebugLKM.c
  • 实验过程(QEMU 虚拟机上)
    • 加载 SlubDebugLKM.ko 后,执行 slabinfo 命令
    • 卸载 SlubDebugLKM.ko 后,执行 dmesg 命令

性能/功耗指标及 Linux 性能测试工具 #

PnP(Performance And Power)

性能与功耗是一对矛盾体

KPI(Key Performance Indicator)

性能指标

  • 包括处理器指标、GPU 指标、I/O 指标、网络指标等

功耗指标

  • 包括待机功耗、待机电流、播放 MP3 时长、观看视频时长等
  • 功耗测试会牵涉到诸多硬件设备

Linux 性能测试工具

  • kernel-selftests【linux-4.8.8/tools/testing/selftests】
  • perf-bench【linux-4.8.8/tools/perf/bench】
  • iperf【网络性能测试程序】
  • pmbench【内存性能测试程序】
  • sysbench【综合测试套件:CPU、内存、多线程】
  • DBENCH【I/O 性能测试程序】
  • GFXbenchmark/glbenchmark【GPU 性能测试程序】
  • iozone【文件系统性能测试程序】
  • vm-scalability【Linux 内核内存管理模块可扩展性测试程序】