一、排查思路
先定位问题点
最高效方法:gdb单步调试,执行某行代码,导致写I/O陡增
gdb调试是最简单、高效的排查问题方法:比如不熟悉的模块
分析问题原因
解决问题
二、Linux常用命令
方法适用场景示例命令lsof查看哪些进程加载了某个 .solsof /usr/lib/libc.so.6pmap查看某个进程加载的所有 .sopmap -x | grep '.so'/proc//maps查看进程的 .so 内存映射cat /proc//maps | grep '.so'ldd查看程序的静态依赖库ldd /usr/bin/bashstrace跟踪进程加载 .so 的过程strace -e openat,mmap -p
推荐:
快速查找某个 .so 被哪些进程加载 → lsof /path/to/lib.so
查看某个进程加载的所有 .so → pmap -x | grep '.so'
全局查找哪些进程使用了某个 .so → find /proc -maxdepth 1 -name "[0-9]*" -exec grep -l "libc.so.6" {}/maps ; 2>/dev/null
方法命令适用场景scheduler-locking onset scheduler-locking on全局锁定其他线程(推荐)scheduler-locking stepset scheduler-locking step仅单步时锁定其他线程手动暂停线程thread apply all interrupt精确控制特定线程断点自动控制break + commands命中断点时自动锁定线程non-stop 模式set non-stop on高级调试(需 GDB 7.0+)
推荐方案
简单场景:直接使用 set scheduler-locking on。
精细控制:手动 interrupt/continue 特定线程。
自动化调试:结合断点命令(commands)自动锁定线程。
场景命令示例变量值触发break main.c:10 if x == 5循环迭代触发break loop.c:15 if i >= 100字符串匹配触发break my_func if strcmp(s, "key") == 0寄存器/内存触发break *0x4005a2 if $rax == 0xdeadbeef修改现有断点条件condition 1 x == 10自动执行命令commands + print x + continue + end
通过灵活使用条件断点,可以大幅提升调试效率!
三、排查工具及方法
在Linux系统中排查进程CPU占用高的问题,可以按照以下步骤逐步进行,结合多种工具深入分析:
- 定位高CPU进程
工具:top / htop
bash
top # 按Shift+P按CPU排序,记录目标PID htop # (更直观) 按F6选择"PERCENT_CPU"排序
替代命令:
bash
ps aux --sort=-%cpu | head -n 10 # 显示CPU占用前10的进程 - 分析进程内的线程
查看线程级CPU占用:
bash
top -H -p # 按Shift+P排序线程 或 ps -T -p -o pid,tid,%cpu,cmd # 显示线程详情(TID为线程ID) 计算线程ID的十六进制值(用于后续分析): bash
printf "%x\n" # 将线程ID转为16进制(如11542 → 0x2d16) - 捕获进程调用栈(关键步骤)
方法1:使用 gdb 实时分析
bash
gdb -p # 附加到进程 (gdb) thread apply all bt # 打印所有线程堆栈 (gdb) thread <线程号> # 切换到高CPU线程 (gdb) bt full # 查看详细调用栈 (gdb) detach # 退出时不终止进程 注意:生产环境慎用GDB,可能导致短暂停顿。 方法2:perf 性能分析(推荐) bash
perf top -p # 实时查看函数级CPU占用 perf record -p -g -- sleep 30 # 采样30秒 perf report -n --stdio # 分析采样数据 输出结果会显示热点函数及其调用链。 方法3:strace 跟踪系统调用 bash
strace -p -c # 统计系统调用耗时 strace -p -T -tt # 实时跟踪并显示时间戳 - 高级诊断工具
pidstat(监控进程资源)
bash
pidstat -p 1 -u -t # 每1秒报告CPU及线程(-t)使用 vmstat / mpstat(系统级监控) bash
vmstat 1 # 查看上下文切换(cs)、中断(in) mpstat -P ALL 1 # 监控每个CPU核心利用率
/proc 文件系统分析
bash
cat /proc//status # 查看进程状态 cat /proc//sched # 检查调度信息 - 诊断方法
若怀疑进程启动导致 I/O 高,可通过以下工具诊断:
strace:跟踪系统调用,观察文件操作。bashstrace -e trace=file,open,read,write ./program
perf:分析 I/O 相关事件。bashperf stat -e 'syscalls:sys_enter_*' ./program
iotop:实时监控进程的 I/O 使用。bashiotop -oP
vmstat:查看系统级 I/O 和内存压力。bashvmstat 1