Strace診斷CPU跑高問題(java/php網站)
早些年,如果你知道有個 strace 命令,就很牛了,而現在大家基本都知道 strace 了,如果你遇到效能問題求助別人,十有八九會建議你用 strace 掛上去看看,不過當你掛上去了,看著滿屏翻滾的字元,卻十有八九看不出個所以然。本文通過一個簡單的案例,向你展示一下在用 strace 診斷問題時的一些套路。
如下真實案例,如有雷同,實屬必然!讓我們看一臺高負載伺服器的 top 結果:
top
技巧:執行 top 時,按「1」開啟 CPU 列表,按「shift+p」以 CPU 排序。
在本例中大家很容易發現 CPU 主要是被若干個 PHP 程式佔用了,同時 PHP 程式佔用的比較多的記憶體,不過系統記憶體尚有結餘,SWAP 也不嚴重,這並不是問題主因。
不過在 CPU 列表中能看到 CPU 主要消耗在核心態「sy」,而不是使用者態「us」,和我們的經驗不符。Linux 作業系統有很多用來跟蹤程式行為的工具,核心態的函式呼叫跟蹤用「strace」,使用者態的函式呼叫跟蹤用「ltrace」,所以這裡我們應該用「strace」:
shell> strace -p <PID>
不過如果直接用 strace 跟蹤某個程式的話,那麼等待你的往往是滿屏翻滾的字元,想從這裡看出問題的癥結並不是一件容易的事情,好在 strace 可以按操作彙總時間:
shell> strace -cp <PID>
通過「c」選項用來彙總各個操作的總耗時,執行後的結果大概如下圖所示:
strace -cp
很明顯,我們能看到 CPU 主要被 clone 操作消耗了,還可以單獨跟蹤一下 clone:
shell> strace -T -e clone -p <PID>
通過「T」選項可以獲取操作實際消耗的時間,通過「e」選項可以跟蹤某個操作:
strace -T -e clone -p
很明顯,一個 clone 操作需要幾百毫秒,至於 clone 的含義,參考 man 文件:
clone() creates a new process, in a manner similar to fork(2). It is actually a library function layered on top of the underlying clone() system call, hereinafter referred to as sys_clone. A description of sys_clone is given towards the end of this page.
Unlike fork(2), these calls allow the child process to share parts of its execution context with the calling process, such as the memory space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, “calling process” normally corresponds to “parent process”. But see the description of CLONE_PARENT below.)
簡單來說,就是建立一個新程式。那麼在 PHP 裡什麼時候會出現此類系統呼叫呢?查詢業務程式碼看到了 exec 函式,通過如下命令驗證它確實會導致 clone 系統呼叫:
shell> strace -eclone php -r `exec("ls");`
最後再考大家一個題:如果我們用 strace 跟蹤一個程式,輸出結果很少,是不是說明程式很空閒?其實試試 ltrace,可能會發現別有洞天。記住有核心態和使用者態之分。
相關文章
- SQL問題診斷SQL
- 使用MTR命令診斷網路問題
- cpu使用率過高問題(Java)Java
- 網站SEO診斷分析要點網站
- 公司某資料子系統定期cpu過高的診斷
- 免費網站seo診斷:從哪些維度進行診斷呢?網站
- 詳解JAVA執行緒問題診斷工具Thread DumpJava執行緒thread
- 雲伺服器用MTR診斷Ubuntu網路問題方法伺服器Ubuntu
- 診斷叢集的潛在問題
- php無法正常修改網站,如何排查和解決PHP網站修改問題PHP網站
- 一次.net code中的placeholder導致的高cpu診斷
- [20181217]strace使用問題.txt
- 企業網站專業性診斷評價網站
- 如何診斷和解決db2問題DB2
- Java診斷利器ArthasJava
- oracle之 redo過高診斷Oracle
- SQL Server database mail問題診斷一例SQLServerDatabaseAI
- 一次gc buffer busy問題的診斷GC
- 網路效能監控與流量回溯分析 - 輕鬆診斷網路問題
- java專案cpu或記憶體過高,排查問題思路Java記憶體
- 面試問題---JAVA程式CPU佔用過高怎麼定位面試Java
- Java執行緒診斷Java執行緒
- [20190314]使用strace注意的問題.txt
- Java中的CPU佔用高和記憶體佔用高的問題排查Java記憶體
- 壓力測試事務率不高問題診斷
- 利用 Arthas 精準定位 Java 應用 CPU 負載過高問題Java負載
- Java cpu 高排查Java
- Oracle最佳化案例-strace sqlplus定位網路問題(三十一)OracleSQL
- 如何選擇java診斷工具Java
- [20200402]strace過濾使用awk問題.txt
- 記一次排查CPU高的問題
- JProfiler for Mac:提升效能和診斷問題的終極工具Mac
- 如何使用 dotTrace 來診斷 netcore 應用的效能問題NetCore
- 如何使用Apple診斷程式檢查Mac硬體問題APPMac
- 基於 PTS 壓測輕鬆玩轉問題診斷
- Mac OSX網路診斷命令Mac
- 網路診斷工具的使用
- SEO最佳化網站診斷的幾個技巧,你知道多少?網站
- Java 虛擬機器診斷利器Java虛擬機