超全整理!Linux性能分析工具匯總
出于對Linux操作系統(tǒng)的興趣,以及對底層知識的強烈欲望,因此整理了這篇文章。本文也可以作為檢驗基礎(chǔ)知識的指標(biāo),另外文章涵蓋了一個系統(tǒng)的方方面面。如果沒有完善的計算機系統(tǒng)知識,網(wǎng)絡(luò)知識和操作系統(tǒng)知識,文檔中的工具,是不可能完全掌握的,另外對系統(tǒng)性能分析和優(yōu)化是一個長期的系列。
本文檔主要是結(jié)合Linux 大牛,Netflix 高級性能架構(gòu)師 Brendan Gregg 更新 Linux 性能調(diào)優(yōu)工具的博文,搜集Linux系統(tǒng)性能優(yōu)化相關(guān)文章整理后的一篇綜合性文章,主要是結(jié)合博文對涉及到的原理和性能測試的工具展開說明。
性能分析工具
首先來看一張圖:
上圖是Brendan Gregg 的一次性能分析的分享,這里面的所有工具都可以通過man來獲得它的幫助文檔,下問簡單介紹介紹一下常規(guī)的用法:
vmstat--虛擬內(nèi)存統(tǒng)計
vmstat(VirtualMeomoryStatistics,虛擬內(nèi)存統(tǒng)計) 是Linux中監(jiān)控內(nèi)存的常用工具,可對操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU等的整體情況進(jìn)行監(jiān)視。
vmstat的常規(guī)用法:vmstat interval times即每隔interval秒采樣一次,共采樣times次,如果省略times,則一直采集數(shù)據(jù),直到用戶手動停止為止。簡單舉個例子:
可以使用ctrl+c停止vmstat采集數(shù)據(jù)。
第一行顯示了系統(tǒng)自啟動以來的平均值,第二行開始顯示現(xiàn)在正在發(fā)生的情況,接下來的行會顯示每5秒間隔發(fā)生了什么,每一列的含義在頭部,如下所示:
- procs:r這一列顯示了多少進(jìn)程在等待cpu,b列顯示多少進(jìn)程正在不可中斷的休眠(等待IO)。
- memory:swapd列顯示了多少塊被換出了磁盤(頁面交換),剩下的列顯示了多少塊是空閑的(未被使用),多少塊正在被用作緩沖區(qū),以及多少正在被用作操作系統(tǒng)的緩存。
- swap:顯示交換活動:每秒有多少塊正在被換入(從磁盤)和換出(到磁盤)。
- io:顯示了多少塊從塊設(shè)備讀?。╞i)和寫出(bo),通常反映了硬盤I/O。
- system:顯示每秒中斷(in)和上下文切換(cs)的數(shù)量。
- cpu:顯示所有的cpu時間花費在各類操作的百分比,包括執(zhí)行用戶代碼(非內(nèi)核),執(zhí)行系統(tǒng)代碼(內(nèi)核),空閑以及等待IO。
內(nèi)存不足的表現(xiàn):free memory急劇減少,回收buffer和cacher也無濟(jì)于事,大量使用交換分區(qū)(swpd),頁面交換(swap)頻繁,讀寫磁盤數(shù)量(io)增多,缺頁中斷(in)增多,上下文切換(cs)次數(shù)增多,等待IO的進(jìn)程數(shù)(b)增多,大量CPU時間用于等待IO(wa)
iostat--用于報告中央處理器統(tǒng)計信息
iostat用于報告中央處理器(CPU)統(tǒng)計信息和整個系統(tǒng)、適配器、tty 設(shè)備、磁盤和 CD-ROM 的輸入/輸出統(tǒng)計信息,默認(rèn)顯示了與vmstat相同的cpu使用信息,使用以下命令顯示擴展的設(shè)備統(tǒng)計:
第一行顯示的是自系統(tǒng)啟動以來的平均值,然后顯示增量的平均值,每個設(shè)備一行。
常見linux的磁盤IO指標(biāo)的縮寫習(xí)慣:rq是request,r是read,w是write,qu是queue,sz是size,a是verage,tm是time,svc是service。
- rrqm/s和wrqm/s:每秒合并的讀和寫請求,“合并的”意味著操作系統(tǒng)從隊列中拿出多個邏輯請求合并為一個請求到實際磁盤。
- r/s和w/s:每秒發(fā)送到設(shè)備的讀和寫請求數(shù)。
- rsec/s和wsec/s:每秒讀和寫的扇區(qū)數(shù)。
- avgrq –sz:請求的扇區(qū)數(shù)。
- avgqu –sz:在設(shè)備隊列中等待的請求數(shù)。
- await:每個IO請求花費的時間。
- svctm:實際請求(服務(wù))時間。
- %util:至少有一個活躍請求所占時間的百分比。
dstat--系統(tǒng)監(jiān)控工具
dstat顯示了cpu使用情況,磁盤io情況,網(wǎng)絡(luò)發(fā)包情況和換頁情況,輸出是彩色的,可讀性較強,相對于vmstat和iostat的輸入更加詳細(xì)且較為直觀。在使用時,直接輸入命令即可,當(dāng)然也可以使用特定參數(shù)。
如下:dstat –cdlmnpsy
iotop--LINUX進(jìn)程實時監(jiān)控工具
iotop命令是專門顯示硬盤IO的命令,界面風(fēng)格類似top命令,可以顯示IO負(fù)載具體是由哪個進(jìn)程產(chǎn)生的。是一個用來監(jiān)視磁盤I/O使用狀況的top類工具,具有與top相似的UI,其中包括PID、用戶、I/O、進(jìn)程等相關(guān)信息。
可以以非交互的方式使用:
- iotop –bod interval,查看每個進(jìn)程的I/O,可以使用pidstat,pidstat –d instat
pidstat--監(jiān)控系統(tǒng)資源情況
pidstat主要用于監(jiān)控全部或指定進(jìn)程占用系統(tǒng)資源的情況,如CPU,內(nèi)存、設(shè)備IO、任務(wù)切換、線程等。
使用方法:
- pidstat –d interval
- #統(tǒng)計CPU使用信息
- pidstat –u interval
- #統(tǒng)計內(nèi)存信息
- Pidstat –r interval
top
top命令的匯總區(qū)域顯示了五個方面的系統(tǒng)性能信息:
- 負(fù)載:時間,登陸用戶數(shù),系統(tǒng)平均負(fù)載;
- 進(jìn)程:運行,睡眠,停止,僵尸;
- cpu:用戶態(tài),核心態(tài),NICE,空閑,等待IO,中斷等;
- 內(nèi)存:總量,已用,空閑(系統(tǒng)角度),緩沖,緩存;
- 交換分區(qū):總量,已用,空閑
任務(wù)區(qū)域默認(rèn)顯示:進(jìn)程ID,有效用戶,進(jìn)程優(yōu)先級,NICE值,進(jìn)程使用的虛擬內(nèi)存,物理內(nèi)存和共享內(nèi)存,進(jìn)程狀態(tài),CPU占用率,內(nèi)存占用率,累計CPU時間,進(jìn)程命令行信息。
htop
htop 是Linux系統(tǒng)中的一個互動的進(jìn)程查看器,一個文本模式的應(yīng)用程序(在控制臺或者X終端中),需要ncurses。
Htop可讓用戶交互式操作,支持顏色主題,可橫向或縱向滾動瀏覽進(jìn)程列表,并支持鼠標(biāo)操作。
與top相比,htop有以下優(yōu)點:
- 可以橫向或者縱向滾動瀏覽進(jìn)程列表,以便看到所有的進(jìn)程和完整的命令行。
- 在啟動上,比top更快。
- 殺進(jìn)程時不需要輸入進(jìn)程號。
- htop支持鼠標(biāo)操作。
mpstat
mpstat 是Multiprocessor Statistics的縮寫,是實時系統(tǒng)監(jiān)控工具。其報告與CPU的一些統(tǒng)計信息,這些信息存放在/proc/stat文件中。在多CPUs系統(tǒng)里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。常見用法:
- mpstat –P ALL interval times
netstat
Netstat用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計數(shù)據(jù),一般用于檢驗本機各端口的網(wǎng)絡(luò)連接情況。
常見用法:
- netstat –npl #可以查看你要打開的端口是否已經(jīng)打開。
- netstat –rn #打印路由表信息。
- netstat –in #提供系統(tǒng)上的接口信息,打印每個接口的MTU,輸入分組數(shù),輸入錯誤,輸出分組數(shù),輸出錯誤,沖突以及當(dāng)前的輸出隊列的長度。
ps--顯示當(dāng)前進(jìn)程的狀態(tài)
ps參數(shù)太多,具體使用方法可以參考man ps,
常用的方法:
- ps aux #hsserver
- ps –ef |grep #hundsun
- #殺掉某一程序的方法
- ps aux | grep mysqld | grep –v grep | awk ‘{print $2 }’ xargs kill -9
- #殺掉僵尸進(jìn)程
- ps –eal | awk ‘{if ($2 == “Z”){print $4}}’ | xargs kill -9
strace
跟蹤程序執(zhí)行過程中產(chǎn)生的系統(tǒng)調(diào)用及接收到的信號,幫助分析程序或命令執(zhí)行中遇到的異常情況。
舉例:查看mysqld在linux上加載哪種配置文件,可以通過運行下面的命令:
- strace –e stat64 mysqld –print –defaults > /dev/null
uptime
能夠打印系統(tǒng)總共運行了多長時間和系統(tǒng)的平均負(fù)載,uptime命令最后輸出的三個數(shù)字的含義分別是1分鐘,5分鐘,15分鐘內(nèi)系統(tǒng)的平均負(fù)荷。
lsof
lsof(list open files)是一個列出當(dāng)前系統(tǒng)打開文件的工具。通過lsof工具能夠查看這個列表對系統(tǒng)檢測及排錯,常見的用法:
- #查看文件系統(tǒng)阻塞
- lsof /boot
- #查看端口號被哪個進(jìn)程占用
- lsof -i : 3306
- #查看用戶打開哪些文件
- lsof –u username
- #查看進(jìn)程打開哪些文件
- lsof –p 4838
- #查看遠(yuǎn)程已打開的網(wǎng)絡(luò)鏈接
- lsof –i @192.168.34.128
perf
perf是Linux kernel自帶的系統(tǒng)性能優(yōu)化工具。優(yōu)勢在于與Linux Kernel的緊密結(jié)合,它可以最先應(yīng)用到加入Kernel的new feature,用于查看熱點函數(shù),查看cashe miss的比率,從而幫助開發(fā)者來優(yōu)化程序性能。
性能調(diào)優(yōu)工具如 perf,Oprofile 等的基本原理都是對被監(jiān)測對象進(jìn)行采樣,最簡單的情形是根據(jù) tick 中斷進(jìn)行采樣,即在 tick 中斷內(nèi)觸發(fā)采樣點,在采樣點里判斷程序當(dāng)時的上下文。假如一個程序 90% 的時間都花費在函數(shù) foo() 上,那么 90% 的采樣點都應(yīng)該落在函數(shù) foo() 的上下文中。運氣不可捉摸,但我想只要采樣頻率足夠高,采樣時間足夠長,那么以上推論就比較可靠。因此,通過 tick 觸發(fā)采樣,我們便可以了解程序中哪些地方最耗時間,從而重點分析。
匯總:結(jié)合以上常用的性能測試命令并聯(lián)系文初的性能分析工具的圖,就可以初步了解到性能分析過程中哪個方面的性能使用哪方面的工具(命令)。
常用的性能測試工具
熟練并精通了第二部分的性能分析命令工具,引入幾個性能測試的工具,介紹之前先簡單了解幾個性能測試工具:
perf_events
一款隨 Linux 內(nèi)核代碼一同發(fā)布和維護(hù)的性能診斷工具,由內(nèi)核社區(qū)維護(hù)和發(fā)展。Perf 不僅可以用于應(yīng)用程序的性能統(tǒng)計分析,也可以應(yīng)用于內(nèi)核代碼的性能統(tǒng)計和分析。
eBPF tools
一款使用bcc進(jìn)行的性能追蹤的工具,eBPF map可以使用定制的eBPF程序被廣泛應(yīng)用于內(nèi)核調(diào)優(yōu)方面,也可以讀取用戶級的異步代碼。重要的是這個外部的數(shù)據(jù)可以在用戶空間管理。這個k-v格式的map數(shù)據(jù)體是通過在用戶空間調(diào)用bpf系統(tǒng)調(diào)用創(chuàng)建、添加、刪除等操作管理的。
perf-tools:
一款基于 perf_events (perf) 和 ftrace 的Linux性能分析調(diào)優(yōu)工具集。Perf-Tools 依賴庫少,使用簡單。支持Linux 3.2 及以上內(nèi)核版本。
bcc(BPF Compiler Collection)
一款使用eBPF的perf性能分析工具。一個用于創(chuàng)建高效的內(nèi)核跟蹤和操作程序的工具包,包括幾個有用的工具和示例。利用擴展的BPF(伯克利數(shù)據(jù)包過濾器),正式稱為eBPF,一個新的功能,首先被添加到Linux 3.15。多用途需要Linux 4.1以上BCC。
ktap
一種新型的linux腳本動態(tài)性能跟蹤工具。允許用戶跟蹤Linux內(nèi)核動態(tài)。ktap是設(shè)計給具有互操作性,允許用戶調(diào)整操作的見解,排除故障和延長內(nèi)核和應(yīng)用程序。它類似于Linux和Solaris DTrace SystemTap。
Flame Graphs
是一款使用perf,system tap,ktap可視化的圖形軟件,允許最頻繁的代碼路徑快速準(zhǔn)確地識別,可以是使用github.com/brendangregg/flamegraph中的開發(fā)源代碼的程序生成。
Linux observability tools | Linux 性能觀測工具
首先學(xué)習(xí)的Basic Tool有如下:
uptime、top(htop)、mpstat、isstat、vmstat、free、ping、nicstat、dstat。
高級的命令如下:
sar、netstat、pidstat、strace、tcpdump、blktrace、iotop、slabtop、sysctl、/proc。
Linux benchmarking tools | Linux 性能測評工具
是一款性能測評工具,對于不同模塊的性能測試可以使用相應(yīng)的工具,想要深入了解,可以參考最下文的附件文檔。
Linux tuning tools | Linux 性能調(diào)優(yōu)工具
是一款性能調(diào)優(yōu)工具,主要是從linux內(nèi)核源碼層進(jìn)行的調(diào)優(yōu),想要深入了解,可以參考下文附件文檔。
Linux observability sar | linux性能觀測工具
sar(System Activity Reporter系統(tǒng)活動情況報告)是目前LINUX上最為全面的系統(tǒng)性能分析工具之一,可以從多方面對系統(tǒng)的活動進(jìn)行報告,包括:文件的讀寫情況、系統(tǒng)調(diào)用的使用情況、磁盤I/O、CPU效率、內(nèi)存使用狀況、進(jìn)程活動及IPC有關(guān)的活動等方面。
sar的常歸使用方式:
- sar [options] [-A] [-o file] t [n]
其中:
- t #為采樣間隔,n為采樣次數(shù),默認(rèn)值是1;
- -o file #表示將命令結(jié)果以二進(jìn)制格式存放在文件中,file 是文件名。
- options #為命令行選項