本文檔主要是結合 Linux 大牛,Netflix 高級性能架構師 Brendan Gregg 更新 Linux 性能調優工具的博文,搜集 Linux 系統性能優化相關文章整理后的一篇綜合性文章,主要是結合博文對涉及到的原理和性能測試的工具展開說明。
背景知識:具備背景知識是分析性能問題時需要了解的。比如硬件 cache;再比如操作系統內核。應用程序的行為細節往往是和這些東西互相牽扯的,這些底層的東西會以意想不到的方式影響應用程序的性能,比如某些程序無法充分利用 cache,從而導致性能下降。比如不必要地調用過多的系統調用,造成頻繁的內核 / 用戶切換等。這里只是為本文的后續內容做一些鋪墊,關于調優還有很多東西,我所不知道的比知道的要多的多,希望大家能共同學習進步。
原文:https://rdc.hundsun.com/portal/article/731.html?ref=myread
性能分析工具
首先來看一張圖:

上圖是 Brendan Gregg 的一次性能分析的分享,這里面的所有工具都可以通過man來獲得它的幫助文檔,下面簡單介紹介紹一下常規的用法:
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

img
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。

img
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 為命令行選項
CNCERT國家工程研究中心
LemonSec
LemonSec
信息安全與通信保密雜志社
看雪學苑
LemonSec
一顆小胡椒
一顆小胡椒
一顆小胡椒
安全圈
CNCERT國家工程研究中心
系統安全運維