歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux上性能異常定位以及性能監控

Linux上性能異常定位以及性能監控

日期:2017/2/28 13:47:19   编辑:Linux教程

引言:大多數的服務都是跑在Linux上的,Linux現在也已經到了一個很廣泛的應用,但是仍然會有很多問題出現,我們就來討論下我們性能監控的指標,性能監控無非就是從I/O,內存,CPU,TCP連接數,網絡,進程或者線程來出發,使用到的命令有iostat,vmstat,sar,mpstat,netstat,ss,iftop,free,pstree/ps,pidstat,top,(uptime)下面來進一步深入下吧.

一,磁盤I/O(iostat)

我們的機器上有很多的數據是存儲在磁盤上的,我們讀取的很多數據都是要和磁盤交互的,但是磁盤同時又是一個低速設備,很多時候會發生阻塞,所以磁盤I/O的監控很重要。我們使用iostat來診斷磁盤的情況。使用的機器是騰訊雲主機。

tps:該設備每秒的傳輸次數,表示每秒多少個I/O請求

Blk_read/s:每秒從設備讀取到的數據量

Blk_wrtn/s:每秒向設備寫入的數據量

Blk_read:讀取的總數據量

Blk_wrtn:寫入的總數據量

%user:代表用戶態進程使用CPU的負載

%nice:代表優先級進程使用的CPU負載

%system:代表內核態進程使用的CPU負載

%iowait:代表CPU等待I/O時,CPU的負載

%steal:代表被偷走的CPU負載情況,這個在虛擬化技術中會用到

%idle:代表空閒的所占用的CPU負載情況

iostat還有一個常用的參數選項-x,表示擴展的信息

rrqm/s:每秒這個設備相關的讀取請求有多少被Merge(多個I/O合並的操作)了

wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了

r/s:每秒發送到設備的讀請求數

w/s:每秒發送到設備的寫請求數

rsec/s:每秒讀取設備扇區的次數

wsec/s:每秒寫入設備扇區的次數

avgrq-sz:平均請求扇區的大小

avgqu-sz:平均請求隊列的長度

await:每一個I/O請求的處理的平均時間(等待時間)

r_await:每一個讀I/O請求的處理的平均時間

w_await:每一個寫I/O請求的處理的平均時間

svctm:表示平均每次I/O操作的服務時間。如果svctm值和await值很接近,則表示I/O幾乎沒有等待,如果await的值遠高於svctm的值,則表示I/O隊列等待太長

%util:在統計的時間內總共有多少的時間用於處理I/O操作,即被消耗的CPU的百分比。例如統計時間間隔是1s,那麼這個設備有0.65s在處理I/O,有0.35s處於空閒。那麼這個設備的%util=0.65/1=65%,一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因為磁盤的並發能力,所以磁盤使用未必就到了瓶頸)

二,內存(free)

在Linux系統中我們查看內存使用情況。使用free命令來查看

第一行的信息(我們可以認為從操作系統層面看待)

total:總物理內存大小

used:已經分配的大小

free:沒有被分配的大小

shared:共享內存的大小,主要用於IPC通信

buffers:用於塊設備的緩沖

cached:用於文件內容緩沖,也就是緩存

"緩存"就是在內存中劃分一塊區域,作為進程和硬盤之間的緩沖區,進程將數據寫入緩存中,當那些數據需要讀取的時候,就直接去"高速路"緩存中讀取,而不會去"土路"硬盤中讀取,這樣大大的加快性能

這裡buffer實際上是存儲了我們數據的元數據(包括目錄名字,文件大小,文件存儲塊,修改時間,權限等),而cache則存放了我們最近讀取過的文件。

第三行信息(我們可以認為從應用程序層面看待)

這裡的-/+ buffers/cache分別為 -buffers/cache 和 +buffers/cache 兩部分

-buffers/cache = used(第一行)-buffers-cached 實際上是當前程序上"真實使用"的"物理內存"

+buffers/cache = buffers+cached 意思就是暫時"借給"系統作為"緩沖區"使用的內存大小

used=(+buffers/cached)+(-buffers/cached)

所以從應用程序層面看,可用內存=free memory+buffers+cached

詳細信息我們可以通過下面這種方式查看.

~ cat /proc/meminfo

MemTotal: 1020128 kB

MemFree: 670772 kB

Buffers: 97780 kB

Cached: 100980 kB

SwapCached: 0 kB

Active: 164988 kB

Inactive: 117296 kB

Active(anon): 83536 kB

Inactive(anon): 160 kB

Active(file): 81452 kB

Inactive(file): 117136 kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal: 0 kB

SwapFree: 0 kB

Dirty: 92 kB

Writeback: 0 kB

AnonPages: 83504 kB

Mapped: 17500 kB

Shmem: 172 kB

Slab: 46696 kB

SReclaimable: 28652 kB

SUnreclaim: 18044 kB

KernelStack: 1744 kB

PageTables: 2636 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 510064 kB

Committed_AS: 343800 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 7112 kB

VmallocChunk: 34359727304 kB

HardwareCorrupted: 0 kB

AnonHugePages: 36864 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

DirectMap4k: 8184 kB

DirectMap2M: 1040384 kB

三,CPU(dstat,mpstat)

首先我們使用dstat命令來查看下我們的CPU情況,他能夠實時的輸出我們的信息,

每2秒輸出一次,一共輸出10次

cpu:hiq、siq分別為硬中斷和軟中斷次數

system:int、csw分別為系統的中斷次數(interrupt)和上下文切換次數(context switch)。

-c:表示只顯示我們的CPU信息

-m:表示只顯示我們的內存信息

-p:表示只顯示我們的進程信息

-n:表示只顯示我們的網絡信息

我們想以什麼為什麼優先順序查看,可以在後面加下列參數

mpstat

%user      在internal時間段裡,用戶態的CPU時間(%),不包含nice值為負進程  (usr/total)*100
%nice 在internal時間段裡,nice值為負進程的CPU時間(%) (nice/total)*100
%sys 在internal時間段裡,內核時間(%) (system/total)*100
%iowait 在internal時間段裡,硬盤IO等待時間(%) (iowait/total)*100
%irq 在internal時間段裡,硬中斷時間(%) (irq/total)*100
%soft 在internal時間段裡,軟中斷時間(%) (softirq/total)*100
%idle 在internal時間段裡,CPU除去等待磁盤IO操作外的因為任何原因而空閒的時間閒置時間(%) (idle/total)*100

四,TCP連接數(ss,netstat)

ss是Socket Statistics的縮寫,顧名思義ss命令就是用來獲取sockets的信息,他可以顯示和netstat類似的內容,但是他比netstat更快更高效,而且顯示更為詳細的有關TCP連接信息。當我們的sockets連接數非常大的時候,無論是我們使用netstat命令還是在內核中查看連接數cat /proc/net/tcp的時候都會很緩慢。

ss快速的原因就是他利用了TCP協議中的tcp_diag,tcp_diag是一個用於分析和統計的模塊,他可以獲取到Linux內核中的第一手信息,這個���確保了ss的高效性。

我們可以對netstat和ss做個對比,有圖有真相嘛

netstat命令的時間顯然比ss命令的時間慢多了

netstat命令

我們可以看到系統中守護進程的連接狀態信息以及監聽到的端口號

-t:表示TCP的連接

-u:表示UDP的連接

-n:表示以數字的形式顯示信息

-p:表示顯示監聽的端口號

查看系統中守護進程的監聽狀態

我們可以看到State狀態顯示

ss命令

查看當前服務器的網絡連接統計: ss -s

其他ss的用法和netstat用法相同

五,網絡(iftop)

使用iftop -i eth0

使用Ctrl+c退出,退出顯示

我們可以使用-i參數監聽不同的網卡流量信息,在iftop的哪個界面我們可以使用按p來查看端口流量信息

六,進程信息(ps/pstree,top,pidstat)

我們使用pstree來查看下我們的進程樹,所有的進程都是init進程的子進程


ps命令

查看具體的進程,比如MySQL進程我們可以使用ps aux mysqld或者ps -elf mysqld這種方式,這兩種本質上沒有什麼區別,因為Linux繼承的是Unix的一些思想,一個是Unix的Sys-v風格,一個是BSD的風格

我們可以詳細的看到他的信息

pidstat命令

我們可以使用pidstat來查看每一個進程的pid的狀態信息,以及他所占的CPU信息

六,綜合顯示(vmstat,top,sar)

我們看到內存,交換分區,I/O,CPU,以及進程上下文切換次數

top命令

在這個界面下:

按m按照內存使用大小排序顯示

按P按照CPU使用大小排序顯示

按M按照常駐留內存大小排序

按k表示殺死某個進程

sar命令

有時候我們可能需要統計下我們的Linux啟動了多長時間,我們可以使用uptime命令來顯示這個信息,top也可以顯示

uptime命令

top命令顯示

Copyright © Linux教程網 All Rights Reserved