CPU 100% 怎么排查呢

ieliwb

strace -tt -p 634881 后控制台不停的epoll_pwait 下面的内容。

02:52:18.433195 epoll_pwait(7, [{events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=17, u64=17}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=11, u64=11}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=14, u64=14}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=15, u64=15}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=16, u64=16}}], 32, 697, NULL, 8) = 5
02:52:18.433265 epoll_pwait(7, [{events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=17, u64=17}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=11, u64=11}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=14, u64=14}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=15, u64=15}}, {events=EPOLLIN|EPOLLERR|EPOLLHUP, data={u32=16, u64=16}}], 32, 697, NULL, 8) = 5

应该怎么排查呢,谢谢

我按照https://www.workerman.net/doc/workerman/debug/busy-process.html 排查了
感觉像代码里无限死循环问题。用的官方打包好的php,zbacktrace 没有任何东西,咋搞呢

157 1 1
1个回答

jack10082009

CPU 100% 排查指南

从你提供的信息来看,进程(pid 634881)处于高CPU使用状态,且strace显示它在频繁调用epoll_pwait。以下是详细的排查步骤:
确认问题进程类型

首先确认这是否是一个Workerman进程:
ps aux | grep 634881

使用top命令确认CPU使用情况

top -H -p 634881

查看哪个线程占用了高CPU
使用perf工具进行性能分析

perf top -p 634881

这会显示进程中最耗CPU的函数调用
使用gdb进行深入分析

gdb -p 634881

在gdb中执行:

查看调用栈
针对Workerman的特殊排查

如果确认是Workerman进程:
检查业务代码中是否有死循环

检查定时器是否设置不当(Timer::add)

检查是否有大量客户端连接但无数据交互

检查文件描述符

ls -l /proc/634881/fd

查看是否有异常的文件描述符
检查网络连接状态

netstat -anp | grep 634881

查看进程的网络连接情况
如果怀疑是PHP代码问题

可以尝试:
kill -SIGUSR2 634881

然后查看Workerman的日志,它会输出当前执行的文件和行号
其他工具

使用strace -c统计系统调用

使用ltrace跟踪库函数调用

针对你的具体情况

从strace输出看,进程在频繁处理epoll事件,但没有显示后续的处理逻辑。可能的原因:
事件循环处理逻辑有问题,导致不断触发相同事件

有大量空闲连接但Workerman仍在不断检查

某个回调函数执行时间过长

建议先使用perf或gdb获取更详细的调用栈信息,确定是卡在哪个具体函数上。

  • 暂无评论
🔝