perf分析内核性能热点需启用DWARF调用图并确保内核符号可用:执行sudo perf record -a -g --call-graph dwarf,8192 -F 99采集,检查/proc/kallsyms可读性并安装对应dbgsym包,再用perf script提取内核栈统计热点函数。

要分析 Linux 系统的内核性能热点,perf 不仅能看用户态函数,还能深入到内核调用链——但默认配置下往往只显示 [unknown] 或地址,关键在于启用正确的调用图解析模式并确保内核符号可用。
启用 DWARF 模式采集完整内核栈
现代内核(5.10+)普遍关闭 CONFIG_FRAME_POINTER,x86_64 和 ARM64 默认无法用 frame pointer 还原内核调用栈。必须显式指定 --call-graph dwarf:
- 全系统采样(含内核路径):
sudo perf record -a -g --call-graph dwarf,8192 -F 99 - 仅目标进程(如 PID 1234):
sudo perf record -p 1234 -g --call-graph dwarf,4096 -
dwarf,4096表示使用 DWARF 解析、最大栈深度 4KB,防止溢出;频率-F 99平衡精度与开销
确保内核符号可读可解析
即使采集正确,perf report 仍可能显示十六进制地址,需两步验证:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 检查
/proc/kallsyms是否可读:cat /proc/kallsyms | head -n 3;若报Permission denied,执行:echo 0 | sudo tee /proc/sys/kernel/kptr_restrict - 安装对应内核的调试符号包:
Ubuntu/Debian:sudo apt install linux-image-$(uname -r)-dbgsym
CentOS/RHEL:debuginfo-install kernel-$(uname -r) - 验证效果:
perf report --symbols | grep ext4应输出函数名(如ext4_writepages),而非地址
从原始数据中分离和聚焦内核热点
perf report 默认混合用户态与内核态,易掩盖真实瓶颈。用 perf script 提取纯内核路径更精准:
- 提取全部内核栈并统计频次:
perf script | awk -F';' '$1 ~ /^\[kernel\]/ {print $0}' | sort | uniq -c | sort -nr | head -10 - 聚焦 I/O 相关内核函数:
perf script | grep -E "(ext4|bio|blk|scsi|nvme)" | head -20 - 统计某函数调用次数(如排查写放大):
perf script | cut -d';' -f1-3 | grep "blk_mq_dispatch_rq_list" | wc -l
识别典型内核热点场景
不同负载下常见内核热点函数有规律可循:
- CPU 密集型:重点关注
__schedule、cpuhp_invoke_callback、native_flush_tlb_one_user - I/O 高延迟:常卡在
blk_mq_dispatch_rq_list、scsi_queue_rq、__wake_up_common_lock - 文件系统慢:
ext4_file_read_iter、ext4_writepages、__do_page_cache_readahead - 锁竞争:
__mutex_lock、rwsem_down_read_slowpath、spin_unlock_irqrestore


















