轉(zhuǎn)載于 https://mp.weixin.qq.com/s/TAEbKtDgamabRfnV6g8GGA
性能分析工具
[圖片上傳失敗...(image-fca4e0-1691563723989)]
上圖是Brendan Gregg 的一次性能分析的分享雷厂,
這里面的所有工具都可以通過 man 來(lái)獲得它的幫助文檔职恳,下面簡(jiǎn)單介紹介紹一下常規(guī)的用法:
vmstat–虛擬內(nèi)存統(tǒng)計(jì)
vmstat(VirtualMeomoryStatistics挖诸,虛擬內(nèi)存統(tǒng)計(jì))是 Linux 中監(jiān)控內(nèi)存的常用工具,可對(duì)操作系統(tǒng)的虛擬內(nèi)存锌蓄、進(jìn)程、CPU 等的整體情況進(jìn)行監(jiān)視渐扮。vmstat 的常規(guī)用法:vmstat interval times 即每隔 interval 秒采樣一次柑贞,共采樣 times 次,如果省略 times孔厉,則一直采集數(shù)據(jù)拯钻,直到用戶手動(dòng)停止為止。簡(jiǎn)單舉個(gè)例子:
[圖片上傳失敗...(image-e87f53-1691563576909)]
可以使用 ctrl+c 停止 vmstat 采集數(shù)據(jù)撰豺。
第一行顯示了系統(tǒng)自啟動(dòng)以來(lái)的平均值粪般,第二行開始顯示現(xiàn)在正在發(fā)生的情況,接下來(lái)的行會(huì)顯示每5秒間隔發(fā)生了什么污桦,每一列的含義在頭部亩歹,如下所示:
- procs:r 這一列顯示了多少進(jìn)程在等待cpu,b列顯示多少進(jìn)程正在不可中斷的休眠(等待IO)。
- memory:swapd 列顯示了多少塊被換出了磁盤(頁(yè)面交換)小作,剩下的列顯示了多少塊是空閑的(未被使用)亭姥,多少塊正在被用作緩沖區(qū),以及多少正在被用作操作系統(tǒng)的緩存躲惰。
- swap:顯示交換活動(dòng):每秒有多少塊正在被換入(從磁盤)和換出(到磁盤)致份。
- io:顯示了多少塊從塊設(shè)備讀取(bi)和寫出(bo),通常反映了硬盤I/O础拨。
- system:顯示每秒中斷(in)和上下文切換(cs)的數(shù)量氮块。
- cpu:顯示所有的cpu時(shí)間花費(fèi)在各類操作的百分比,包括執(zhí)行用戶代碼(非內(nèi)核)诡宗,執(zhí)行系統(tǒng)代碼(內(nèi)核)滔蝉,空閑以及等待IO。
內(nèi)存不足的表現(xiàn):free memory 急劇減少塔沃,回收 buffer 和 cache 也無(wú)濟(jì)于事蝠引,大量使用交換分區(qū)(swpd),頁(yè)面交換(swap)頻繁,讀寫磁盤數(shù)量(io)增多蛀柴,缺頁(yè)中斷(in)增多螃概,上下文切換(cs)次數(shù)增多,等待IO的進(jìn)程數(shù)(b)增多鸽疾,大量CPU時(shí)間用于等待IO(wa)
iostat–用于報(bào)告中央處理器統(tǒng)計(jì)信息
iostat 用于報(bào)告中央處理器(CPU)統(tǒng)計(jì)信息和整個(gè)系統(tǒng)吊洼、適配器、tty 設(shè)備制肮、磁盤和 CD-ROM 的輸入/輸出統(tǒng)計(jì)信息冒窍,默認(rèn)顯示了與 vmstat 相同的 cpu 使用信息,使用以下命令顯示擴(kuò)展的設(shè)備統(tǒng)計(jì):
[圖片上傳失敗...(image-993653-1691563576908)]
第一行顯示的是自系統(tǒng)啟動(dòng)以來(lái)的平均值豺鼻,然后顯示增量的平均值综液,每個(gè)設(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:每秒合并的讀和寫請(qǐng)求乞而,“合并的”意味著操作系統(tǒng)從隊(duì)列中拿出多個(gè)邏輯請(qǐng)求合并為一個(gè)請(qǐng)求到實(shí)際磁盤送悔。
- r/s和w/s:每秒發(fā)送到設(shè)備的讀和寫請(qǐng)求數(shù)。
- rsec/s和wsec/s:每秒讀和寫的扇區(qū)數(shù)。
- avgrq –sz:請(qǐng)求的扇區(qū)數(shù)欠啤。
- avgqu –sz:在設(shè)備隊(duì)列中等待的請(qǐng)求數(shù)荚藻。
- await:每個(gè)IO請(qǐng)求花費(fèi)的時(shí)間。
- svctm:實(shí)際請(qǐng)求(服務(wù))時(shí)間洁段。
- %util:至少有一個(gè)活躍請(qǐng)求所占時(shí)間的百分比应狱。
dstat--系統(tǒng)監(jiān)控工具
dstat 顯示了 cpu 使用情況,磁盤 io 情況祠丝,網(wǎng)絡(luò)發(fā)包情況和換頁(yè)情況疾呻,輸出是彩色的,可讀性較強(qiáng)写半,相對(duì)于 vmstat 和iostat 的輸入更加詳細(xì)且較為直觀岸蜗。在使用時(shí),直接輸入命令即可叠蝇,當(dāng)然也可以使用特定參數(shù)璃岳。
如下:dstat –cdlmnpsy
[圖片上傳失敗...(image-9d4efb-1691563576908)]
iotop--LINUX進(jìn)程實(shí)時(shí)監(jiān)控工具
iotop命令是專門顯示硬盤IO的命令,界面風(fēng)格類似top命令悔捶,可以顯示IO負(fù)載具體是由哪個(gè)進(jìn)程產(chǎn)生的铃慷。是一個(gè)用來(lái)監(jiān)視磁盤I/O使用狀況的top類工具,具有與top相似的UI蜕该,其中包括PID犁柜、用戶、I/O蛇损、進(jìn)程等相關(guān)信息赁温。
可以以非交互的方式使用:
iotop –bod interval
pidstat--監(jiān)控系統(tǒng)資源情況
pidstat 主要用于監(jiān)控全部或指定進(jìn)程占用系統(tǒng)資源的情況,如 CPU,內(nèi)存、設(shè)備 IO淤齐、任務(wù)切換股囊、線程等。
使用方法:
pidstat –d interval
pidstat 還可以用以統(tǒng)計(jì)CPU使用信息:
pidstat –u interval
統(tǒng)計(jì)內(nèi)存信息:
pidstat –r interval
top
- top 命令的匯總區(qū)域顯示了五個(gè)方面的系統(tǒng)性能信息:
- 負(fù)載:時(shí)間更啄,登陸用戶數(shù)稚疹,系統(tǒng)平均負(fù)載;
- 進(jìn)程:運(yùn)行祭务,睡眠内狗,停止,僵尸义锥;
- cpu:用戶態(tài)柳沙,核心態(tài),NICE,空閑拌倍,等待IO,中斷等赂鲤;
- 內(nèi)存:總量噪径,已用,空閑(系統(tǒng)角度)数初,緩沖找爱,緩存;
- 交換分區(qū):總量泡孩,已用车摄,空閑
任務(wù)區(qū)域默認(rèn)顯示:進(jìn)程 ID,有效用戶仑鸥,進(jìn)程優(yōu)先級(jí)吮播,NICE 值,進(jìn)程使用的虛擬內(nèi)存锈候,物理內(nèi)存和共享內(nèi)存薄料,進(jìn)程狀態(tài),CPU 占用率泵琳,內(nèi)存占用率摄职,累計(jì) CPU 時(shí)間,進(jìn)程命令行信息获列。
htop
htop 是 Linux 系統(tǒng)中的一個(gè)互動(dòng)的進(jìn)程查看器,一個(gè)文本模式的應(yīng)用程序(在控制臺(tái)或者X終端中),需要 ncurses谷市。
[圖片上傳失敗...(image-85d739-1691563576908)]
htop 可讓用戶交互式操作,支持顏色主題击孩,可橫向或縱向滾動(dòng)瀏覽進(jìn)程列表迫悠,并支持鼠標(biāo)操作。
與 top 相比巩梢,htop 有以下優(yōu)點(diǎn):
- 可以橫向或者縱向滾動(dòng)瀏覽進(jìn)程列表创泄,以便看到所有的進(jìn)程和完整的命令行。
- 在啟動(dòng)上括蝠,比top更快鞠抑。
- 殺進(jìn)程時(shí)不需要輸入進(jìn)程號(hào)。
- htop支持鼠標(biāo)操作忌警。
mpstat
mpstat 是 Multiprocessor Statistics的縮寫搁拙,是實(shí)時(shí)系統(tǒng)監(jiān)控工具。其報(bào)告CPU的一些統(tǒng)計(jì)信息法绵,這些信息存放在 /proc/stat 文件中箕速。在多 CPUs 系統(tǒng)里,其不但能查看所有 CPU 的平均狀況信息朋譬,而且能夠查看特定 CPU 的信息盐茎。常見用法:
mpstat –P ALL interval times
netstat
netstat 用于顯示與 IP、TCP徙赢、UDP和 ICMP 協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù)字柠,一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況滑进。
常見用法:
netstat –npl # 可以查看你要打開的端口是否已經(jīng)打開。
netstat –rn # 打印路由表信息募谎。
netstat –in # 提供系統(tǒng)上的接口信息,打印每個(gè)接口的MTU,輸入分
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)用及接收到的信號(hào)数冬,幫助分析程序或命令執(zhí)行中遇到的異常情況。
舉例:查看 mysqld 在 linux 上加載哪種配置文件搀庶,可以通過運(yùn)行下面的命令:
strace –e stat64 mysqld –print –defaults > /dev/null
uptime
能夠打印系統(tǒng)總共運(yùn)行了多長(zhǎng)時(shí)間和系統(tǒng)的平均負(fù)載拐纱,uptime 命令最后輸出的三個(gè)數(shù)字的含義分別是 1分鐘,5分鐘哥倔,15分鐘內(nèi)系統(tǒng)的平均負(fù)荷秸架。
lsof
lsof(list open files)是一個(gè)列出當(dāng)前系統(tǒng)打開文件的工具。通過 lsof 工具能夠查看這個(gè)列表對(duì)系統(tǒng)檢測(cè)及排錯(cuò)咆蒿,常見的用法:
查看文件系統(tǒng)阻塞
lsof /boot
查看端口號(hào)被哪個(gè)進(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)勢(shì)在于與 Linux Kernel 的緊密結(jié)合,它可以最先應(yīng)用到加入 Kernel 的new feature沃测,用于查看熱點(diǎn)函數(shù)缭黔,查看 cashe miss 的比率,從而幫助開發(fā)者來(lái)優(yōu)化程序性能蒂破。
性能調(diào)優(yōu)工具如 perf馏谨,Oprofile 等的基本原理都是對(duì)被監(jiān)測(cè)對(duì)象進(jìn)行采樣,最簡(jiǎn)單的情形是根據(jù) tick 中斷進(jìn)行采樣附迷,即在 tick 中斷內(nèi)觸發(fā)采樣點(diǎn)惧互,在采樣點(diǎn)里判斷程序當(dāng)時(shí)的上下文。
假如一個(gè)程序 90% 的時(shí)間都花費(fèi)在函數(shù) foo() 上喇伯,那么 90% 的采樣點(diǎn)都應(yīng)該落在函數(shù) foo() 的上下文中喊儡。運(yùn)氣不可捉摸,但我想只要采樣頻率足夠高艘刚,采樣時(shí)間足夠長(zhǎng)管宵,那么以上推論就比較可靠。因此攀甚,通過 tick 觸發(fā)采樣箩朴,我們便可以了解程序中哪些地方最耗時(shí)間,從而重點(diǎn)分析秋度。
匯總
結(jié)合以上常用的性能測(cè)試命令并聯(lián)系文初的性能分析工具的圖炸庞,就可以初步了解到性能分析過程中哪個(gè)方面的性能使用哪方面的工具(命令)
常用的性能測(cè)試工具
熟練并精通了第二部分的性能分析命令工具,引入幾個(gè)性能測(cè)試的工具荚斯,介紹之前先簡(jiǎn)單了解幾個(gè)性能測(cè)試工具:
- perf_events:一款隨 Linux 內(nèi)核代碼一同發(fā)布和維護(hù)的性能診斷工具埠居,由內(nèi)核社區(qū)維護(hù)和發(fā)展查牌。Perf 不僅可以用于應(yīng)用程序的性能統(tǒng)計(jì)分析,也可以應(yīng)用于內(nèi)核代碼的性能統(tǒng)計(jì)和分析滥壕。
- eBPF tools:一款使用 bcc 進(jìn)行的性能追蹤的工具纸颜,eBPF map可以使用定制的 eBPF 程序被廣泛應(yīng)用于內(nèi)核調(diào)優(yōu)方面,也可以讀取用戶級(jí)的異步代碼绎橘。重要的是這個(gè)外部的數(shù)據(jù)可以在用戶空間管理胁孙。這個(gè) 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 依賴庫(kù)少冈止,使用簡(jiǎn)單狂票。支持Linux 3.2 及以上內(nèi)核版本。
- bcc(BPF Compiler Collection)::一款使用 eBP F的 perf 性能分析工具熙暴。一個(gè)用于創(chuàng)建高效的內(nèi)核跟蹤和操作程序的工具包闺属,包括幾個(gè)有用的工具和示例。利用擴(kuò)展的BPF(伯克利數(shù)據(jù)包過濾器)周霉,正式稱為eBPF屋剑,一個(gè)新的功能,首先被添加到Linux 3.15诗眨。多用途需要Linux 4.1以上BCC唉匾。
- ktap:一種新型的linux腳本動(dòng)態(tài)性能跟蹤工具。允許用戶跟蹤Linux內(nèi)核動(dòng)態(tài)匠楚。ktap是設(shè)計(jì)給具有互操作性巍膘,允許用戶調(diào)整操作的見解,排除故障和延長(zhǎng)內(nèi)核和應(yīng)用程序芋簿。它類似于Linux和Solaris DTrace SystemTap峡懈。
- Flame Graphs:是一款使用 perf,system tap与斤,ktap 可視化的圖形軟件肪康,允許最頻繁的代碼路徑快速準(zhǔn)確地識(shí)別,可以是使用
[github.com/brendangregg/flamegraph](http://github.com/brendangregg/flamegraph)
中的開發(fā)源代碼的程序生成
Linux 性能觀測(cè)工具
[圖片上傳失敗...(image-5c866a-1691563576908)]
- 首先學(xué)習(xí)的Basic Tool有如下:uptime撩穿、top(htop)磷支、mpstat、isstat食寡、vmstat雾狈、free、ping抵皱、nicstat善榛、dstat辩蛋。
- 高級(jí)的命令如下:sar、netstat移盆、pidstat悼院、strace、tcpdump咒循、blktrace樱蛤、iotop、slabtop剑鞍、sysctl、/proc爽醋。
Linux 性能測(cè)評(píng)工具
[圖片上傳失敗...(image-c12a64-1691563576908)]
上圖是一些性能測(cè)評(píng)工具蚁署,對(duì)于不同模塊的性能測(cè)試可以使用相應(yīng)的工具。
Linux 性能調(diào)優(yōu)工具
[圖片上傳失敗...(image-d8c8af-1691563576908)]
上圖中是一些性能調(diào)優(yōu)工具蚂四,主要是從linux內(nèi)核源碼層進(jìn)行的調(diào)優(yōu)光戈。
linux性能觀測(cè)工具sar
[圖片上傳失敗...(image-e59ae3-1691563576908)]
sar(System Activity Reporter系統(tǒng)活動(dòng)情況報(bào)告)是目前LINUX上最為全面的系統(tǒng)性能分析工具之一,可以從多方面對(duì)系統(tǒng)的活動(dòng)進(jìn)行報(bào)告遂赠,包括:文件的讀寫情況久妆、系統(tǒng)調(diào)用的使用情況、磁盤I/O跷睦、CPU效率筷弦、內(nèi)存使用狀況、進(jìn)程活動(dòng)及IPC 有關(guān)的活動(dòng)等方面抑诸。sar 的常規(guī)使用方式:
sar [options] [-A] [-o file] t [n]
其中:t 為采樣間隔烂琴,n 為采樣次數(shù),默認(rèn)值是1蜕乡;-o file 表示將命令結(jié)果以二進(jìn)制格式存放在文件中奸绷,file 是文件名。