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 没有任何东西,咋搞呢
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获取更详细的调用栈信息,确定是卡在哪个具体函数上。