【Linux调试】进程写IO占用高

一、排查思路
先定位问题点
最高效方法: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占用高的问题,可以按照以下步骤逐步进行,结合多种工具深入分析:

  1. 定位高CPU进程
    工具:top / htop
    bash
    top # 按Shift+P按CPU排序,记录目标PID htop # (更直观) 按F6选择"PERCENT_CPU"排序
    替代命令:
    bash
    ps aux --sort=-%cpu | head -n 10 # 显示CPU占用前10的进程
  2. 分析进程内的线程
    查看线程级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)
  3. 捕获进程调用栈(关键步骤)
    方法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 # 实时跟踪并显示时间戳
  4. 高级诊断工具
    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 # 检查调度信息
  5. 诊断方法
    若怀疑进程启动导致 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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容