作者: 董西孝
來源: https://rdc.hundsun.com/portal/article/731.html?ref=myread
出於對Linux作業系統的興趣,以及對底層知識的強烈欲望,因此整理了這篇文章。本文也可以作為檢驗基礎知識的指標,另外文章涵蓋了一個系統的方方面面。如果沒有完善的電腦系統知識,網路知識和作業系統知識,文件中的工具,是不可能完全掌握的,另外對系統效能分析和最佳化是一個長期的系列。
本文件主要是結合Linux 大牛,Netflix 高級效能架構師 Brendan Gregg 更新 Linux 效能調優工具的博文,搜集Linux系統效能最佳化相關文章整理後的一篇綜合性文章,主要是結合博文對涉及到的原理和效能測試的工具展開說明。
背景知識:具備背景知識是分析效能問題時需要了解的。比如硬體 cache;再比如作業系統內核。應用程式的行為細節往往是和這些東西互相牽扯的,這些底層的東西會以意想不到的方式影響應用程式的效能,比如某些程式無法充分利用 cache,從而導致效能下降。比如不必要地呼叫過多的系統呼叫,造成頻繁的內核 / 使用者切換等。
效能分析工具
首先來看一張圖:
vmstat--虛擬記憶體統計
vmstat(VirtualMeomoryStatistics,虛擬記憶體統計)是 Linux 中監控記憶體的常用工具,可對作業系統的虛擬記憶體、行程、CPU 等的整體情況進行監視。vmstat 的常規用法:
vmstat interval times
即每隔
interval
秒采樣一次,共采樣
times
次,如果省略
times
,則一直采集數據,直到使用者手動停止為止。簡單舉個例子:
可以使用
ctrl+c
停止
vmstat
采集數據。
第一行顯示了系統自啟動以來的平均值,第二行開始顯示現在正在發生的情況,接下來的行會顯示每5秒間隔發生了什麽,每一列的含義在頭部,如下所示:
procs:r 這一列顯示了多少行程在等待cpu,b列顯示多少行程正在不可中斷的休眠(等待IO)。
memory:swapd 列顯示了多少塊被換出了磁盤(頁面交換),剩下的列顯示了多少塊是空閑的(未被使用),多少塊正在被用作緩沖區,以及多少正在被用作作業系統的緩存。
swap:顯示交換活動:每秒有多少塊正在被換入(從磁盤)和換出(到磁盤)。
io:顯示了多少塊從塊裝置讀取(bi)和寫出(bo),通常反映了硬碟I/O。
system:顯示每秒中斷(in)和上下文切換(cs)的數量。
cpu:顯示所有的cpu時間花費在各類操作的百分比,包括執行使用者程式碼(非內核),執行系統程式碼(內核),空閑以及等待IO。
記憶體不足的表現:free memory 急劇減少,回收 buffer 和 cache 也無濟於事,大量使用交換分區(swpd),頁面交換(swap)頻繁,讀寫磁盤數量(io)增多,缺頁中斷(in)增多,上下文切換(cs)次數增多,等待IO的行程數(b)增多,大量CPU時間用於等待IO(wa)
iostat--用於報告中央處理器統計資訊
iostat 用於報告中央處理器(CPU)統計資訊和整個系統、介面卡、tty 裝置、磁盤和 CD-ROM 的輸入/輸出統計資訊,預設顯示了與 vmstat 相同的 cpu 使用資訊,使用以下命令顯示擴充套件的裝置統計:
第一行顯示的是自系統啟動以來的平均值,然後顯示增量的平均值,每個裝置一行。
常見 linux 的磁盤 IO 指標的縮寫習慣:rq 是 request,r 是 read,w 是 write,qu 是 queue,sz 是 size,a 是verage,tm 是 time,svc 是 service。
rrqm/s 和 wrqm/s:每秒合並的讀和寫請求,「合並的」意味著作業系統從佇列中拿出多個邏輯請求合並為一個請求到實際磁盤。
r/s和w/s:每秒發送到裝置的讀和寫請求數。
rsec/s和wsec/s:每秒讀和寫的磁區數。
avgrq –sz:請求的磁區數。
avgqu –sz:在裝置佇列中等待的請求數。
await:每個IO請求花費的時間。
svctm:實際請求(服務)時間。
%util:至少有一個活躍請求所占時間的百分比。
dstat--系統監控工具
dstat 顯示了 cpu 使用情況,磁盤 io 情況,網路發包情況和換頁情況,輸出是彩色的,可讀性較強,相對於 vmstat 和iostat 的輸入更加詳細且較為直觀。在使用時,直接輸入命令即可,當然也可以使用特定參數。
如下:
dstat –cdlmnpsy
iotop--LINUX行程即時監控工具
iotop命令是專門顯示硬碟IO的命令,界面風格類似top命令,可以顯示IO負載具體是由哪個行程產生的。是一個用來監視磁盤I/O使用狀況的top類工具,具有與top相似的UI,其中包括PID、使用者、I/O、行程等相關資訊。
可以以非互動的方式使用:
iotop –bod interval
檢視每個行程的
I/O
,可以使用
pidstat,pidstat –d instat
pidstat--監控系統資源情況
pidstat 主要用於監控全部或指定行程占用系統資源的情況,如 CPU,記憶體、裝置 IO、工作切換、執行緒等。
使用方法:
pidstat –d interval
pidstat 還可以用以統計CPU使用資訊:
pidstat –u interval
統計記憶體資訊:
pidstat –r interval
top
top 命令的匯總區域顯示了五個方面的系統效能資訊:
負載:時間,登陸使用者數,系統平均負載;
行程:執行,睡眠,停止,僵屍;
cpu:使用者態,核心態,NICE,空閑,等待IO,中斷等;
記憶體:總量,已用,空閑(系統角度),緩沖,緩存;
交換分區:總量,已用,空閑
任務區域預設顯示:行程 ID,有效使用者,行程優先級,NICE 值,行程使用的虛擬記憶體,實體記憶體和共享記憶體,行程狀態,CPU 占用率,記憶體占用率,累計 CPU 時間,行程命令列資訊。
htop
htop 是 Linux 系統中的一個互動的行程檢視器,一個文本模式的應用程式(在控制台或者X終端中),需要 ncurses。
Htop 可讓使用者互動式操作,支持顏色主題,可橫向或縱向捲動瀏覽行程列表,並支持滑鼠操作。
與 top 相比,htop 有以下優點:
可以橫向或者縱向捲動瀏覽行程列表,以便看到所有的行程和完整的命令列。
在啟動上,比top更快。
殺行程時不需要輸入行程號。
htop支持滑鼠操作。
mpstat
mpstat 是 Multiprocessor Statistics的縮寫,是即時系統監控工具。其報告CPU的一些統計資訊,這些資訊存放在
/proc/stat
檔中。在多 CPUs 系統裏,其不但能檢視所有 CPU 的平均狀況資訊,而且能夠檢視特定 CPU 的資訊。常見用法:
mpstat –P ALL interval times
netstat
netstat 用於顯示與 IP、TCP、UDP和 ICMP 協定相關的統計數據,一般用於檢驗本機各埠的網路連線情況。
常見用法:
netstat –npl # 可以檢視你要開啟的埠是否已經開啟。
netstat –rn # 打印路由表資訊。
netstat –in# 提供系統上的介面資訊,打印每個介面的MTU,輸入分組數,輸入錯誤,輸出分組數,輸出錯誤,沖突以及當前的輸出佇列的長度。
ps--顯示當前行程的狀態
ps 參數太多,具體使用方法可以參考
man ps
常用的方法:
ps aux #hsserver
ps –ef |grep #hundsun
殺掉某一程式的方法:
ps aux | grep mysqld | grep –v grep | awk ‘{print$2 }’ xargs kill -9
殺掉僵屍行程:
ps –eal | awk ‘{if ($2 == 「Z」){print$4}}’ | xargs kill -9
strace
跟蹤程式執行過程中產生的系統呼叫及接收到的訊號,幫助分析程式或命令執行中遇到的異常情況。
舉例:檢視 mysqld 在 linux 上載入哪種配置檔,可以透過執行下面的命令:
strace –e stat64 mysqld –print –defaults > /dev/null
uptime
能夠打印系統總共執行了多長時間和系統的平均負載,uptime 命令最後輸出的三個數位的含義分別是 1分鐘,5分鐘,15分鐘內系統的平均負荷。
lsof
lsof(list open files)是一個列出當前系統開啟檔的工具。透過 lsof 工具能夠檢視這個列表對系統檢測及排錯,常見的用法:
檢視檔案系統阻塞
lsof /boot
檢視埠號被哪個行程占用
lsof -i : 3306
檢視使用者開啟哪些檔
lsof –u username
檢視行程開啟哪些檔
lsof –p 4838
檢視遠端已開啟的網路連結
lsof –i @192.168.34.128
perf
perf 是 Linux kernel 內建的系統效能最佳化工具。優勢在於與 Linux Kernel 的緊密結合,它可以最先套用到加入 Kernel 的new feature,用於檢視熱點函式,檢視 cashe miss 的比率,從而幫助開發者來最佳化程式效能。
效能調優工具如 perf,Oprofile 等的基本原理都是對被監測物件進行采樣,最簡單的情形是根據 tick 中斷進行采樣,即在 tick 中斷內觸發采樣點,在采樣點裏判斷程式當時的上下文。
假如一個程式 90% 的時間都花費在函式 foo() 上,那麽 90% 的采樣點都應該落在函式 foo() 的上下文中。運氣不可捉摸,但我想只要采樣頻率足夠高,采樣時間足夠長,那麽以上推論就比較可靠。因此,透過 tick 觸發采樣,我們便可以了解程式中哪些地方最耗時間,從而重點分析。
匯總
結合以上常用的效能測試命令並聯系文初的效能分析工具的圖,就可以初步了解到效能分析過程中哪個方面的效能使用哪方面的工具(命令)。
常用的效能測試工具
熟練並精通了第二部份的效能分析命令工具,引入幾個效能測試的工具,介紹之前先簡單了解幾個效能測試工具:
perf_events:一款隨 Linux 內核程式碼一同釋出和維護的效能診斷工具,由內核社群維護和發展。Perf 不僅可以用於應用程式的效能統計分析,也可以套用於內核程式碼的效能統計和分析。
eBPF tools:一款使用 bcc 進行的效能追蹤的工具,eBPF map可以使用客製的 eBPF 程式被廣泛套用於內核調優方面,也可以讀取使用者級的異步程式碼。重要的是這個外部的數據可以在使用者空間管理。這個 k-v 格式的 map 數據體是透過在使用者空間呼叫 bpf 系統呼叫建立、添加、刪除等操作管理的。
perf-tools:一款基於 perf_events (perf) 和 ftrace 的Linux效能分析調優工具集。Perf-Tools 依賴庫少,使用簡單。支持Linux 3.2 及以上內核版本。
bcc(BPF Compiler Collection)::一款使用 eBP F的 perf 效能分析工具。一個用於建立高效的內核跟蹤和操作程式的工具包,包括幾個有用的工具和範例。利用擴充套件的BPF(柏克萊封包過濾器),正式稱為eBPF,一個新的功能,首先被添加到Linux 3.15。多用途需要Linux 4.1以上BCC。
ktap:一種新型的linux指令碼動態效能跟蹤工具。允許使用者跟蹤Linux內核動態。ktap是設計給具有互操作性,允許使用者調整操作的見解,排除故障和延長內核和應用程式。它類似於Linux和Solaris DTrace SystemTap。
Flame Graphs:是一款使用 perf,system tap,ktap 視覺化的圖形軟體,允許最頻繁的程式碼路徑快速準確地辨識,可以是使用
github.com/brendangregg/flamegraph
中的開發原始碼的程式生成。
Linux observability tools | Linux 效能觀測工具
首先學習的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 效能測評工具
是一款效能測評工具,對於不同模組的效能測試可以使用相應的工具。
Linux tuning tools | Linux 效能調優工具
是一款效能調優工具,主要是從linux內核源碼層進行的調優。
Linux observability sar | linux效能觀測工具
sar(System Activity Reporter系統活動情況報告)是目前LINUX上最為全面的系統效能分析工具之一,可以從多方面對系統的活動進行報告,包括:檔的讀寫情況、系統呼叫的使用情況、磁盤I/O、CPU效率、記憶體使用狀況、行程活動及IPC 有關的活動等方面。sar 的常規使用方式:
sar [options] [-A] [-o file] t [n]
其中:t 為采樣間隔,n 為采樣次數,預設值是1;-o file 表示將命令結果以二進制格式存放在檔中,file 是檔名。options 為命令列選項。
<END>
點這裏👇關註我,記得標星呀~
感謝你的分享,點贊,在看三連