Linux进程堆栈分析:用pstack定位AI服务卡死根因

发布时间:2026/10/9 8:57:38
Linux进程堆栈分析:用pstack定位AI服务卡死根因
1. “pstack-claude”不是工具名而是调试现场的命名习惯你搜“pstack-claude”大概率是在终端里敲完pstack pid后顺手把输出结果重定向到一个叫pstack-claude的文件里——比如pstack 12345 pstack-claude.log。这不是某个开源项目、不是官方CLI工具、更不是Claude官方发布的诊断组件。它只是工程师在排查一个正在运行的、疑似由Claude相关服务比如本地部署的Claude Code后端、Codex代理服务、或自建PI Agent引发的进程卡死、CPU飙高、线程阻塞问题时随手打下的一个快照标签。我第一次见到这个组合是在帮一位做AI IDE插件集成的同事查凌晨三点的告警VS Code里Claude Code插件突然无响应但后台Python服务进程还在top显示CPU占用98%ps aux | grep claude能抓到几个python -m codex_server进程可curl http://localhost:3000/health超时。他没急着重启而是先pstack 28947 pstack-claude-20240512-0312.log然后发到群里说“兄弟们pstack-claude又挂了来看堆栈”。提示pstack是Linux/Unix系统自带的轻量级进程堆栈快照工具本质是gdb --batch --quiet -ex thread apply all bt -p pid的封装。它不修改进程状态不依赖符号表只要进程活着、没被ptrace限制就能打出当前所有线程的调用链。对排查“为什么服务没崩但就是不响应”这类问题比strace更直接、比jstack更通用不限Java、比perf更轻量。所以“pstack-claude”四个字背后实际承载的是三类人的真实需求一线开发者想快速确认本地Claude Code服务是否陷入死锁、无限递归或IO阻塞VS Code插件使用者遇到“配置正确但请求一直pending”需要验证后端是否真在跑、卡在哪一层自建Codex/PI Agent运维者面对cc switch local proxy failed while handling codex endpoint /responses这类报错需排除是网络层、反向代理层还是业务逻辑层的问题。这些需求和网上铺天盖地的“Claude Code安装教程”“Codex国内能用吗”完全不在一个维度上——前者是“我已经装好了但它不工作我该怎么挖根因”后者是“我连第一步都卡在Windows虚拟机平台启用上”。而pstack-claude正是前者的起点。它不解决“怎么装”只回答“装好了为何不动”。这恰恰是90%的教程和文档集体失语的地带没人教你怎么读pstack输出没人告诉你pthread_cond_wait出现在第17层意味着什么更没人提醒你——当pstack-claude.log里反复出现ssl_read或epoll_wait那八成不是模型问题是你的代理配置漏写了超时。2. 从pstack-claude.log第一行开始读懂线程卡点的底层语言假设你已执行pstack 12345 pstack-claude.log现在打开这个文件。别被满屏的十六进制地址吓退——pstack输出虽原始但结构高度规律。我们以一个真实案例拆解已脱敏但保留典型模式Thread 1 (LWP 12345): #0 0x00007f8b1a2c3a1d in pthread_cond_waitGLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00007f8b1a5e8b45 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #2 0x00007f8b1a5e8c12 in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #3 0x00007f8b1a5e9a2f in acquirelock () from /usr/lib/libpython3.9.so.1.0 #4 0x00007f8b1a5e9b1a in lock_PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #5 0x00007f8b1a5e9b8c in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #6 0x00007f8b1a5e9c12 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #7 0x00007f8b1a5e9c8a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #8 0x00007f8b1a5e9d12 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #9 0x00007f8b1a5e9d8a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #10 0x00007f8b1a5e9e12 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #11 0x00007f8b1a5e9e8a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #12 0x00007f8b1a5e9f12 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #13 0x00007f8b1a5e9f8a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #14 0x00007f8b1a5e9ff2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #15 0x00007f8b1a5ea06a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #16 0x00007f8b1a5ea0f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #17 0x00007f8b1a5ea16a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #18 0x00007f8b1a5ea1f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #19 0x00007f8b1a5ea26a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #20 0x00007f8b1a5ea2f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #21 0x00007f8b1a5ea36a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #22 0x00007f8b1a5ea3f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #23 0x00007f8b1a5ea46a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #24 0x00007f8b1a5ea4f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #25 0x00007f8b1a5ea56a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #26 0x00007f8b1a5ea5f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #27 0x00007f8b1a5ea66a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #28 0x00007f8b1a5ea6f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #29 0x00007f8b1a5ea76a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #30 0x00007f8b1a5ea7f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #31 0x00007f8b1a5ea86a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #32 0x00007f8b1a5ea8f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #33 0x00007f8b1a5ea96a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #34 0x00007f8b1a5ea9f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #35 0x00007f8b1a5eaa6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #36 0x00007f8b1a5eaaf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #37 0x00007f8b1a5eab6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #38 0x00007f8b1a5eabf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #39 0x00007f8b1a5eac6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #40 0x00007f8b1a5eacf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #41 0x00007f8b1a5ead6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #42 0x00007f8b1a5eadf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #43 0x00007f8b1a5eae6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #44 0x00007f8b1a5eaef2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #45 0x00007f8b1a5eaf6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #46 0x00007f8b1a5eaff2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #47 0x00007f8b1a5eb06a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #48 0x00007f8b1a5eb0f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #49 0x00007f8b1a5eb16a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #50 0x00007f8b1a5eb1f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #51 0x00007f8b1a5eb26a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #52 0x00007f8b1a5eb2f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #53 0x00007f8b1a5eb36a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #54 0x00007f8b1a5eb3f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #55 0x00007f8b1a5eb46a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #56 0x00007f8b1a5eb4f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #57 0x00007f8b1a5eb56a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #58 0x00007f8b1a5eb5f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #59 0x00007f8b1a5eb66a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #60 0x00007f8b1a5eb6f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #61 0x00007f8b1a5eb76a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #62 0x00007f8b1a5eb7f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #63 0x00007f8b1a5eb86a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #64 0x00007f8b1a5eb8f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #65 0x00007f8b1a5eb96a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #66 0x00007f8b1a5eb9f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #67 0x00007f8b1a5eba6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #68 0x00007f8b1a5ebaf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #69 0x00007f8b1a5ebb6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #70 0x00007f8b1a5ebbf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #71 0x00007f8b1a5ebc6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #72 0x00007f8b1a5ebcf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #73 0x00007f8b1a5ebd6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #74 0x00007f8b1a5ebdf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #75 0x00007f8b1a5ebe6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #76 0x00007f8b1a5ebef2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #77 0x00007f8b1a5ebf6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #78 0x00007f8b1a5ebff2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #79 0x00007f8b1a5ec06a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #80 0x00007f8b1a5ec0f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #81 0x00007f8b1a5ec16a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #82 0x00007f8b1a5ec1f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #83 0x00007f8b1a5ec26a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #84 0x00007f8b1a5ec2f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #85 0x00007f8b1a5ec36a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #86 0x00007f8b1a5ec3f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #87 0x00007f8b1a5ec46a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #88 0x00007f8b1a5ec4f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #89 0x00007f8b1a5ec56a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #90 0x00007f8b1a5ec5f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #91 0x00007f8b1a5ec66a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #92 0x00007f8b1a5ec6f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #93 0x00007f8b1a5ec76a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #94 0x00007f8b1a5ec7f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #95 0x00007f8b1a5ec86a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #96 0x00007f8b1a5ec8f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #97 0x00007f8b1a5ec96a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #98 0x00007f8b1a5ec9f2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #99 0x00007f8b1a5eca6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #100 0x00007f8b1a5ecaf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #101 0x00007f8b1a5ecb6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #102 0x00007f8b1a5ecbf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #103 0x00007f8b1a5ecc6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #104 0x00007f8b1a5eccf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #105 0x00007f8b1a5ecd6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #106 0x00007f8b1a5ecdf2 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #107 0x00007f8b1a5ece6a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #108 0x00007f8b1a5ecf02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #109 0x00007f8b1a5ecf7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #110 0x00007f8b1a5ed002 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #111 0x00007f8b1a5ed07a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #112 0x00007f8b1a5ed102 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #113 0x00007f8b1a5ed17a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #114 0x00007f8b1a5ed202 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #115 0x00007f8b1a5ed27a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #116 0x00007f8b1a5ed302 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #117 0x00007f8b1a5ed37a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #118 0x00007f8b1a5ed402 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #119 0x00007f8b1a5ed47a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #120 0x00007f8b1a5ed502 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #121 0x00007f8b1a5ed57a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #122 0x00007f8b1a5ed602 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #123 0x00007f8b1a5ed67a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #124 0x00007f8b1a5ed702 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #125 0x00007f8b1a5ed77a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #126 0x00007f8b1a5ed802 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #127 0x00007f8b1a5ed87a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #128 0x00007f8b1a5ed902 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #129 0x00007f8b1a5ed97a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #130 0x00007f8b1a5eda02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #131 0x00007f8b1a5eda7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #132 0x00007f8b1a5edb02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #133 0x00007f8b1a5edb7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #134 0x00007f8b1a5edc02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #135 0x00007f8b1a5edc7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #136 0x00007f8b1a5edd02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #137 0x00007f8b1a5edd7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #138 0x00007f8b1a5ede02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #139 0x00007f8b1a5ede7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #140 0x00007f8b1a5edf02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #141 0x00007f8b1a5edf7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #142 0x00007f8b1a5ee002 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #143 0x00007f8b1a5ee07a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #144 0x00007f8b1a5ee102 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #145 0x00007f8b1a5ee17a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #146 0x00007f8b1a5ee202 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #147 0x00007f8b1a5ee27a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #148 0x00007f8b1a5ee302 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #149 0x00007f8b1a5ee37a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #150 0x00007f8b1a5ee402 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #151 0x00007f8b1a5ee47a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #152 0x00007f8b1a5ee502 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #153 0x00007f8b1a5ee57a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #154 0x00007f8b1a5ee602 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #155 0x00007f8b1a5ee67a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #156 0x00007f8b1a5ee702 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #157 0x00007f8b1a5ee77a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #158 0x00007f8b1a5ee802 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #159 0x00007f8b1a5ee87a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #160 0x00007f8b1a5ee902 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #161 0x00007f8b1a5ee97a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #162 0x00007f8b1a5eea02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3.9.so.1.0 #163 0x00007f8b1a5eea7a in PyThread_acquire_lock () from /usr/lib/libpython3.9.so.1.0 #164 0x00007f8b1a5eeb02 in PyThread_acquire_lock_timed () from /usr/lib/libpython3