linux 分析 程序cpu占用過高

2021-10-21 13:27:23 字數 2296 閱讀 2846

重點是檢視程序的執行緒中,哪個執行緒占用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...