重點是檢視程序的執行緒中,哪個執行緒占用cpu過高,然後用gdb附加到程序,除錯執行緒,看是否有死迴圈或者死鎖等問題,步驟如下:
先用ps + grep找出該死的程序pid,比如 1706
1.gdb attach 到程序號碼(1706)
2.(仍然在gdb中) info threads 結果大致如下:
(gdb) info threads 8 thread 0x7f9fa9366700 (lwp 1716) 0x0000003cec00b98e in pthread_cond_timedwait@@glibc_2.3.2 () from /lib64/libpthread.so.0 7 thread 0x7f9fa8965700 (lwp 1720) 0x0000003cec00b98e in pthread_cond_timedwait@@glibc_2.3.2 () from /lib64/libpthread.so.0 6 thread 0x7f9fa7f64700 (lwp 1721) 0x0000003cec00f4b5 in sigwait () from /lib64/libpthread.so.0 5 thread 0x7f9fa7563700 (lwp 1722) 0x0000003cec00b98e in pthread_cond_timedwait@@glibc_2.3.2 () from /lib64/libpthread.so.0 4 thread 0x7f9fa6b62700 (lwp 1723) 0x0000003cec00b5bc in pthread_cond_wait@@glibc_2.3.2 () from /lib64/libpthread.so.0 3 thread 0x7f9fa6161700 (lwp 1724) 0x0000003cebce9163 in epoll_wait () from /lib64/libc.so.6 2 thread 0x7f9fa1159700 (lwp 1887) 0x0000003cebce9163 in epoll_wait () from /lib64/libc.so.6 * 1 thread 0x7f9fa95ad820 (lwp 1706) 0x0000003cec00b5bc in pthread_cond_wait@@glibc_2.3.2 () from /lib64/libpthread.so.0
找到執行緒號碼對應的thread(lwp1723)即是我們剛剛記下的執行緒號
3.(仍然在gdb中)thread 執行緒號碼切換到執行緒(4)–這裡在info threads顯示出來的序號需要使用gdb能識別的線程式號,即執行:thread 4切換到我們剛剛記下的執行緒號:1723的對應執行緒,如下:
(gdb) thread 4 [switching to thread 4 (thread 0x7f9fa6b62700 (lwp 1723))]#0 0x0000003cec00b5bc in pthread_cond_wait@@glibc_2.3.2 () from /lib64/libpthread.so.0
4.(仍然在gdb中)bt 檢視執行緒呼叫堆疊
(gdb) bt
#0 0x0000003cec00b5bc in pthread_cond_wait@@glibc_2.3.2 () from /lib64/libpthread.so.0 #1 0x00007f9fa9f7144d in iceutil::cond::waitimpl (this=0x263f4c8, mutex=...) at ../../include/iceutil/cond.h:215 #2 0x00007f9fa9f9a4b1 in iceutil::monitor::wait (this=0x263f4c8) at ../../include/iceutil/monitor.h:152 #3 0x00007f9fa9fd7567 in iceinternal::endpointhostresolver::run (this=0x263f480) at endpointi.cpp:161 #4 0x00007f9fa9b1b975 in starthook (arg=0x263f480) at thread.cpp:413 #5 0x0000003cec0079d1 in start_thread () from /lib64/libpthread.so.0 #6 0x0000003cebce8b6d in clone () from /lib64/libc.so.6
5.從上面輸出的資訊,基本上可以檢視執行緒對應的**斷,是否有死迴圈等,如果是死鎖的話,需要多次檢視當前執行緒堆疊,或者檢視全部執行緒的堆疊,總是會有某些個執行緒跟其他執行緒不一致,然後再對應到**來進行定位解決 PHP CGI程序占用過多CPU
一般情況下,php cgi只在使用者訪問的時候會占用cpu資源,但是最近有同事反映,伺服器上的的php cgi程序占用了非常多的cpu,但是訪問流量卻非常少。這顯然是乙個不正常的現象,說有些地方存在故障。以下導致此問題可能存在的原因,在此與大家分享。1.相容性問題 如果php的擴充套件與php版本相...
PHP CGI程序占用過多CPU
一般情況下,php cgi只在使用者訪問的時候會占用cpu資源,但是最近有同事反映,伺服器上的的php cgi程序占用了非常多的cpu,但是訪問流量卻非常少。這顯然是乙個不正常的現象,說有些地方存在故障。以下導致此問題可能存在的原因,在此與大家分享。1.相容性問題 如果php的擴充套件與php版本相...
linux 分析程序占用CPU過高
重點是檢視程序的執行緒中,哪個執行緒占用cpu過高,然後用gdb附加到程序,除錯執行緒,看是否有死迴圈或者死鎖等問題,步驟如下 1 先用ps grep找出該死的程序pid,比如 1706 gdb attach 到程序號碼 1706 仍然在gdb中 info threads 結果大致如下 gdb in...