调试CPU creep问题:htop条目识别与ZonesManager高CPU线程定位
我正在排查本机出现的CPU creep问题,下方为htop输出截图。

观察到htop输出中每个应用对应多条条目,我推测每条条目对应一个线程,想确认该推测是否正确。此外发现ZonesManager的某一线程CPU利用率极高,想了解如何定位到该具体线程,解答如下:
推测验证
你的判断完全正确。htop默认隐藏线程级条目,同一应用出现多条独立条目时,代表当前已开启线程显示模式(可通过大写H快捷键切换开关,底部状态栏出现Show threads: Yes提示即为开启状态),这些条目对应该应用创建的所有独立线程,单条目的资源统计值对应单个线程的实际占用。
ZonesManager高CPU线程定位方法
- htop内直接定位
保持线程显示开启状态,在列表中找到CPU占比异常的ZonesManager条目,查看最左侧PID列的数值——对线程而言这个ID是TID(全局唯一线程ID),记录该值即可。按下小写c键可切换显示条目的完整命令行,可初步判断线程运行参数。 - ps命令快速过滤所有线程占用
终端执行以下命令,可直接输出ZonesManager下所有线程的PID、TID、CPU占比、线程名,无需手动翻找列表:
输出中ps -T -p $(pidof ZonesManager) -o pid,tid,pcpu,commPCPU列数值最高的行即为异常线程,对应TID为线程ID,COMM为线程名称。 - top专属线程视图监控
执行以下命令可打开ZonesManager的专属线程监控面板,默认按CPU占比降序排列,顶部第一条即为异常高占用线程:top -H -p $(pidof ZonesManager) - 定位线程高占用的代码逻辑
拿到异常线程TID后,可通过以下方式确认具体执行逻辑:- 执行
perf top -t <记录的TID>,实时查看该线程的调用栈热点,直接定位CPU占比最高的函数/代码段 - 执行
gdb -p $(pidof ZonesManager)附加到ZonesManager主进程,进入gdb交互后输入thread find <记录的TID>切换到目标线程,再输入bt即可打印线程当前完整调用栈,确认执行逻辑。
- 执行
内容的提问来源于stack exchange,提问作者liv2hak
相关产品推荐
相关产品推荐

