1. 程式人生 > >linux 檢視伺服器效能常用命令

linux 檢視伺服器效能常用命令

一、top命令是Linux下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,類似於Windows的工作管理員

 

下面詳細介紹它的使用方法。top是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態.如果在前臺執行該命令,它將獨佔前臺,直到使用者終止該程式為止.比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最“敏感”的任務列表.該命令可以按CPU使用.記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過互動式命令或者在個人定製檔案中進行設定.

1.命令格式:

top [引數]

2.命令功能:

顯示當前系統正在執行的程序的相關資訊,包括程序ID、記憶體佔用率、CPU佔用率等

3.命令引數:

-b 批處理

-c 顯示完整的治命令

-I 忽略失效過程

-s 保密模式

-S 累積模式

-i<時間> 設定間隔時間

-u<使用者名稱> 指定使用者名稱

-p<程序號> 指定程序

-n<次數> 迴圈顯示的次數

 

4.使用例項:

例項1:顯示程序資訊

命令:top

輸出:

 

複製程式碼

程式碼如下:


[[email protected] log]# top
top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers
Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached</p>< p>PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java 
18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java 
2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java 
25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java 
574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java 
1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java 
1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java 
13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java 
28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top 
29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java 
1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init 
2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0 
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 
5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1 
6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 
8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2 
9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2 
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2 
11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3 
12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3 
13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3 
14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4 
15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4 
16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4 
17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5 
18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5 
19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5 
20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6 
21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6 
22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6 
23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7

 

top命令輸出內容詳細說明:

統計資訊區:

前五行是當前系統情況整體的統計資訊區。下面我們看每一行資訊的具體意義。

第一行,任務佇列資訊,同 uptime 命令的執行結果,具體引數說明情況如下:

14:06:23 — 當前系統時間

up 70 days, 16:44 — 系統已經運行了70天16小時44分鐘(在這期間系統沒有重啟過的吆!)

2 users — 當前有2個使用者登入系統

load average: 1.15, 1.42, 1.44 — load average後面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況。

load average資料是每隔5秒鐘檢查一次活躍的程序數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。

第二行,Tasks — 任務(程序),具體資訊說明如下:

系統現在共有206個程序,其中處於執行中的有1個,205個在休眠(sleep),stoped狀態的有0個,zombie狀態(殭屍)的有0個。

第三行,cpu狀態資訊,具體屬性說明如下:

5.9%us — 使用者空間佔用CPU的百分比。

3.4% sy — 核心空間佔用CPU的百分比。

0.0% ni — 改變過優先順序的程序佔用CPU的百分比

90.4% id — 空閒CPU百分比

0.0% wa — IO等待佔用CPU的百分比

0.0% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比

0.2% si — 軟中斷(Software Interrupts)佔用CPU的百分比

備註:在這裡CPU的使用比率和windows概念不同,需要理解linux系統使用者空間和核心空間的相關知識!

第四行,記憶體狀態,具體資訊如下:

32949016k total — 實體記憶體總量(32GB)

14411180k used — 使用中的記憶體總量(14GB)

18537836k free — 空閒記憶體總量(18GB)

169884k buffers — 快取的記憶體量 (169M)

第五行,swap交換分割槽資訊,具體資訊說明如下:

32764556k total — 交換區總量(32GB)

0k used — 使用的交換區總量(0K)

32764556k free — 空閒交換區總量(32GB)

3612636k cached — 緩衝的交換區總量(3.6GB)

 

備註:

第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閒記憶體總量(free)是核心還未納入其管控範圍的數量。納入核心管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重複利用的記憶體,核心並不把這些可被重新使用的記憶體交還到free中去,因此在linux上free記憶體會越來越少,但不用為此擔心。

如果出於習慣去計算可用記憶體數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此臺伺服器的可用記憶體:18537836k +169884k +3612636k = 22GB左右。

對於記憶體監控,在top裡我們要時刻監控第五行swap交換分割槽的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。

第六行,空行。

第七行以下:各程序(任務)的狀態監控,專案列資訊說明如下:

PID — 程序id

USER — 程序所有者

PR — 程序優先順序

NI — nice值。負值表示高優先順序,正值表示低優先順序

VIRT — 程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES

RES — 程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA

SHR — 共享記憶體大小,單位kb

S — 程序狀態。D=不可中斷的睡眠狀態 R=執行 S=睡眠 T=跟蹤/停止 Z=殭屍程序

%CPU — 上次更新到現在的CPU時間佔用百分比

%MEM — 程序使用的實體記憶體百分比

TIME+ — 程序使用的CPU時間總計,單位1/100秒

COMMAND — 程序名稱(命令名/命令列)

 

其他使用技巧:

1.多U多核CPU監控

在top基本檢視中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況:

觀察上圖,伺服器有16個邏輯CPU,實際上是4個物理CPU。再按數字鍵1,就會返回到top基本檢視介面。

2.高亮顯示當前執行程序

敲擊鍵盤“b”(開啟/關閉加亮效果),top的檢視變化如下:

     

我們發現程序id為2570的“top”程序被加亮了,top程序就是檢視第二行顯示的唯一的執行態(runing)的那個程序,可以通過敲擊“y”鍵關閉或開啟執行態程序的加亮效果。

3.程序欄位排序

預設進入top時,各程序是按照CPU的佔用量來排序的,在下圖中程序ID為28894的java程序排在第一(cpu佔用142%),程序ID為574的java程序排在第二(cpu佔用16%)。

      

    敲擊鍵盤“x”(開啟/關閉排序列的加亮效果),top的檢視變化如下:

       

可以看到,top預設的排序列是“%CPU”。

4. 通過”shift + >”或”shift + <”可以向右或左改變排序列

下圖是按一次”shift + >”的效果圖,檢視現在已經按照%MEM來排序。

        

例項2:顯示 完整命令

命令:top -c

輸出:

      

例項3:以批處理模式顯示程式資訊

命令:top -b

例項4:以累積模式顯示程式資訊

命令:top -S

例項5:設定資訊更新次數

命令:top -n 2

說明:表示更新兩次後終止更新顯示

例項6:設定資訊更新時間

命令:top -d 3

說明:表示更新週期為3秒

例項7:顯示指定的程序資訊

命令:top -p 574

輸出:

5.top互動命令

在top 命令執行過程中可以使用的一些互動命令。這些命令都是單字母的,如果在命令列中使用了s 選項, 其中一些命令可能會被遮蔽。

h 顯示幫助畫面,給出一些簡短的命令總結說明

k 終止一個程序。

i 忽略閒置和僵死程序。這是一個開關式命令。

q 退出程式

r 重新安排一個程序的優先級別

S 切換到累計模式

s 改變兩次重新整理之間的延遲時間(單位為s),如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s

f或者F 從當前顯示中新增或者刪除專案

o或者O 改變顯示專案的順序

l 切換顯示平均負載和啟動時間資訊

m 切換顯示記憶體資訊

t 切換顯示程序和CPU狀態資訊

c 切換顯示命令名稱和完整命令列

M 根據駐留記憶體大小進行排序

P 根據CPU使用百分比大小進行排序

T 根據時間/累計時間進行排序

W 將當前設定寫入~/.toprc檔案中  

 

二、要對系統中程序進行監測控制,用 ps 命令滿足你。

/bin/ps

ps 是顯示瞬間行程的狀態,並不動態連續;如果想對程序執行時間監控,應該用 top 工具。

kill 用於殺死程序。

==============ps 的引數說明============================

l 長格式輸出;

u 按使用者名稱和啟動時間的順序來顯示程序;

j 用任務格式來顯示程序;

f 用樹形格式來顯示程序;

a 顯示所有使用者的所有程序(包括其它使用者);

x 顯示無控制終端的程序;

r 顯示執行中的程序;

ww 避免詳細引數被截斷;


-A 列出所有的行程
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程

-e 顯示所有程序,環境變數
-f 全格式
-h 不顯示標題
-l 長格式
-w 寬輸出
a   顯示終端上地所有程序,包括其他使用者地程序
r   只顯示正在執行地程序
x   顯示沒有控制終端地程序

我們常用的選項是組合是 aux 或 lax,還有引數 f 的應用。

O[+|-] k1 [,[+|-] k2 [,…]] 根據SHORT KEYS、k1、k2中快捷鍵指定地多級排序順序顯示程序列表.
對於ps地不同格式都存在著預設地順序指定.這些預設順序可以被使用者地指定所覆蓋.在這裡面“+”字元是可選地,“-”字元是倒轉指定鍵地方向.
pids只列出程序識別符號,之間運用逗號分隔.該程序列表必須在命令列引數地最後一個選項後面緊接著給出,中間不能插入空格.比如:ps -f1,4,5.

下介紹長命令列選項,這些選項都運用“--”開頭:
--sort X[+|-] key [,[+|-] key [,…]] 從SORT KEYS段中選一個多字母鍵.“+”字元是可選地,因為預設地方向就是按數字升序或者詞典順序.比如: ps -jax -sort=uid,-

ppid,+pid.
--help 顯示幫助資訊.
--version 顯示該命令地版本資訊.

在前面地選項說明中提到了排序鍵,接下來對排序鍵作進一步說明.需要注意地是排序中運用地值是ps運用地內部值,並非僅用於某些輸出格式地偽值.排序鍵列表見下表.

============排序鍵列表==========================
c cmd   可執行地簡單名稱 
C cmdline   完整命令列 
f flags   長模式標誌 
g pgrp   程序地組ID 
G tpgid   控制tty程序組ID 
j cutime   累計使用者時間 
J cstime   累計系統時間 
k utime   使用者時間 
K stime   系統時間 
m min_flt   次要頁錯誤地數量 
M maj_flt   重點頁錯誤地數量 
n cmin_flt 累計次要頁錯誤 
N cmaj_flt 累計重點頁錯誤 
o session   對話ID 
p pid   程序ID 
P ppid   父程序ID 
r rss   駐留大小 
R resident 駐留頁 
s size   記憶體大小(千位元組) 
S share   共享頁地數量 
t tty   tty次要裝置號 
T start_time 程序啟動地時間 
U uid   UID
u user   使用者名稱
v vsize   總地虛擬記憶體數量(位元組) 
y priority 核心排程優先順序
================================================

=================ps aux 或 lax 輸出的解釋=========================

2、ps aux 或 lax 輸出的解釋

au(x) 輸出格式 : 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

USER: 程序所有者
PID: 程序ID

%CPU: 佔用的 CPU 使用率
%MEM: 佔用的記憶體使用率
VSZ: 佔用的虛擬記憶體大小
RSS: 佔用的記憶體大小

TTY: 終端的次要裝置號碼 (minor device number of tty)

STAT: 程序狀態:

START: 啟動程序的時間; 
TIME: 程序消耗CPU的時間;
COMMAND:命令的名稱和引數;

=================程序STAT狀態====================

D 無法中斷的休眠狀態(通常 IO 的程序); 
R 正在執行,在可中斷佇列中; 
S 處於休眠狀態,靜止狀態; 
T 停止或被追蹤,暫停執行; 
W 進入記憶體交換(從核心2.6開始無效); 
X 死掉的程序; 
Z 殭屍程序不存在但暫時無法消除;

W: 沒有足夠的記憶體分頁可分配
WCHAN 正在等待的程序資源;

<: 高優先順序程序
N: 低優先序程序
L: 有記憶體分頁分配並鎖在記憶體內 (即時系統或捱A I/O),即,有些頁被鎖進記憶體

s 程序的領導者(在它之下有子程序); 
l 多程序的(使用 CLONE_THREAD, 類似 NPTL pthreads); 
+ 位於後臺的程序組;

================kill 終止程序=========================

kill 終止程序

有十幾種控制程序的方法,下面是一些常用的方法:

kill -STOP [pid] 
傳送SIGSTOP (17,19,23)停止一個程序,而並不消滅這個程序。

kill -CONT [pid] 
傳送SIGCONT (19,18,25)重新開始一個停止的程序。

kill -KILL [pid] 
傳送SIGKILL (9)強迫程序立即停止,並且不實施清理操作。

kill -9 -1 
終止你擁有的全部程序。

SIGKILL 和 SIGSTOP 訊號不能被捕捉、封鎖或者忽略,但是,其它的訊號可以。所以這是你的終極武器。

=================範例========================

$ ps
PID TTY TIME COMMAND
5800 ttyp0 00:00:00 bash
5835 ttyp0 00:00:00 ps
可以看到,顯示地專案共分為四項,依次為PID(程序ID)、TTY(終端名稱)、TIME(程序執行時間)、COMMAND(該程序地命令列輸入).

可以運用u選項來檢視程序所有者及其他少許詳細資訊,如下所示:
$ ps u
USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND
test 5800 0.0 0.4 1892 1040 ttyp0 S Nov27 0:00 -bash
test 5836 0.0 0.3 2528 856 ttyp0 R Nov27 0:00 ps u

在bash程序前面有條橫線,意味著該程序便是使用者地登入shell,所以對於一個登入使用者來說帶短橫線地程序只有一個.還可以看到%CPU、%MEM兩個選項,前者指該程序佔用地CPU時間

和總時間地百分比;後者指該程序佔用地記憶體和總記憶體地百分比.
在這種情況下看到了所有控制終端地程序;當然對於其他那些沒有控制終端地程序還是沒有觀察到,所以這時就需要運用x選項.運用x選項可以觀察到所有地程序情況.

1)ps a 顯示現行終端機下的所有程式,包括其他使用者的程式。
2)ps -A 顯示所有程式。
3)ps c 列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,引數或常駐服務的標示。
4)ps -e 此引數的效果和指定"A"引數相同。
5)ps e 列出程式時,顯示每個程式所使用的環境變數。
6)ps f 用ASCII字元顯示樹狀結構,表達程式間的相互關係。
7)ps -H 顯示樹狀結構,表示程式間的相互關係。
8)ps -N 顯示所有的程式,除了執行ps指令終端機下的程式之外。
9)ps s 採用程式訊號的格式顯示程式狀況。
10)ps S 列出程式時,包括已中斷的子程式資料。
11)ps -t<終端機編號>  指定終端機編號,並列出屬於該終端機的程式的狀況。
12)ps u  以使用者為主的格式來顯示程式狀況。
13)ps x  顯示所有程式,不以終端機來區分。

 

三、虛擬記憶體的實時監控工具vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的伺服器的狀態值,包括伺服器的CPU使用率,記憶體使用,虛擬記憶體交換情況,IO讀寫情況。這個命令是我檢視Linux/Unix最喜愛的命令,一個是Linux/Unix都支援,二是相比top,我可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個程序的CPU使用率和記憶體使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:

[email protected]:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0

2表示每個兩秒採集一次伺服器狀態,1表示只採集一次。

實際上,在應用過程中,我們會在一段時間內一直監控,不想監控直接結束vmstat就行了,例如:

複製程式碼

 

[email protected]:~# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0

 

複製程式碼

這表示vmstat每2秒採集資料,一直採集,直到我結束程式,這裡採集了5次資料我就結束了程式。

好了,命令介紹完畢,現在開始實戰講解每個引數的意思。

r 表示執行佇列(就是說多少個程序真的分配到CPU),我測試的伺服器目前CPU比較空閒,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的執行佇列。如果執行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。

b 表示阻塞的程序,這個不多說,程序阻塞,大家懂的。

swpd 虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。

free   空閒的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。

buff   Linux/Unix系統是用來儲存,目錄裡面有什麼內容,許可權等的快取,我本機大概佔用300多M

cache cache直接用來記憶我們開啟的檔案,給檔案做緩衝,我本機大概佔用300多M(這裡是Linux/Unix的聰明之處,把空閒的實體記憶體的一部分拿來做檔案和目錄的快取,是為了提高 程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。)

si  每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。

so  每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。

bi  每秒從塊裝置接收的塊數量,這裡的塊裝置是指系統上所有的磁碟和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼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(機器在做壓力測試,效能表現不佳)。

sy 系統CPU時間,如果太高,表示系統呼叫時間長,例如是IO操作頻繁。

id  空閒 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

 

 

  Procs
       r: The number of processes waiting for run time.
       b: The number of processes in uninterruptible sleep.

   Memory
       swpd: the amount of virtual memory used.
       free: the amount of idle memory.
       buff: the amount of memory used as buffers.
       cache: the amount of memory used as cache.
       inact: the amount of inactive memory. (-a option)
       active: the amount of active memory. (-a option)

   Swap
       si: Amount of memory swapped in from disk (/s).
       so: Amount of memory swapped to disk (/s).

   IO
       bi: Blocks received from a block device (blocks/s).
       bo: Blocks sent to a block device (blocks/s).

   System
       in: The number of interrupts per second, including the clock.
       cs: The number of context switches per second.

   CPU
       These are percentages of total CPU time.
       us: Time spent running non-kernel code. (user time, including nice time)
       sy: Time spent running kernel code. (system time)
       id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
       wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
       st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

FIELD DESCRIPTION FOR DISK MODE
   Reads
       total: Total reads completed successfully
       merged: grouped reads (resulting in one I/O)
       sectors: Sectors read successfully
       ms: milliseconds spent reading

   Writes
       total: Total writes completed successfully
       merged: grouped writes (resulting in one I/O)
       sectors: Sectors written successfully
       ms: milliseconds spent writing

   IO
       cur: I/O in progress
       s: seconds spent for I/O

FIELD DESCRIPTION FOR DISK PARTITION MODE
       reads: Total number of reads issued to this partition
       read sectors: Total read sectors for partition
       writes : Total number of writes issued to this partition
       requested writes: Total number of write requests made for partition

       delay is the delay between updates in seconds.  If no delay is specified, only one report is printed with the average values since boot.

       count is the number of updates.  If no count is specified and delay is defined, count defaults to infinity.

       The -d reports disk statistics (2.5.70 or above required)

       count is the number of updates.  If no count is specified and delay is defined, count defaults to infinity.

       The -d reports disk statistics (2.5.70 or above required)

       The -p followed by some partition name for detailed statistics (2.5.70 or above required)

       The -S followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes

       The -V switch results in displaying version information.

FIELD DESCRIPTION FOR VM MODE
   Procs
       r: The number of processes waiting for run time.
       b: The number of processes in uninterruptible sleep.

   Memory
       swpd: the amount of virtual memory used.
       free: the amount of idle memory.
       buff: the amount of memory used as buffers.
       cache: the amount of memory used as cache.
       inact: the amount of inactive memory. (-a option)
       active: the amount of active memory. (-a option)

   Swap
       si: Amount of memory swapped in from disk (/s).
       so: Amount of memory swapped to disk (/s).

   IO
       bi: Blocks received from a block device (blocks/s).
       bo: Blocks sent to a block device (blocks/s).

   System
       in: The number of interrupts per second, including the clock.
       cs: The number of context switches per second.

   CPU

 

四、CPU的實時監控工具mpstat是Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中。在多CPUs系統裡,其不但能檢視所有CPU的平均狀況資訊,而且能夠檢視特定CPU的資訊。mpstat最大的特點是:可以檢視多核心cpu中每個計算核心的統計資料;而類似工具vmstat只能檢視系統整體cpu情況。

 

語法

複製程式碼

mpstat [-P {|ALL}] [internal [count]]
引數 解釋
-P {|ALL} 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值
internal 相鄰的兩次取樣的間隔時間、
count 取樣的次數,count只能和delay一起使用
當沒有引數時,mpstat則顯示系統啟動以後所有資訊的平均值。有interval時,第一行的資訊自系統啟動以來的平均資訊。從第二行開始,輸出為前一個interval時間段的平均資訊。

複製程式碼

 

例項

檢視多核CPU核心的當前執行狀況資訊, 每2秒更新一次

mpstat  219:45:12 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
19:45:14 all 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.96
19:45:16 all 0.00 0.00 0.00 0.03 0.00 0.00 0.00 0.00 99.97
19:45:18 all 0.00 0.07 0.07 0.00 0.00 0.00 0.00 0.00 99.87

 

如果要看每個cpu核心的詳細當前執行狀況資訊,輸出如下:

複製程式碼

複製程式碼

mpstat  -P ALL 2

19:43:58     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
19:43:59     all    0.00    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.96
19:43:59       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
.......
19:43:59      13    0.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.01
19:43:59      14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59      15    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

複製程式碼

複製程式碼

 

欄位的含義如下

複製程式碼

複製程式碼

%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

複製程式碼

複製程式碼

計算公式如下

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數點。

五、裝置IO負載的實時監控工具  iostat主要用於監控系統裝置的IO負載情況,iostat首次執行時顯示自系統啟動開始的各項統計資訊,之後執行iostat將顯示自上次執行該命令以後的統計資訊。使用者可以通過指定統計的次數和時間來獲得所需的統計資訊。

它的特點是彙報磁碟活動統計情況,同時也會彙報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個程序進行深入分析,僅對系統的整體情況進行分析。iostat屬於sysstat軟體包。可以用yum install sysstat 直接安裝。

1.命令格式:

iostat[引數][時間][次數]

2.命令功能:

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

3.命令引數:

-C 顯示CPU使用情況

-d 顯示磁碟使用情況

-k 以 KB 為單位顯示

-m 以 M 為單位顯示

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

-n 顯示NFS 使用情況

-p[磁碟] 顯示磁碟和分割槽的情況

-t 顯示終端和CPU的資訊

-x 顯示詳細資訊

-V 顯示版本資訊

4.使用例項:

iostat -d -k 2

引數 -d 表示,顯示裝置(磁碟)使用狀態;-k某些使用block為單位的列強制使用Kilobytes為單位;2表示,資料顯示每隔2秒重新整理一次。

輸出如下

複製程式碼

複製程式碼

iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
sda2              1.32         1.43         4.54   29834273   94827104
sda3              6.30         0.85        24.95   17816289  520725244
sda5              0.85         0.46         3.40    9543503   70970116
sda6              0.00         0.00         0.00        550        236
sda7              0.00         0.00         0.00        406          0
sda8              0.00         0.00         0.00        406          0
sda9              0.00         0.00         0.00        406          0
sda10            60.68        18.35        71.43  383002263 1490928140

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             327.55      5159.18       102.04       5056        100
sda1              0.00         0.00         0.00          0          0

複製程式碼

複製程式碼

輸出資訊的意義

複製程式碼

複製程式碼

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:寫入的總數量資料量;這些單位都為Kilobytes。

複製程式碼

複製程式碼

上面的例子中,我們可以看到磁碟sda以及它的各個分割槽的統計資料,當時統計的磁碟總TPS是39.29,下面是各個分割槽的TPS。(因為是瞬間值,所以總TPS並不嚴格等於各個分割槽TPS的總和)

 

指定監控的裝置名稱為sda,該命令的輸出結果和上面命令完全相同。

 iostat -d sda 2

預設監控所有的硬碟裝置,現在指定只監控sda。 

 

-x 引數

iostat還有一個比較常用的選項-x,該選項將用於顯示和io相關的擴充套件資料。

複製程式碼

iostat -d -x -k 1 10
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.80 31.49   42.51    2.92    21.26     1.46     1.16     0.03    0.79   2.62  10.28
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          2.00  20.00 381.00  7.00 12320.00  216.00  6160.00   108.00    32.31     1.75    4.50   2.17  84.20

複製程式碼

 

輸出資訊的含義

複製程式碼

複製程式碼

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響應時間應該低於5ms,如果大於10ms就比較大了。
         這個時間包括了佇列時間和服務時間,也就是說,一般情況下,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%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。

複製程式碼

複製程式碼

 -c 引數

iostat還可以用來獲取cpu部分狀態值:

iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67

 常見用法

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狀態

 例項分析

複製程式碼

複製程式碼

ostat -d -k 1 |grep sda10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda10            60.72        18.95        71.53  395637647 1493241908
sda10           299.02      4266.67       129.41       4352        132
sda10           483.84      4589.90      4117.17       4544       4076
sda10           218.00      3360.00       100.00       3360        100
sda10           546.00      8784.00       124.00       8784        124
sda10           827.00     13232.00       136.00      13232        136

複製程式碼

複製程式碼

上面看到,磁碟每秒傳輸次數平均約400;每秒磁碟讀取約5MB,寫入約1MB。

 

複製程式碼

iostat -d -x -k 1
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.84 31.50   43.65    3.16    21.82     1.58     1.19     0.03    0.80   2.61  10.29
sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67   126.73    32.15     2.00    4.70   2.00  85.25
sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57     2.10    4.21   1.85  92.24

複製程式碼

可以看到磁碟的平均響應時間<5ms,磁碟使用率>80。磁碟響應正常,但是已經很繁忙了。

六、檢視當前系統記憶體使用狀況(free):

    free命令有以下幾個常用選項:

選項 說明
-b 以位元組為單位顯示資料。
-k 以千位元組(KB)為單位顯示資料(預設值)。
-m 以兆(MB)為單位顯示資料。
-s delay 該選項將使free持續不斷的重新整理,每次重新整理之間的間隔為delay指定的秒數,如果含有小數點,將精確到毫秒,如0.5為500毫秒,1為一秒。

    free命令輸出的表格中包含以下幾列:

列名 說明
total 總計實體記憶體的大小。
used 已使用的記憶體數量。
free 可用的記憶體數量。
Shared 多個程序共享的記憶體總額。
Buffers/cached 磁碟快取的大小。


    見以下具體示例和輸出說明:
    /> free -k
                        total         used          free     shared    buffers     cached
    Mem:       1031320     671776     359544          0      88796     352564
    -/+ buffers/cache:      230416     800904
    Swap:        204792              0     204792
    對於free命令的輸出,我們只需關注紅色高亮的輸出行和綠色高亮的輸出行,見如下具體解釋:
    紅色輸出行:該行使從作業系統的角度來看待輸出資料的,used(671776)表示核心(Kernel)+Applications+buffers+cached。free(359544)表示系統還有多少記憶體可供使用。
    綠色輸出行:該行則是從應用程式的角度來看輸出資料的。其free = 作業系統used + buffers + cached,既:
    800904 = 359544 + 88796 + 352564
    /> free -m
                      total        used        free      shared    buffers     cached
    Mem:          1007         656        351            0         86            344
    -/+ buffers/cache:        225        782
    Swap:          199             0        199
    /> free -k -s 1.5  #以千位元組(KB)為單位顯示資料,同時每隔1.5重新整理輸出一次,直到按CTRL+C退出
                      total        used       free     shared    buffers     cached
    Mem:          1007         655        351          0           86        344
    -/+ buffers/cache:        224        782
    Swap:          199             0        199

                      total        used       free     shared    buffers     cached
    Mem:          1007         655        351          0           86        344
    -/+ buffers/cache:        224        782
    Swap:          199             0        199

七、報告磁碟空間使用狀況(df):
    該命令最為常用的選項就是-h,該選項將智慧的輸出資料單位,以便使輸出的結果更具可讀性。
    /> df -h
    Filesystem             Size  Used   Avail Use% Mounted on
    /dev/sda1             5.8G  3.3G  2.2G  61%   /
    tmpfs                  504M  260K  504M   1%  /dev/shm

八、評估磁碟的使用狀況(du):

選項 說明
-a 包括了所有的檔案,而不只是目錄。
-b 以位元組為計算單位。
-k 以千位元組(KB)為計算單位。
-m 以兆位元組(MB)為計算單位。
-h 是輸出的資訊更易於閱讀。
-s 只顯示工作目錄所佔總空間。
--exclude=PATTERN 排除掉符合樣式的檔案,Pattern就是普通的Shell樣式,?表示任何一個字元,*表示任意多個字元。
--max-depth=N 從當前目錄算起,目錄深度大於N的子目錄將不被計算,該選項不能和s選項同時存在。 
 

    #僅顯示子一級目錄的資訊。
    /> du --max-depth=1 -h
    246M    ./stephen
    246M    .    
    /> du -sh ./*   #獲取當前目錄下所有子目錄所佔用的磁碟空間大小。
    352K    ./MemcachedTest
    132K    ./Test
    33M     ./thirdparty    
    #在當前目錄下,排除目錄名模式為Te*的子目錄(./Test),輸出其他子目錄佔用的磁碟空間大小。
    /> du --exclude=Te* -sh ./*  
    352K    ./MemcachedTest
    33M     ./thirdparty

 

sar
sar [options] [-A] [-o file] t [n]

在命令列中,n 和t 兩個引數組合起來定義取樣間隔和次數,t為取樣間隔,是必須有
的引數,n為取樣次數,是可選的,預設值是1,-o file表示將命令結果以二進位制格式
存放在檔案中,file 在此處不是關鍵字,是檔名。options 為命令列選項,sar命令
的選項很多,下面只列出常用選項:

-A:所有報告的總和。
-u:CPU利用率
-v:程序、I節點、檔案和鎖表狀態。
-d:硬碟使用報告。
-r:記憶體和交換空間的使用統計。
-g:串列埠I/O的情況。
-b:緩衝區使用情況。
-a:檔案讀寫情況。
-c:系統呼叫情況。
-q:報告佇列長度和系統平均負載
-R:程序的活動情況。
-y:終端裝置活動情況。
-w:系統交換活動。
-x { pid | SELF | ALL }:報告指定程序ID的統計資訊,SELF關鍵字是sar程序本身的統計,ALL關鍵字是所有系統程序的統計。

用sar進行CPU利用率的分析
#sar -u 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain)  03/28/2009
07:40:17 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
07:40:19 PM       all         12.44      0.00         6.97          1.74         0.00        78.86
07:40:21 PM       all         26.75      0.00        12.50         16.00       0.00        44.75
07:40:23 PM       all         16.96      0.00         7.98          0.00         0.00        75.06
07:40:25 PM       all         22.50      0.00         7.00          3.25         0.00        67.25
07:40:27 PM       all         7.25        0.00         2.75          2.50         0.00        87.50
07:40:29 PM       all         20.05      0.00         8.56          2.93         0.00        68.46
07:40:31 PM       all         13.97      0.00         6.23          3.49         0.00        76.31
07:40:33 PM       all         8.25        0.00         0.75          3.50         0.00        87.50
07:40:35 PM       all         13.25      0.00         5.75          4.00         0.00        77.00
07:40:37 PM       all         10.03      0.00         0.50          2.51         0.00        86.97
Average:             all         15.15      0.00         5.91          3.99         0.00        74.95
 
在顯示內容包括:

  %user:CPU處在使用者模式下的時間百分比。
        %nice:CPU處在帶NICE值的使用者模式下的時間百分比。
  %system:CPU處在系統模式下的時間百分比。
  %iowait:CPU等待輸入輸出完成時間的百分比。
        %steal:管理程式維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
  %idle:CPU空閒時間百分比。
        在所有的顯示中,我們應主要注意%iowait和%idle,%iowait的值過高,表示硬碟存在I/O瓶頸,%idle值高,表示CPU較空閒,如果%idle值高但系統