出于對linux作業系統的興趣,以及對底層知識的強烈欲望,是以整理了這篇文章。本文也可以作為檢驗基礎知識的名額,另外文章涵蓋了一個系統的方方面面。如果沒有完善的計算機系統知識,網絡知識和作業系統知識,文檔中的工具,是不可能完全掌握的,另外對系統性能分析和優化是一個長期的系列。
本文檔主要是結合linux 大牛,netflix 進階性能架構師 brendan gregg 更新 linux 性能調優工具的博文,搜集linux系統性能優化相關文章整理後的一篇綜合性文章,主要是結合博文對涉及到的原理和性能測試的工具展開說明。
背景知識:具備背景知識是分析性能問題時需要了解的。比如硬體 cache;再比如作業系統核心。應用程式的行為細節往往是和這些東西互相牽扯的,這些底層的東西會以意想不到的方式影響應用程式的性能,比如某些程式無法充分利用 cache,進而導緻性能下降。比如不必要地調用過多的系統調用,造成頻繁的核心 / 使用者切換等。這裡隻是為本文的後續内容做一些鋪墊,關于調優還有很多東西,我所不知道的比知道的要多的多,希望大家能共同學習進步。
性能分析工具
首先來看一張圖:
上圖是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和cacher也無濟于事,大量使用交換分區(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系統調用建立、添加、删除等操作管理的。more: http://blog.csdn.net/ljy1988123/article/details/50444693。
perf-tools: 一款基于 perf_events (perf) 和 ftrace 的linux性能分析調優工具集。perf-tools 依賴庫少,使用簡單。支援linux 3.2 及以上核心版本。more: https://github.com/brendangregg/perf-tools。
bcc(bpf compiler collection): 一款使用ebpf的perf性能分析工具。一個用于建立高效的核心跟蹤和操作程式的工具包,包括幾個有用的工具和示例。利用擴充的bpf(伯克利資料包過濾器),正式稱為ebpf,一個新的功能,首先被添加到linux 3.15。多用途需要linux 4.1以上bcc。
ktap: 一種新型的linux腳本動态性能跟蹤工具。允許使用者跟蹤linux核心動态。ktap是設計給具有互操作性,允許使用者調整操作的見解,排除故障和延長核心和應用程式。它類似于linux和solaris dtrace systemtap。更多參考: https://github.com/ktap/ktap。
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 為指令行選項
本文作者:佚名
來源:51cto