性能監控之 Linux 命令 top、vmstat、iostat、free、iftop 基礎
前言

top
vmstat
iostat
free
iftop
前言
top
vmstat
iostat
free
iftop
前言
“子曰:“溫故而知新,可以為師矣?!?/p>
-----《論語》
top
執行命令:
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
參數說明:
d:指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用 s 交互命令來改變之。
p:通過指定監控進程 ID 來僅僅監控某個進程的狀態。
q:該選項將使 top 沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那么top將以盡可能高的優先級運行。
S:指定累計模式。
s:使 top 命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
i:使 top 不顯示任何閑置或者僵死進程。
c:顯示整個命令行而不只是顯示命令名。
命令說明:
系統運行時間和平均負載:
top - 20:20:16 up 16:18, 4 users, load average: 0.00, 0.01, 0.04
top 命令的頂部顯示與 uptime 命令相似的輸出
這些字段顯示:
當前時間
系統已運行的時間
當前登錄用戶的數量
相應最近 1、5 和 15 分鐘內的平均負載。
可以使用 ‘l’ 命令切換 uptime 的顯示
任務
Tasks: 112 total, 1 running, 104 sleeping, 7 stopped, 0 zombie
Tasks — 任務(進程),系統現在共有 122 個進程,其中處于運行中的有 1 個,103 個在休眠(sleep),stoped 狀態的有7個,zombie 狀態(僵尸)的有 0 個,這些進程概括信息可以用 ‘t’ 切換顯示。
CPU 狀態
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
這里顯示不同模式下所占 cpu 時間百分比,這些不同的 cpu 時間表示:
us, user:運行(未調整優先級的) 用戶進程的CPU時間
sy,system: 運行內核進程的CPU時間
ni,niced:運行已調整優先級的用戶進程的CPU時間
wa,IO wait: 用于等待IO完成的CPU時間
hi:處理硬件中斷的 CPU 時間
si: 處理軟件中斷的 CPU 時間
st:這個虛擬機被 hypervisor 偷去的 CPU 時間(譯注:如果當前處于一個 hypervisor 下的 vm,實際上hypervisor 也是要消耗一部分 CPU 處理時間的)。
可以使用 ‘t’ 命令切換顯示。
0.0% us — 用戶空間占用 CPU 的百分比
0.3% sy — 內核空間占用 CPU 的百分比
0.0% ni — 改變過優先級的進程占用 CPU 的百分比
99.7% id — 空閑 CPU 百分比
0.0% wa — IO 等待占用 CPU 的百分比
0.0% hi — 硬中斷(Hardware IRQ)占用 CPU 的百分比
0.0% si — 軟中斷(Software Interrupts)占用 CPU 的百分比
內存使用
KiB Mem : 995896 total, 432992 free, 168912 used, 393992 buff/cache KiB Swap: 2097148 total, 2084084 free, 13064 used. 621592 avail Mem
接下來兩行顯示內存使用率,有點像 ‘free’ 命令。
第一行是物理內存使用
物理內存顯示如下:全部可用內存、已使用內存、空閑內存、緩沖內存。
第二行是虛擬內存使用(交換空間)
交換部分顯示的是:全部、已使用、空閑和緩沖交換空間。
內存顯示可以用’m’命令切換。
995896 total — 物理內存總量
168912k used — 使用中的內存總量
432992 k free — 空閑內存總量
393992k buffers — 緩存的內存量
swap 交換分區:
2097148k total — 交換區總量
13064k used — 使用的交換區總量
2084084k free — 空閑交換區總量
621592k cached — 緩沖的交換區總量
第四行中使用中的內存總量(used)指的是現在系統內核控制的內存數
空閑內存總量(free)是內核還未納入其管控范圍的數量。納入內核管理的內存不見得都在使用中,還包括過去使用過的現在可以被重復利用的內存,內核并不把這些可被重新使用的內存交還到free中去,因此在linux上free內存會越來越少,但不用為此擔心。
如果出于習慣去計算可用內存數,這里有個近似的計算公式:
第四行的
f
r
e
e
+
第四行的
b
u
f
f
e
r
s
+
第五行的
c
a
c
h
e
d
=
服務器的可用內存
第四行的free + 第四行的buffers + 第五行的cached=服務器的可用內存
第四行的free+第四行的buffers+第五行的cached=服務器的可用內存
對于內存監控,在 top 里我們要時刻監控第五行 swap 交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和 swap 的數據交換,這是真正的內存不夠用了。
各進程(任務)的狀態監控
參數說明:
PID:進程ID,進程的唯一標識符說明.
USER:進程所有者的實際用戶名。
PR:進程的調度優先級。這個字段的一些值是 ‘rt’。這意味這這些進程運行在實時態。
NI:進程的 nice 值(優先級)。越小的值意味著越高的優先級。負值表示高優先級,正值表示低優先級
VIRT:進程使用的虛擬內存。進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES:駐留內存大小。駐留內存是任務使用的非交換物理內存大小。進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR:SHR 是進程使用的共享內存。共享內存大小,單位 kb
S:這個是進程的狀態。它有以下不同的值:
D - 不可中斷的睡眠態。
R – 運行態
S – 睡眠態
T – 被跟蹤或已停止
Z – 僵尸態
%CPU:自從上一次更新時到現在任務所使用的 CPU 時間百分比。
%MEM:進程使用的可用物理內存百分比。
TIME+:任務啟動后到現在所使用的全部 CPU 時間,精確到百分之一秒。
COMMAND:運行進程所使用的命令。進程名稱(命令名/命令行)
交互命令 - ‘h’幫助命令
在 top 基本視圖中,按鍵盤數字“1”,可監控每個邏輯 CPU 的狀況:(本虛擬機就是一個 cpu)
監控 Java 線程數:
ps -eLf | grep java | wc -l
監控網絡客戶連接數:
netstat -n | grep tcp | grep 偵聽端口 | wc -l
vmstat
2 表示每個兩秒采集一次服務器狀態
1表示只采集一次。
結構說明:
r :表示運行隊列(就是說多少個進程真的分配到 CPU),我測試的服務器目前 CPU 比較空閑,沒什么程序在跑,當這個值超過了 CPU 數目,就會出現 CPU 瓶頸了。這個也和 top 的負載有關系,一般負載超過了 3 就比較高,超過了 5 就高,超過了 10 就不正常了,服務器的狀態很危險。top 的負載類似每秒的運行隊列。如果運行隊列過大,表示你的 CPU 很繁忙,一般會造成 CPU 使用率很高。
b:表示阻塞的進程,這個不多說,進程阻塞,大家懂的。
swap:虛擬內存已使用的大小,如果大于0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器。
free:空閑的物理內存的大小,我的機器內存總共 8G,剩余 3415M。
buff:linux/Unix 系統是用來存儲,目錄里面有什么內容,權限等的緩存,我本機大概占用300多M
cache:cache 直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
si:每秒從磁盤讀入虛擬內存的大小,如果這個值大于 0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。
so:每秒虛擬內存寫入磁盤的大小,如果這個值大于 0,同上。
bi:塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是 1024 byte,我本機上沒什么 IO 操作,所以一直是 0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒
bo:塊設備每秒發送的塊數量,例如我們讀取文件,bo 就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。
in:每秒 CPU 的中斷次數,包括時間中斷
cs:每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在 apache 和 nginx 這種 web 服務器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇 web 服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到 cs 到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的 CPU 大部分浪費在上下文切換,導致 CPU 干正經事的時間少了,CPU沒有充分利用,是不可取的。
us:用戶 CPU 時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超50%的使用,那么我們就該考慮優化程序算法或者進行加速。
sy:系統 CPU 時間,如果太高,表示系統調用時間長,例如是 IO 操作頻繁。
id:空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為 id 是空閑 CPU 使用率,us 是用戶 CPU 使用率,sy是系統 CPU 使用率。
wt:等待 IO CPU 時間。注意:wa 的值高時,說明 IO等 待比較嚴重,這可能由于磁盤大量作隨機訪問造成,也有可能磁盤出現瓶頸(塊操作)。
iostat
安裝方法:
yum install sysstat
iostat [參數] [時間] [次數]
參數說明:
-c:顯示 CPU 使用情況
-d:顯示磁盤使用情況
-k:以 K 為單位顯示
-m:以 M 為單位顯示
-N:顯示磁盤陣列(LVM) 信息
-n:顯示 NFS 使用情況
-p:可以報告出每塊磁盤的每個分區的使用情況
-t:顯示終端和 CPU 的信息
-x:顯示詳細信息
rrqm/s:每秒這個設備相關的讀取請求有多少被 Merge了(當系統調用需要讀取數據的時候,VFS 將請求發到各個 FS,如果 FS 發現不同的讀取請求讀取的是相同 Block 的數據,FS會將這個請求合并Merge)
wrqm/s:每秒這個設備相關的寫入請求有多少被 Merge 了
rsec/s:每秒讀取的扇區數
wsec/:每秒寫入的扇區數
rKB/s:The number of read requests that were issued to the device per second
wKB/s:The number of write requests that were issued to the device per second
avgrq-sz 平均請求扇區的大小
avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好。
await: 每一個IO請求的處理的平均時間(單位是微秒毫秒)。這里可以理解為 IO 的響應時間,一般地系統 IO 響應時間應該低于 5 ms,如果大于 10 ms 就比較大了。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await 大于 svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
svctm:表示平均每次設備 I/O 操作的服務時間(以毫秒為單位)。如果 svctm 的值與 await 很接近,表示幾乎沒有 I/O 等待,磁盤性能很好,如果 await 的值遠高于 svctm 的值,則表示 I/O 隊列等待太長,系統上運行的應用程序將變慢。
%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔 1 秒,該設備有 0.8 秒在處理IO,而 0.2 秒閑置,那么該設備的 %util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度
一般地,如果該參數是 100% 表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使 %util 是 100%,因為磁盤的并發能力,所以磁盤使用未必就到了瓶頸)。
常見用法:
iostat -d -k 1 10 #查看 TPS 和吞吐量信息(磁盤讀寫速度單位為 KB) iostat -d -m 2 #查看 TPS 和吞吐量信息(磁盤讀寫速度單位為 MB) iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await) iostat -c 1 10 #查看 cpu 狀態 iostat -c 1 10 #查看 cpu 狀態
注意點:
網卡的大吞吐量可能導致更多的 cup
大量的 cup 開銷又會增加更多內存使用請求
大量內存與磁盤的請求可能導致更多的 cpu 以及 IO 問題
free
Mem:行(第二行)是內存的使用情況
Swap:行(第三行)是交換空間的使用情況。
total:列顯示系統總的可用物理內存和交換空間大小。
used:列顯示已經被使用的物理內存和交換空間。
free:列顯示還有多少物理內存和交換空間可用使用。
shared:列顯示被共享使用的物理內存大小。
buff/cache:列顯示被 buffer 和 cache 使用的物理內存大小。
available:列顯示還可以被應用程序使用的物理內存大小。
iftop
界面相關說明:
界面上面顯示的是類似刻度尺的刻度范圍,為顯示流量圖形的長條作標尺用的。
中間的 <= => 這兩個左右箭頭,表示的是流量的方向。
TX:發送流量
RX:接收流量
TOTAL:總流量
Cumm:運行 iftop 到目前時間的總流量
peak:流量峰值
rates:分別表示過去 2s 10s 40s 的平均流量
常用的參數:
-i 設定監測的網卡,如:# iftop -i eth1
-B 以bytes為單位顯示流量(默認是bits),如:# iftop -B
-n 使host信息默認直接都顯示IP,如:# iftop -n
-N 使端口信息默認直接都顯示端口號,如: # iftop -N
-F 顯示特定網段的進出流量,如# iftop -F 100.100.30.25 或# iftop -F 100.100.30.25 /255.255.255.0
-h(display this message),幫助,顯示參數信息
-p 使用這個參數后,中間的列表顯示的本地主機信息,出現了本機以外的IP信息;
-b 使流量圖形條默認就顯示;
-f 這個暫時還不太會用,過濾計算包用的;
-P 使 host 信息及端口信息默認就都顯示;
-m 設置界面最上邊的刻度的最大值,刻度分五個大段顯示,例:# iftop -m 100M
iftop(注意大小寫)
常用操作:
按 h 切換是否顯示幫助;
按 n 切換顯示本機的 IP 或主機名;
按 s 切換是否顯示本機的 host 信息;
按 d 切換是否顯示遠端目標主機的 host 信息;
按 t 切換顯示格式為 2 行/ 1 行/只顯示發送流量/只顯示接收流量;
按 N 切換顯示端口號或端口服務名稱;
按 S 切換是否顯示本機的端口信息;
按 D 切換是否顯示遠端目標主機的端口信息;
按 p 切換是否顯示端口信息;
按 P 切換暫停/繼續顯示;
按 b 切換是否顯示平均流量圖形條;
按 B 切換計算 2 秒或 10 秒或 40 秒內的平均流量;
按 T 切換是否顯示每個連接的總流量;
按 l 打開屏幕過濾功能,輸入要過濾的字符,比如 ip,按回車后,屏幕就只顯示這個 IP 相關的流量信息;
按 L 切換顯示畫面上邊的刻度;刻度不同,流量圖形條會有變化;
按 j 或按 k 可以向上或向下滾動屏幕顯示的連接記錄;
按 1 或 2 或 3 可以根據右側顯示的三列流量數據進行排序;
按 < 根據左邊的本機名或IP排序;
按 > 根據遠端目標主機的主機名或IP排序;
按 o 切換是否固定只顯示當前的連接;
按 f 可以編輯過濾代碼,這是翻譯過來的說法,我還沒用過這個!
按 ! 可以使用 shell 命令,這個沒用過 !沒搞明白啥命令在這好用呢!
按 q 退出監控。
Linux 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。