Linux 系統性能分析工具圖解讀
最近看了 Brendan Gregg 大神著名的 Linux Performance Observability Tools,這么好的資料不好好學習一下實在是浪費了,又找到了大神的 ppt 和 演講(需爬墻),于是把相關的命令和概念連預習,學習,復習走了一遍。
首先學習的是大神提出的 Basic Tool 有如下幾個:
-
uptime
-
top (htop)
-
mpstat
-
iostat
-
vmstat
-
free
-
ping
-
nicstat
-
dstat
uptime
uptime 比較重要的能顯示當前系統的負載狀態,但是這個負載究竟是什么意思呢?查了一些資料負載指的是當前可運行的程序加上正在運行的程序再加上等待 IO 的程序,比如現在運行著一個,一個等待運行,還有一個等待 IO 那么負載就是3. uptime 后面三個數分別是 1min, 5min 和 15min 的負載平均值,由于內核用了一個指數平滑的平均算法,這個值不能直接反應當前等待的進程數。此外這個值沒對多核進行 normalization 所以單核情況下當負載是 1 的時候說明 cpu 滿載了,但是對于 4 核 cpu 剛到滿負載的 25%。 一般情況下這個值越大就說明等待 CPU 的進程越多,如果大于核數就說明有進程在等待 CPU,需要看一下程序的問題或者考慮加機器了。另外即使負載過載了也不一定說明 CPU 的利用率高,因為很可能是大量的請求 IO 的進程在等待,像一些數據庫服務,所以看完負載后還要針對應用場景綜合考量。
top & htop
top 其實是一個相當全面的分析了還是事實的,其他很多命令能拿到的數據,top 一個命令就可以拿到。但是他的一個問題就是本身的 overhead 比較大,如果系統負載本身就很大那么可能就會卡住了。此外 top 可能會忽視掉那些生命周期很短的程序。top 的 manual 里詳細介紹了每個指標的意義,翻看一下還是很有收獲的。其中比較要關注的有 wa(io wait),查看是不是你的 IO 是瓶頸,還有 st (time stolen from this vm by the hypervisor) 這個指標會出現在虛擬機里的系統中,表示的是你的虛擬機在等待真實物理機的 CPU 資源的時間。如果這個值很高的話說明你的服務提供商的 CPU 資源有限你沒搶過別人,很有可能使服務商超賣了。碰到這種情況要么打客服投訴,或者多掏點銀子找個靠譜的運營商吧。
htop 是 top 的改進版,帶著各種顏色表示和百分比進度條,以及更豐富的功能,小伙伴們可以嘗試一下。
mpstat
mpstat 可以顯示出每個 CPU 核心的工作情況,其實也可以在 top 里輸入 1 看到。通過這個命令我們可以觀察是不是存在負載不均的現象,某個核心跑滿了,另一個還在閑著,造成整體性能的下降。
iostat
加上 -x 參數后可以看到幾乎全部的 io 指標,包括 tps, 請求 queue 的平均長度,平均處理時間, 磁盤帶寬利用率等等。每個指標 manual 中都有詳細的解釋。
vmstat & free
vmstat 是一個展示內存整體使用情況的命令,其中要關注一下 swpd 和 swap 的 in/out 。如果這一部分的數值過大,會頻繁的 IO 造成性能下降,要么看看是不是程序內存泄露了,要么就加內存吧。 memory 里的 buffer 指的是寫磁盤緩沖區, 而 cache 可以當成是讀文件的緩沖區。free也是類似的功能,不過只展示內存部分的內容。
ping
這個相對來說簡單一些,主要反映了主機間的延遲和連通性,很多時候也只能告訴我們這些了。可以嘗試一下 hping 有著指定端口,高級 tracerout 的功能。
nicstat
一個和 iostat 類似,不過是針對網卡的命令。
dstat
一個綜合了cpu、 memory、 IO、 network 的工具,可以事實展示當前的系統資源利用情況。
以上就是最基礎的命令了,高級一些的命令有:
-
sar
-
netstat
-
pidstat
-
strace
-
tcpdump
-
blktrace
-
iotop
-
slabtop
-
sysctl
-
/proc
第一篇在這里
第一篇講了一些最基礎的命令了,接下來在研究研究高級的命令:
-
sar
-
netstat
-
pidstat
-
strace
-
tcpdump
-
blktrace
-
iotop
-
slabtop
-
sysctl
-
/proc
sar
sar 是 System Activity Reporter 的意思,這是一個強大到發指的工具,在第一篇中提到的那些工具的功能(cpu、 mem、 disk、 net),基本上 sar 都可以覆蓋到,不信的話可以試一下 sar -A 1 1 看一下它都統計了哪些東西。此外 sar 可以周期性的執行統計,很多系統級別的監控都是通過 sar 來做的。淘寶還專門自己開發了一個 tsar 在原有的系統級別的監控上增加了對應用的監控。
netstat
這 個命令也是和網絡相關的,可以查看 socket 的連接信息,比如建立了哪些 TCP 連接,他們的狀態是怎樣的,一個進程有多少鏈接。通常這個命令后面都會跟著 grep 或者 awk 的命令進行進一步處理。以至于有的 awk 的教程都會以 netstat 的輸出處理作為樣例,比如耗子叔叔的 awk 簡明教程。此外這個命令還有一個 -s 的參數可以統計不同的協議的數據包信息。
pidstat
其 實要不是看到大神說有這個命令,我還以為這個命令是 ps 的全稱。其實展示的東西也和 ps 類似,主要的區別在于 ps 只是一次提供系統進程狀態的一個快照,pidstat# 可以指定進程提供定時多次的統計信息,相當于你可以更細粒度的 ps 了。這也是做監控的一個很好的工具,可以針對特殊進程特殊關照。
strace
其 實感覺 strace 是一個更偏針對應用的性能工具,他可以統計出進程進行了哪些系統調用,處理了哪些信號。也因此 strace 是一個分析程序實現的一個很好的工具,比如說你想知道 pidstat 中的信息都是從哪里獲得的就 strace pidstat |& grep open 就可以知道它是打開了哪些文件獲取到信息的。由于 strace 會將輸出打到標準錯誤中所以管道處理要記得加上 & 。這個命令是很強大,但問題是也及其消耗性能,一般情況下慢一個數量級還是會有的,所以只是分析的時候用一下,正常執行就不要了。
tcpdump
大 名鼎鼎的 tcpdump 可以將經過網卡的數據包保存下來一份以供 wireshark 這類軟件進一步進行分析。如果愿意的話開啟網卡混雜模式也可以捕獲同一網絡上其他機器的數據包,也是黑客很喜歡的工具。和 strace 類似, tcpdump 的功能很強大,即使開了 filter 功能也很消耗性能,一般的生產機如果流量大的話開啟 tcpdump還是吃不消的。當然有一些神秘的組織是需要獲取網絡包的完整備份的,他們大概是用專門的硬件完成的吧。
blktrace
其實這個命令用 btrace 展示會更好一些,看名字就知道是 strace 的 io 版,可以實時的展示每次磁盤 IO 請求的內容,耗時,發生位置等等很多東西,不過帶 trace 的命令一般都比較耗性能。
iotop
和上個命令類似,一看就是 top 的 io 版,簡潔明了,包括展示都和 top 很類似,試一下就知道是怎么回事了。
slabtop
其實只要知道 slab 是個什么東西,這個命令就很好理解了。slab 是對象緩沖池,將一些常用的小的對象結構再釋放后緩存起來,而不是直接交給系統回收,這樣可以避免頻繁的小對象找系統申請內存造成性能下降,知道這個再看 這條命令就很輕松了。
sysctl
這里面是一些很有講究的系統參數的設置,很多參數的設置都會對服務器的性能產生很大的影響。這也是個水很深的配置文件,比如 tcpreuse、tcprecycle 這些服務器的重要配置都在這里面。這里面的配置估計也能講上個幾天幾夜。還是先 sysctl -a 看一下感受感受吧。
/proc
其實上述諸多的工具都是從這個文件加下面讀取文件做展示的,不過真要自己解析這里面的文件還是蠻耗功夫的,所以還是好好用一下上面的那些命令吧。不過如果你對那些命令是如何實現的可以配合著 strace 來探索這里面的奧秘。