
【性能分析工具】
首先來看一張圖:
上圖是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指令的彙總區域顯示了五個方面的系統性能資訊:
1.負載:時間,登陸使用者數,系統平均負載;
2.程序:運作,睡眠,停止,僵屍;
3.cpu:使用者态,核心态,NICE,空閑,等待IO,中斷等;
4.記憶體:總量,已用,空閑(系統角度),緩沖,緩存;
5.交換分區:總量,已用,空閑
任務區域預設顯示:程序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 觸發采樣,我們便可以了解程式中哪些地方最耗時間,進而重點分析。
想要更深的了解本工具可以參考:
http://blog.csdn.net/trochiluses/article/details/10261339
彙總:結合以上常用的性能測試指令并聯系文初的性能分析工具的圖,就可以初步了解到性能分析過程中哪個方面的性能使用哪方面的工具(指令)。
【常用的性能測試工具】
熟練并精通了第二部分的性能分析指令工具,引入幾個性能測試的工具,介紹之前先簡單了解幾個性能測試工具:
▪ perf_events: 一款随 Linux 核心代碼一同釋出和維護的性能診斷工具,由核心社群維護和發展。Perf 不僅可以用于應用程式的性能統計分析,也可以應用于核心代碼的性能統計和分析。
更多參考:http://blog.sina.com.cn/s/blog_98822316010122ex.html。
▪ 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。
更多參考:https://github.com/iovisor/bcc#tools。
▪ ktap: 一種新型的linux腳本動态性能跟蹤工具。允許使用者跟蹤Linux核心動态。ktap是設計給具有互操作性,允許使用者調整操作的見解,排除故障和延長核心和應用程式。它類似于Linux和Solaris DTrace SystemTap。更多參考: https://github.com/ktap/ktap。
▪ Flame Graphs:是一款使用perf,system tap,ktap可視化的圖形軟體,允許最頻繁的代碼路徑快速準确地識别,可以是使用github.com/brendangregg/flamegraph中的開發源代碼的程式生成。
更多參考:http://www.brendangregg.com/flamegraphs.html。
一、 Linux observability tools | Linux 性能觀測工具
二、Linux Performance static, benchmarking, tuning Tools | Linux 靜态、性能測評、調優工具(3款共3圖)
三、Linux observability Tools:sar, perf-tools, bcc/BPF | linux性能觀測工具(sar, perf-tools, bcc/BPF)
四、observability + static + perf-tools/bcc 總結以上圖檔
更多參考: http://www.brendangregg.com/linuxperf.html
問題分析 2.1. CPU過高分析 1)使用TOP指令檢視CPU、記憶體使用狀态可以發現CPU占用主要分為兩部分,一部分為系統核心空間占用CPU百分比,一部分為使用者空間占用CPU百分比。其中CPU狀态中标示id的為空閑CPU百分比。當空閑CPU百分比越低,說明CPU占用率越高。 2)初步分析可以發現其中主要占用CPU的程序為java子程序jerrySsh服務(使用者通路資源使用的監聽服務),在使用者量不大的情況下,CPU消耗資源很大。根據研發回報字元網關設定的最大通路量可達到500/台,目前字元網關的資源使用現狀無法滿足設定的要求。 ● 分析手段 目前針對Linux下java程序占用CPU高的分析手段主要為使用linux指令查出高CPU使用的程序,前分析其是由于程序原因還是系統原因,在分析出為程序消耗過高CPU後列出占用CPU高和占用時間最長的線程并使用jdk自帶的jstack工具進行分析CPU使用分析 分析過程: 根據top指令,發現PID為13033的Java程序占用CPU %id 50%以上,占用CPU過高 找到該程序後,首先顯示線程清單,并按照CPU占用高的線程排序,指令為:ps mp 13033 -o THREAD,tid,time|sort -rn -k 2 找到了耗時最高的線程28358,占用CPU時間達8分多鐘。将需要的線程ID轉換為16進制格式,指令為:printf "%x\n" 28358 例如為:b0d 最後列印線程的堆棧資訊:jstack 2829|grep b0d -A 30 2.2. 記憶體使用分析 在linux的記憶體配置設定機制中,系統優先使用實體記憶體,當實體記憶體還有空閑,表示還夠用時,不會釋放其占用記憶體,即使占用記憶體的程式已經被關閉了,該程式所占用的記憶體用來做緩存使用,對于開啟過的程式、或是讀取剛存取過得資料會比較快,是以檢視目前程序正在實際被使用的記憶體(used-buffers-cache),也可以認為如果交換分區(swap)沒有大量使用,實體記憶體(mem)還是夠用的,隻有實體記憶體(mem)被目前程序實際占用完(沒有了buffers和cache),才會使用到交換分區(swap)。 但是從代碼的角度,目前研發人員主要關注java.lang.OutOfMemoryError: Java heap space異常,減少不必要的對象建立,同時避免記憶體洩漏,是以分析代碼才是我們接下來要做的主要工作;以下為字元網關分析記憶體占用的故障排查過程: ● 分析手段 top指令:Linux指令。可以檢視實時的記憶體使用情況。 jmap -histo:live [pid],然後分析具體的對象數目和占用記憶體大小,進而定位代碼。 jmap -dump:live,format=b,file=xxx.xxx [pid],然後利用MAT工具分析是否存在記憶體洩漏。 3. 總結分析手段 ● 分析CPU占用的方法和手段: top指令:可以檢視實時的CPU使用情況。 ps -ef指令:可以檢視程序以及程序中線程的目前CPU使用情況以及屬于目前狀态的采樣資料。 jstack:Java提供的指令。可以檢視某個程序的目前線程棧運作情況。根據這個指令的輸出可以定位某個程序的所有線程的目前運作狀态、運作代碼,以及是否死鎖等等。 pstack:Linux指令。可以檢視某個程序的目前線程棧運作情況 ● 分析記憶體性能的方法和技巧: top指令:可以檢視實時的記憶體使用情況。 jmap -histo:live [pid],然後分析具體的對象數目和占用記憶體大小,進而定位代碼。 jmap -dump:live,format=b,file=xxx.xxx [pid],然後利用MAT工具分析是否存在記憶體洩漏等等。
---------------------
作者:S-Gavin
源位址:https://www.cnblogs.com/zwh-Seeking/articles/11157399.html
著作權歸作者@S-Gavin所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處!!!
Linux系統中CPU占用率較高問題排查思路與解決方法
CPU使用率。根據經驗來看,使用者空間程序占用CPU比例在 65-70%之間,核心(系統)CPU比例在30%-35%之間,空閑比例在0%-5%之間。一般不能超過這個比例,超過這個比例,系統性能就會降低,平均負載升高,這點将會在下面的測試中看到。
程序上下文切換。上下文切換和CPU使用率應該聯系起來,如果CPU使用率低,那麼上下文切換稍高點也能接受。上下文切換也是需要消耗CPU資源的,頻繁的切換必将使得CPU使用率升高。
運作隊列中等待運作的程序數。每個CPU核心中等待處理的程序數不應該超過3個線程/程序。如4核心的機器,那麼隊列的最大值應該不超過12個。
對于CPU過載問題通常使用以下兩種方式即可快速定位(不能涵蓋所有特殊情況,請作為其中的參考排查思路):
一、排查分析
方法一(針對JAVA應用):
第一步:使用
top指令,然後按shift+p按照CPU排序
找到占用CPU過高的程序的pid
第二步:使用
top -H -p [程序id]
找到程序中消耗資源最高的線程的id
第三步:使用
echo \'obase=16;[線程id]\' | bc或者printf "%x\n" [線程id]
将線程id轉換為16進制(字母要小寫)
bc是linux的電腦指令
第四步(此步驟可以和相對應的java開發進行一起排查):執行
jstack [程序id] |grep -A 10 [線程id的16進制]”
檢視線程狀态資訊
二、kswapd0 程序占用 CPU 較高
作業系統都用分頁機制來管理實體記憶體,作業系統将磁盤的一部分劃出來作為虛拟記憶體,由于記憶體的速度要比磁盤快得多,是以作業系統要按照某種換頁機制将不需要的頁面換到磁盤中,将需要的頁面調到記憶體中,由于記憶體持續不足,這個換頁動作持續進行,kswapd0 是虛拟記憶體管理中負責換頁的,當伺服器記憶體不足的時候 kswapd0 會執行換頁操作,這個換頁操作是十分消耗主機 CPU 資源的。如果通過 top 發現該程序持續處于非睡眠狀态,且運作時間較長,可以初步判定系統在持續的進行換頁操作,可以将問題轉向記憶體不足的原因來排查。
問題描述:
kswapd0 程序占用了系統大量 CPU 資源。
處理辦法:
Linux 系統通過分頁機制管理記憶體的同時,将磁盤的一部分劃出來作為虛拟記憶體。而 kswapd0 是 Linux 系統虛拟記憶體管理中負責換頁的程序。當系統記憶體不足時,kswapd0 會頻繁的進行換頁操作。而由于換頁操作非常消耗 CPU 資源,是以會導緻該程序持續占用較高 CPU 資源。
如果通過 top 等監控發現 kswapd0 程序持續處于非睡眠狀态,且運作時間較長并持續占用較高 CPU 資源,則通常是由于系統在持續的進行換頁操作所緻。則可以通過 free 、ps 等指令進一步查詢系統及系統内程序的記憶體占用情況,做進一步排查分析。