strace -tt -p 634881 后控制臺不停的epoll_pwait 下面的內(nèi)容。
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
應(yīng)該怎么排查呢,謝謝
我按照http://www.wtbis.cn/doc/workerman/debug/busy-process.html 排查了
感覺像代碼里無限死循環(huán)問題。用的官方打包好的php,zbacktrace 沒有任何東西,咋搞呢
CPU 100% 排查指南
從你提供的信息來看,進程(pid 634881)處于高CPU使用狀態(tài),且strace顯示它在頻繁調(diào)用epoll_pwait。以下是詳細的排查步驟:
確認問題進程類型
首先確認這是否是一個Workerman進程:
ps aux | grep 634881
使用top命令確認CPU使用情況
top -H -p 634881
查看哪個線程占用了高CPU
使用perf工具進行性能分析
perf top -p 634881
這會顯示進程中最耗CPU的函數(shù)調(diào)用
使用gdb進行深入分析
gdb -p 634881
在gdb中執(zhí)行:
查看調(diào)用棧
針對Workerman的特殊排查
如果確認是Workerman進程:
檢查業(yè)務(wù)代碼中是否有死循環(huán)
檢查定時器是否設(shè)置不當(Timer::add)
檢查是否有大量客戶端連接但無數(shù)據(jù)交互
檢查文件描述符
ls -l /proc/634881/fd
查看是否有異常的文件描述符
檢查網(wǎng)絡(luò)連接狀態(tài)
netstat -anp | grep 634881
查看進程的網(wǎng)絡(luò)連接情況
如果懷疑是PHP代碼問題
可以嘗試:
kill -SIGUSR2 634881
然后查看Workerman的日志,它會輸出當前執(zhí)行的文件和行號
其他工具
使用strace -c統(tǒng)計系統(tǒng)調(diào)用
使用ltrace跟蹤庫函數(shù)調(diào)用
針對你的具體情況
從strace輸出看,進程在頻繁處理epoll事件,但沒有顯示后續(xù)的處理邏輯。可能的原因:
事件循環(huán)處理邏輯有問題,導(dǎo)致不斷觸發(fā)相同事件
有大量空閑連接但Workerman仍在不斷檢查
某個回調(diào)函數(shù)執(zhí)行時間過長
建議先使用perf或gdb獲取更詳細的調(diào)用棧信息,確定是卡在哪個具體函數(shù)上。