Linux常見的內存分析工具


 

 

【性能分析工具】

首先來看一張圖:

上圖是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 等指令進一步查詢系統及系統內進程的內存占用情況,做進一步排查分析。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM