面對以下問題:
生産服務突然卡住,接口響應緩慢
到底是什麼操作在消耗cpu
項目配置的檔案沒生效(如:spring boot多檔案根據優先級加載的)
針對以上問題,當束手無策的時候,strace他也許可以幫到你,他也在工作中幫我排除了衆多障礙。
strace 就是跟蹤程序行為的一大神器,你可以通過它知道正在執行的程序中到底發生了什麼,以及程式為什麼出現錯誤等等。
安裝方法
- CentOS/EulerOS系統:# yum install strace
- Ubuntu系統:# apt-get install strace –y
常用參數及示例
- -c: 統計每一系統調用的所執行的時間、次數和出錯的次數等。示例:列印執行uptime時系統系統調用的時間、次數、出錯次數和syscall。# strace -c uptime
- -i: 在系統調用時列印指令指針。
- -e trace=file: 跟蹤所有以檔案名作為參數的系統調用。示例:列印執行ls時跟檔案有關的系統調用。# strace -e trace=file ls
- -e trace=process: 跟蹤涉及過程管理的所有系統調用。這對于觀察程序的派生、等待和執行步驟很有用。
- -e trace=network: 跟蹤所有與網絡相關的系統調用。
- -e trace=signal: 跟蹤所有與信号相關的系統調用。
- -e trace=ipc: 跟蹤所有與IPC相關的系統調用。
下面舉兩個實際使用的例子:
一:系統卡住問題排查
strace -tt -T -v -f -e trace=all -o strace.log -s 1024 -p [pid]
也可以随程序一起啟動此指令:
strace -tt -T -v -f -e trace=all -o strace.log -s 1024 lua test.lua
輸出服務所有的系統調用,檢視哪個系統調用消耗了大量的時間,我們先看線程阻塞在哪裡,以下發下是被write調用阻塞。
我們再運作 strace -tt -T -v -f -e trace=all -o strace.log -s 1024 -p 19843
發現大量的write調用導緻系統運作緩慢(系統調用應該在微秒級别,如 0.000019秒,以下花費5s已經相當耗時了。)
檢查代碼發現代碼裡print了較大的字元串。至于print标準出輸出為什麼會阻塞耗時,可以自行了解。
二:程式正在做什麼
通過strace -c -p [程序id] 連續運作幾次發現系統時間都花費在write操作上
我們可以舉一反三,我們的系統基本都涉及到系統調用,可以使用此指令排查關于系統調用的大部分問題。至于每種系統調用的含義可以自行了解。
附上别的部落客寫的更詳細的使用方式:https://cloud.tencent.com/developer/article/2031834