天天看點

linux性能異常定位之程序級别

【前言】

     本文和大家分享:linux系統下常見得性能異常,怎樣定位到程序級别。說簡單點,就是:linux性能出問題了,我們需要确定哪些程序影響了linux的性能。

     本文主要涉及的linux的常見的性能次元:cpu,記憶體,io,網絡

【涉及工具】

top:綜合,偏cpu,記憶體

dstat:綜合、磁盤

iostat:磁盤io,全局

iotop:磁盤io,精确到程序,(類似工具還有pidstat)

iftop:網絡、實時重新整理(類似工具還有nload,ifstat)

nethogs:程序級别的流量

ss:網絡、快、消耗資源低(替代netstat)

pidstat:綜合的

free:額,記憶體。。。

【cpu】

cpu主要關注性能名額:

(1)cpu使用率:使用者,系統等

(2)cpu累計使用時長

(3)中斷,上下文切換等(使用不多)

就cpu性能名額的觀察而言,其實有很多工具,這裡主要介紹top和dstat

1、top

top各行結果我就不詳細介紹了,是用起來也比較簡單。對于排查cpu是用率過高,比較關鍵的指令是P和T。

輸入了P(冒号P)之後:按照cpu排序

輸入T(冒号T):根據時間、累計時間排序,可檢視哪些程序消耗曆史消耗多

這樣我們就能找到哪個程序占用cpu過高了。

下例:就發現ntpd腳本占用的cpu時間是最多的,目前的ntpd占用cpu使用率也較大(其實隻有1.3%)

linux性能異常定位之程式級别

另外:還可以輸入以下便捷指令

1:多核

m:是否顯示記憶體資訊

M:根據記憶體排序

H:shift+h,打開線程模式

x:列的高亮(先要按b)

shift+<或者shift+>改變排序的行

2、dstat指令

dstat也是一個比較綜合的工具

這裡用來找到cpu暫用率最高的參數如下

dstat -lcm --top-cpu

下圖可以看到,ntpd(時間服務)和zabbix的agent消耗cpu多點(其實也不多,才0.x%)

linux性能異常定位之程式級别

3、pidstat

直接輸入pidstat(或者pidstat -l,會把指令的絕對路徑輸出)就可以看到程序使用cpu相關資料

linux性能異常定位之程式級别

【記憶體】

一般我們對記憶體關注幾個名額:

(1)是否使用了大量的交換空間:如果使用了大量的交換空間,說明有問題了(記憶體不夠?還是說有程序異常?)

(2)每個程序消耗了多少記憶體空間:

對于記憶體的檢視,最簡單就是free,還有dstat和top

1、free

通過free -m 我們看到,swap沒有使用,記憶體充足

linux性能異常定位之程式級别

2、dstat

檢視哪個程序消耗了最多的記憶體

輸入dstat lcmd -top-mem

看到,就puppet消耗了最多的記憶體59m(正常)

linux性能異常定位之程式級别

3、top

輸入top之後,輸入b,再輸入x,再輸入shift+’>’或者shif+’<‘調整排序的列到mem,就看到到記憶體消耗的排序了

linux性能異常定位之程式級别

【磁盤】

一般我們對磁盤關注幾個名額:

(1)讀寫的量/秒:dstat和iostat(全局),iotop或者pidstat(程序級别)

(2)每次讀寫磁盤的延遲時間:iostat(全局)

dstat,iostat用于檢視全局的io情況,要精确到程序用iotop或者pidstat

dstat:可以看到磁盤每秒的讀、寫取量(機關還整理過,是以一般我看磁盤的讀寫量都會用這個工具)

iostat就可以看到:磁盤的磁盤每秒的讀、寫取量并且還可以看到io的延遲效果(一般我看io的延遲會用這個工具)

1、dstat

dstat可以看到每秒讀寫多少B、K、M的資料

linux性能異常定位之程式級别

dstat其他參數和常用使用還有:

dstat -g -l -m -s --top-mem

dstat -c -y -l --proc-count --top-cpu

2、iostat

也可以看到類似的效果,而且更加豐富

linux性能異常定位之程式級别

svctm < await (同時等待的請求的等待時間被重複計算),

如果 svctm 比較接近 await,說明I/O 幾乎沒有等待時間;

如果 await 遠大于 svctm,說明 I/O 隊列太長

await:    平均每次裝置I/O操作的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)

svctm:    平均每次裝置I/O操作的服務時間 (毫秒):會将await也計算在内

%util:    一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (因為use的機關為毫秒)

3、iotop

通過iotop直接看得到io占用最高的程序,直接輸入iotop指令,效果如下

linux性能異常定位之程式級别

4、pidstat

通過pidstat -d也可以看到讀寫磁盤資料多的程序,pidstat -d效果如下:

linux性能異常定位之程式級别

【網絡】

一般網絡主要關注性能名額:

(1)出入的流量

(2)連接配接狀态:各個狀态如established,timewait等

(3)本地監聽,消耗的端口數量等

接下來介紹三個工具

1、ss

ss指令用于功能和netstat差不多,用于檢視網絡連接配接狀态。

ss:消耗資源低;和netstat相比,比較快的原因在于:“ss快的秘訣在于,它利用到了TCP協定棧中tcp_diag。tcp_diag是一個用于分析統計的子產品,可以獲得Linux 核心中第一手的資訊,這就確定了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常運作,隻是效率會變得稍慢”(zz)

以下的執行個體說明目前已經建立了連接配接33個,timewaite有866個(可以考慮優化了)

linux性能異常定位之程式級别

以下的示例說明本地打開了哪些端口

linux性能異常定位之程式級别

2、iftop

通過iftop可以看到本機和哪些ip域名之間的流量很大:

直接輸入top既可以看到:

linux性能異常定位之程式級别

iftop指令相關參數介紹如下:

-i設定監測的網卡,如:# iftop -i eth1

-B 以bytes為機關顯示流量(預設是bits),如:# iftop -B

-n使host資訊預設直接都顯示IP,如:# iftop -n

-N使端口資訊預設直接都顯示端口号,如: # iftop -N

-F顯示特定網段的進出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0

-h(display this message),幫助,顯示參數資訊

3、nethogs

nethogs能直接就看到程序級别的流量

直接輸入nethogs em2(網卡)就可以看到本地的哪些端口和對端的哪些端口之間的流量,進而就知道哪些程序消耗了很多網絡流量了

linux性能異常定位之程式級别

【小結】

以上工具,從cpu、記憶體、磁盤,網絡次元,能查到各個程序消耗相關性能(資源)的具體情況,對系統性能出異常時,定位至程序級别是十分有幫助了。

繼續閱讀