天天看點

Linux-(vmstat,iostat,netstat)

vmstat是Virtual Meomory Statistics(虛拟記憶體統計)的縮寫,可對作業系統的虛拟記憶體、程序、CPU活動進行監控。他是對系統的整體情況進行統計,不足之處是無法對某個程序進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因為 vmstat 本身就是低開銷工具,在非常高負荷的伺服器上,你需要檢視并監控系統的健康情況,在控制視窗還是能夠使用vmstat 輸出結果。

實體記憶體和虛拟記憶體差別:

直接從實體記憶體讀寫資料要比從硬碟讀寫資料要快的多,是以,我們希望所有資料的讀取和寫入都在記憶體完成,而記憶體是有限的,這樣就引出了實體記憶體與虛拟記憶體的概念。

實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體,相對于實體記憶體,在linux下還有一個虛拟記憶體的概念,虛拟記憶體就是為了滿足實體記憶體的不足而提出的政策,它是利用磁盤空間虛拟出的一塊邏輯記憶體,用作虛拟記憶體的磁盤空間被稱為交換空間(Swap Space)。作為實體記憶體的擴充,linux會在實體記憶體不足時,使用交換分區的虛拟記憶體,更詳細的說,就是核心會将暫時不用的記憶體塊資訊寫到交換空間,這樣以來,實體記憶體得到了釋放,這塊記憶體就可以用于其它目的,當需要用到原始的内容時,這些資訊會被重新從交換空間讀入實體記憶體。linux的記憶體管理采取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會在适當的時候将實體記憶體中不經常使用的資料塊自動交換到虛拟記憶體中,而将經常使用的資訊保留到實體記憶體。

要深入了解linux記憶體運作機制,需要知道下面提到的幾個方面:

首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑實體記憶體,即使并沒有什麼事情需要記憶體,Linux也會交換出暫時不用的記憶體頁面。這可以避免等待交換所需的時間。其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛拟記憶體,linux核心根據”最近最經常使用“算法,僅僅将一些不經常使用的頁面檔案交換到虛拟記憶體,有時我們會看到這麼一個現象:linux實體記憶體還有很多,但是交換空間也使用了很多。其實,這并不奇怪,例如,一個占用很大記憶體的程序運作時,需要耗費很多記憶體資源,此時就會有一些不常用頁面檔案被交換到虛拟記憶體中,但後來這個占用很多記憶體資源的程序結束并釋放了很多記憶體時,剛才被交換出去的頁面檔案并不會自動的交換進實體記憶體,除非有這個必要,那麼此刻系統實體記憶體就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關于這點,不用擔心什麼,隻要知道是怎麼一回事就可以了。最後,交換空間的頁面在使用時會首先被交換到實體記憶體,如果此時沒有足夠的實體記憶體來容納這些頁面,它們又會被馬上交換出去,如此以來,虛拟記憶體中可能沒有足夠空間來存儲這些交換頁面,最終會導緻linux出現假當機、服務異常等問題,linux雖然可以在一段時間内自行恢複,但是恢複後的系統已經基本不可用了。是以,合理規劃和設計linux記憶體的使用,是非常重要的。

虛拟記憶體原理:

在系統中運作的每個程序都需要使用到記憶體,但不是每個程序都需要每時每刻使用系統配置設定的記憶體空間。當系統運作所需記憶體超過實際的實體記憶體,核心會釋放某些程序所占用但未使用的部分或所有實體記憶體,将這部分資料存儲在磁盤上直到程序下一次調用,并将釋放出的記憶體提供給有需要的程序使用。

在Linux記憶體管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的記憶體排程。調頁算法是将記憶體中最近不常使用的頁面換到磁盤上,把活動頁面保留在記憶體中供程序使用。交換技術是将整個程序,而不是部分頁面,全部交換到磁盤上。

分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到記憶體的過程被稱作Page-In。當核心需要一個分頁時,但發現此分頁不在實體記憶體中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。

當系統核心發現可運作記憶體變少時,就會通過Page-Out來釋放一部分實體記憶體。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當核心管理分頁的時間超過運作程式的時間時,系統效能會急劇下降。這時的系統已經運作非常慢或進入暫停狀态,這種狀态亦被稱作thrashing(颠簸)。

vmstat [-a] [-n] [-S unit] [delay [ count]]

vmstat [-s] [-n] [-S unit]

vmstat [-m] [-n] [delay [ count]]

vmstat [-d] [-n] [delay [ count]]

vmstat [-p disk partition] [-n] [delay [ count]]

vmstat [-f]

vmstat [-V]

-a:顯示活躍和非活躍記憶體

-f:顯示從系統啟動至今的fork數量 。

-m:顯示slabinfo

-n:隻在開始時顯示一次各字段名稱。

-s:顯示記憶體相關統計資訊及多種系統活動數量。

delay:重新整理時間間隔。如果不指定,隻顯示一條結果。

count:重新整理次數。如果不指定重新整理次數,但指定了重新整理時間間隔,這時重新整理次數為無窮。

-d:顯示磁盤相關統計資訊。

-p:顯示指定磁盤分區統計資訊

-S:使用指定機關顯示。參數有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576位元組(byte)。預設機關為K(1024 bytes)

-V:顯示vmstat版本資訊。

顯示虛拟記憶體使用情況

指令:vmstat

字段說明:

Procs(程序):

r: 運作隊列中程序數量

b: 等待IO的程序數量

Memory(記憶體):

swpd: 使用虛拟記憶體大小

free: 可用記憶體大小

buff: 用作緩沖的記憶體大小

cache: 用作緩存的記憶體大小

Swap:

si: 每秒從交換區寫到記憶體的大小

so: 每秒寫入交換區的記憶體大小

IO:(現在的Linux版本塊的大小為1024bytes)

bi: 每秒讀取的塊數

bo: 每秒寫入的塊數

系統:

in: 每秒中斷數,包括時鐘中斷。

cs: 每秒上下文切換數。

CPU(以百分比表示):

us: 使用者程序執行時間(user time)

sy: 系統程序執行時間(system time)

id: 空閑時間(包括IO等待時間),中央處理器的空閑時間 。以百分比表示。

wa: 等待IO時間

備注: 如果 r經常大于 4 ,且id經常少于40,表示cpu的負荷很重。如果bi,bo 長期不等于0,表示記憶體不足。如果disk 經常不等于0, 且在 b中的隊列 大于3, 表示 io性能不好。Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴充性,能夠針對不同的應用和硬體環境調整,優化出滿足目前應用需要的最佳性能。是以企業在維護Linux系統、進行系統調優時,了解系統性能分析工具是至關重要的。

指令:vmstat 5 5

表示在5秒時間内進行5次采樣。将得到一個資料彙總他能夠反映真正的系統情況。

顯示活躍和非活躍記憶體

指令:vmstat -a 2 5

說明:使用-a選項顯示活躍和非活躍記憶體時,所顯示的内容除增加inact和active外,其他顯示内容與例子1相同。

inact: 非活躍記憶體大小(當使用-a選項時顯示)

active: 活躍的記憶體大小(當使用-a選項時顯示)

檢視系統已經fork了多少次

指令:vmstat -f

說明:這個資料是從/proc/stat中的processes字段裡取得的

檢視記憶體使用的詳細資訊

指令:vmstat -s

說明:這些資訊的分别來自于/proc/meminfo,/proc/stat和/proc/vmstat。

檢視磁盤的讀/寫

指令:vmstat -d

說明:這些資訊主要來自于/proc/diskstats。merged:表示一次來自于合并的寫/讀請求,一般系統會把多個連接配接/鄰近的讀/寫請求合并到一起來操作.

檢視/dev/sda1磁盤的讀/寫

指令:vmstat -p /dev/sda1

說明:這些資訊主要來自于/proc/diskstats。

reads:來自于這個分區的讀的次數。

read sectors:來自于這個分區的讀扇區的次數。

writes:來自于這個分區的寫的次數。

requested writes:來自于這個分區的寫請求次數。

檢視系統的slab資訊

指令:vmstat -m

說明:這組資訊來自于/proc/slabinfo。

slab:由于核心會有許多小對象,這些對象構造銷毀十分頻繁,比如i-node,dentry,這些對象如果每次建構的時候就向記憶體要一個頁(4kb),而其實隻有幾個位元組,這樣就會非常浪費,為了解決這個問題,就引入了一種新的機制來處理在同一個頁框中如何配置設定小存儲區,而slab可以對小對象進行配置設定,這樣就不用為每一個對象配置設定頁框,進而節省了空間,核心對一些小對象建立析構很頻繁,slab對這些小對象進行緩沖,可以重複利用,減少記憶體配置設定次數。

Linux系統中的 iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具将對系統的磁盤操作活動進行監視。它的特點是彙報磁盤活動統計情況,同時也會彙報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個程序進行深入分析,僅對系統的整體情況進行分析。iostat屬于sysstat軟體包。可以用yum install sysstat 直接安裝。

iostat [參數] [時間] [次數]

  通過iostat友善檢視CPU、網卡、tty裝置、磁盤、CD-ROM 等等裝置的活動情況, 負載資訊。

-C 顯示CPU使用情況

-d 顯示磁盤使用情況

-k 以 KB 為機關顯示

-m 以 M 為機關顯示

-N 顯示磁盤陣列(LVM) 資訊

-n 顯示NFS 使用情況

-p[磁盤] 顯示磁盤和分區的情況

-t 顯示終端和CPU的資訊

-x 顯示詳細資訊

-V 顯示版本資訊

顯示所有裝置負載情況

指令:iostat

cpu屬性值說明:

%user:CPU處在使用者模式下的時間百分比。

%nice:CPU處在帶NICE值的使用者模式下的時間百分比。

%system:CPU處在系統模式下的時間百分比。

%iowait:CPU等待輸入輸出完成時間的百分比。

%steal:管理程式維護另一個虛拟處理器時,虛拟CPU的無意識等待時間百分比。

%idle:CPU空閑時間百分比。

備注:如果%iowait的值過高,表示硬碟存在I/O瓶頸,%idle值高,表示CPU較空閑,如果%idle值高但系統響應慢時,有可能是CPU等待配置設定記憶體,此時應加大記憶體容量。%idle值如果持續低于10,那麼系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU。

disk屬性值說明:

rrqm/s:  每秒進行 merge 的讀操作數目。即 rmerge/s

wrqm/s:  每秒進行 merge 的寫操作數目。即 wmerge/s

r/s:  每秒完成的讀 I/O 裝置次數。即 rio/s

w/s:  每秒完成的寫 I/O 裝置次數。即 wio/s

rsec/s:  每秒讀扇區數。即 rsect/s

wsec/s:  每秒寫扇區數。即 wsect/s

rkB/s:  每秒讀K位元組數。是 rsect/s 的一半,因為每扇區大小為512位元組。

wkB/s:  每秒寫K位元組數。是 wsect/s 的一半。

avgrq-sz:  平均每次裝置I/O操作的資料大小 (扇區)。

avgqu-sz:  平均I/O隊列長度。

await:  平均每次裝置I/O操作的等待時間 (毫秒)。

svctm: 平均每次裝置I/O操作的服務時間 (毫秒)。

%util:  一秒中有百分之多少的時間用于 I/O 操作,即被io消耗的cpu百分比

備注:如果 %util 接近 100%,說明産生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大于 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。如果avgqu-sz比較大,也表示有當量io在等待。

定時顯示所有資訊

指令:iostat 2 3

說明:每隔 2秒重新整理顯示,且顯示3次

顯示指定磁盤資訊

指令:iostat -d sda1

顯示tty和Cpu資訊

指令:iostat -t

以M為機關顯示所有資訊

指令:iostat -m

檢視TPS和吞吐量資訊

指令:iostat -d -k 1 1

說明:這些機關都為Kilobytes。

tps:該裝置每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。“一次傳輸”意思是“一次I/O請求”。多個邏輯請求可能會被合并為“一次I/O請求”。“一次傳輸”請求的大小是未知的。

kB_read/s:每秒從裝置(drive expressed)讀取的資料量;

kB_wrtn/s:每秒向裝置(drive expressed)寫入的資料量;

kB_read:讀取的總資料量;kB_wrtn:寫入的總數量資料量;

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計資料,當時統計的磁盤總TPS是22.73,下面是各個分區的TPS。(因為是瞬間值,是以總TPS并不嚴格等于各個分區TPS的總和)

檢視裝置使用率(%util)、響應時間(await)

指令:iostat -d -x -k 1 1

說明:

rrqm/s:  每秒進行 merge 的讀操作數目.即 delta(rmerge)/s

wrqm/s: 每秒進行 merge 的寫操作數目.即 delta(wmerge)/s

r/s:  每秒完成的讀 I/O 裝置次數.即 delta(rio)/s

w/s:  每秒完成的寫 I/O 裝置次數.即 delta(wio)/s

rsec/s:  每秒讀扇區數.即 delta(rsect)/s

wsec/s: 每秒寫扇區數.即 delta(wsect)/s

rkB/s:  每秒讀K位元組數.是 rsect/s 的一半,因為每扇區大小為512位元組.(需要計算)

wkB/s:  每秒寫K位元組數.是 wsect/s 的一半.(需要計算)

avgrq-sz:平均每次裝置I/O操作的資料大小 (扇區).delta(rsect+wsect)/delta(rio+wio)

avgqu-sz:平均I/O隊列長度.即 delta(aveq)/s/1000 (因為aveq的機關為毫秒).

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

svctm: 平均每次裝置I/O操作的服務時間 (毫秒).即 delta(use)/delta(rio+wio)

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

如果 %util 接近 100%,說明産生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。idle小于70% IO壓力就較大了,一般讀取速度有較多的wait。同時可以結合vmstat 檢視檢視b參數(等待資源的程序數)和wa參數(IO等待所占用的CPU時間的百分比,高過30%時IO壓力高)。另外 await 的參數也要多和 svctm 來參考。差的過高就一定有 IO 的問題。

avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的資料的大小,如果次數多,但資料拿的小的話,其實 IO 也會很小。如果資料拿的大,才IO 的資料會高。也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是講,讀定速度是這個來決定的。

svctm 一般要小于 await (因為同時等待的請求的等待時間被重複計算了),svctm 的大小一般和磁盤性能有關,CPU/記憶體的負荷也會對其有影響,請求過多也會間接導緻 svctm 的增加。await 的大小一般取決于服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大于 svctm,說明 I/O 隊列太長,應用得到的響應時間變慢,如果響應時間超過了使用者可以容許的範圍,這時可以考慮更換更快的磁盤,調整核心 elevator 算法,優化應用,或者更新 CPU。

隊列長度(avgqu-sz)也可作為衡量系統 I/O 負荷的名額,但由于 avgqu-sz 是按照機關時間的平均值,是以不能反映瞬間的 I/O 洪水。

形象的比喻:

r/s+w/s 類似于交款人的總數

平均隊列長度(avgqu-sz)類似于機關時間裡平均排隊人的個數

平均服務時間(svctm)類似于收銀員的收款速度

平均等待時間(await)類似于平均每人的等待時間

平均I/O資料(avgrq-sz)類似于平均每人所買的東西多少

I/O 操作率 (%util)類似于收款台前有人排隊的時間比例

裝置IO操作:總IO(io)/s = r/s(讀) +w/s(寫) =1.46 + 25.28=26.74

平均每次裝置I/O操作隻需要0.36毫秒完成,現在卻需要10.57毫秒完成,因為發出的 請求太多(每秒26.74個),假如請求時同時發出的,可以這樣計算平均等待時間:平均等待時間=單個I/O伺服器時間*(1+2+...+請求總數-1)/請求總數 

每秒發出的I/0請求很多,但是平均隊列就4,表示這些請求比較均勻,大部分處理還是比較及時。

檢視cpu狀态

指令:iostat -c 1 3

netstat指令用于顯示與IP、TCP、UDP和ICMP協定相關的統計資料,一般用于檢驗本機各端口的網絡連接配接情況。netstat是在核心中通路網絡及相關資訊的程式,它能提供TCP連接配接,TCP和UDP監聽,程序記憶體管理的相關報告。

如果你的計算機有時候接收到的資料報導緻出錯資料或故障,你不必感到奇怪,TCP/IP可以容許這些類型的錯誤,并能夠自動重發資料報。但如果累計的出錯情況數目占到所接收的IP資料報相當大的百分比,或者它的數目正迅速增加,那麼你就應該使用netstat查一查為什麼會出現這些情況了。

netstat [-acCeFghilMnNoprstuvVwx] [-A<網絡類型>] [--ip] 

-a或–all 顯示所有連線中的Socket。

-A<網絡類型>或–<網絡類型> 列出該網絡類型連線中的相關位址。

-c或–continuous 持續列出網絡狀态。

-C或–cache 顯示路由器配置的快取資訊。

-e或–extend 顯示網絡其他相關資訊。

-F或–fib 顯示FIB。

-g或–groups 顯示多重廣播功能群組組員名單。

-h或–help 線上幫助。

-i或–interfaces 顯示網絡界面資訊表單。

-l或–listening 顯示監控中的伺服器的Socket。

-M或–masquerade 顯示僞裝的網絡連線。

-n或–numeric 直接使用IP位址,而不通過域名伺服器。

-N或–netlink或–symbolic 顯示網絡硬體外圍裝置的符号連接配接名稱。

-o或–timers 顯示計時器。

-p或–programs 顯示正在使用Socket的程式識别碼和程式名稱。

-r或–route 顯示Routing Table。

-s或–statistice 顯示網絡工作資訊統計表。

-t或–tcp 顯示TCP傳輸協定的連線狀況。

-u或–udp 顯示UDP傳輸協定的連線狀況。

-v或–verbose 顯示指令執行過程。

-V或–version 顯示版本資訊。

-w或–raw 顯示RAW傳輸協定的連線狀況。

-x或–unix 此參數的效果和指定”-A unix”參數相同。

–ip或–inet 此參數的效果和指定”-A inet”參數相同。

無參數使用

指令:netstat

從整體上看,netstat的輸出結果可以分為兩個部分:

一個是Active Internet connections,稱為有源TCP連接配接,其中"Recv-Q"和"Send-Q"指的是接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟體包正在隊列中堆積。這種情況隻能在非常少的情況見到。

一個是Active UNIX domain sockets,稱為有源Unix域套接口(和網絡套接字一樣,但是隻能用于本機通信,性能可以提高一倍)。

Proto顯示連接配接使用的協定,

RefCnt表示連接配接到本套接口上的程序号,

Types顯示套接口的類型,

State顯示套接口目前的狀态,

Path表示連接配接到套接口的其它程序使用的路徑名。

套接口類型:

-t :TCP

-u :UDP

-raw :RAW類型

--unix :UNIX域類型

--ax25 :AX25類型

--ipx :ipx類型

--netrom :netrom類型 

狀态說明:

LISTEN:偵聽來自遠方的TCP端口的連接配接請求

SYN-SENT:再發送連接配接請求後等待比對的連接配接請求(如果有大量這樣的狀态包,檢查是否中招了)

SYN-RECEIVED:再收到和發送一個連接配接請求後等待對方對連接配接請求的确認(如有大量此狀态,估計被flood攻擊了)

ESTABLISHED:代表一個打開的連接配接

FIN-WAIT-1:等待遠端TCP連接配接中斷請求,或先前的連接配接中斷請求的确認

FIN-WAIT-2:從遠端TCP等待連接配接中斷請求

CLOSE-WAIT:等待從本地使用者發來的連接配接中斷請求

CLOSING:等待遠端TCP對連接配接中斷的确認

LAST-ACK:等待原來的發向遠端TCP的連接配接中斷請求的确認(不是什麼好東西,此項出現,檢查是否被攻擊)

TIME-WAIT:等待足夠的時間以確定遠端TCP接收到連接配接中斷請求的确認

CLOSED:沒有任何連接配接狀态

指令:netstat -a

說明:顯示一個所有的有效連接配接資訊清單,包括已建立的連接配接(ESTABLISHED),也包括監聽連接配接請(LISTENING)的那些連接配接。

顯示目前UDP連接配接狀況

指令:netstat -nu

顯示UDP端口号的使用情況

指令:netstat -apu

顯示網卡清單

指令:netstat -i

顯示多點傳播組的關系

指令:netstat -g

顯示網絡統計資訊

指令:netstat -s

顯示關于路由表的資訊

指令:netstat -r

列出所有 tcp 端口

指令:netstat -at

統計機器中網絡連接配接各個狀态個數

指令:netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

把狀态全都取出來後使用uniq -c統計後再進行排序

指令:netstat -nat |awk '{print $6}'|sort|uniq -c

檢視連接配接某服務端口最多的的IP位址

指令:netstat -nat | grep "192.168.120.20:16067" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -20

找出程式運作的端口

指令:netstat -ap | grep ssh

在 netstat 輸出中顯示 PID 和程序名稱

指令:netstat -pt

找出運作在指定端口的程序

指令:netstat -anpt | grep ':16064'

繼續閱讀