1、top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器html
下面詳細介紹它的使用方法。top是一個動態顯示過程,便可以經過用戶按鍵來不斷刷新當前狀態.若是在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止.比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最「敏感」的任務列表.該命令能夠按CPU使用.內存使用和執行時間對任務進行排序;並且該命令的不少特性均可以經過交互式命令或者在我的定製文件中進行設定.java
1.命令格式:linux
top [參數]ios
2.命令功能:nginx
顯示當前系統正在執行的進程的相關信息,包括進程ID、內存佔用率、CPU佔用率等web
3.命令參數:算法
-b 批處理shell
-c 顯示完整的治命令express
-I 忽略失效過程apache
-s 保密模式
-S 累積模式
-i<時間> 設置間隔時間
-u<用戶名> 指定用戶名
-p<進程號> 指定進程
-n<次數> 循環顯示的次數
4.使用實例:
實例1:顯示進程信息
命令:top
輸出:
代碼以下:
[root@TG1704 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文件中
2、要對系統中進程進行監測控制,用 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、k一、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 輸出的解釋=========================
二、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 顯示全部程序,不以終端機來區分。
3、虛擬內存的實時監控工具vmstat命令是最多見的Linux/Unix監控工具,能夠展示給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換狀況,IO讀寫狀況。這個命令是我查看Linux/Unix最喜好的命令,一個是Linux/Unix都支持,二是相比top,我能夠看到整個機器的CPU,內存,IO的使用狀況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不同)。
通常vmstat工具的使用是經過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:
root@ubuntu:~# 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就好了,例如:
root@ubuntu:~# 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
4、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時間前的值。上表中的全部值可取到兩位小數點。 5、設備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。
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。磁盤響應正常,可是已經很繁忙了。
6、查看當前系統內存使用情況(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
7、報告磁盤空間使用情況(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
8、評估磁盤的使用情況(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值高但系統響應慢時,有多是CPU等待分配內存,此時應加大內存容量。%idle值若是持續低於10,那麼系統的CPU處理能力相對較低,代表系統中最須要解決的資源是CPU。 用sar進行運行進程隊列長度分析: #sar -q 2 10 Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/28/2009 07:58:14 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 07:58:16 PM 0 493 0.64 0.56 0.49 07:58:18 PM 1 491 0.64 0.56 0.49 07:58:20 PM 1 488 0.59 0.55 0.49 07:58:22 PM 0 487 0.59 0.55 0.49 07:58:24 PM 0 485 0.59 0.55 0.49 07:58:26 PM 1 483 0.78 0.59 0.50 07:58:28 PM 0 481 0.78 0.59 0.50 07:58:30 PM 1 480 0.72 0.58 0.50 07:58:32 PM 0 477 0.72 0.58 0.50 07:58:34 PM 0 474 0.72 0.58 0.50 Average: 0 484 0.68 0.57 0.49 runq-sz 準備運行的進程運行隊列。 plist-sz 進程隊列裏的進程和線程的數量 ldavg-1 前一分鐘的系統平均負載(load average) ldavg-5 前五分鐘的系統平均負載(load average) ldavg-15 前15分鐘的系統平均負載(load average) 順便說一下load avarage的含義 load average能夠理解爲每秒鐘CPU等待運行的進程個數. 在Linux系統中,sar -q、uptime、w、top等命令都會有系統平均負載load average的輸出,那麼什麼是系統平均負載呢? 系統平均負載被定義爲在特定時間間隔內運行隊列中的平均任務數。若是一個進程知足如下條件則其就會位於運行隊列中: - 它沒有在等待I/O操做的結果 - 它沒有主動進入等待狀態(也就是沒有調用'wait') - 沒有被中止(例如:等待終止) 例如: # uptime 20:55:40 up 24 days, 3:06, 1 user, load average: 8.13, 5.90, 4.94 命令輸出的最後內容表示在過去的一、五、15分鐘內運行隊列中的平均進程數量。 通常來講只要每一個CPU的當前活動進程數不大於3那麼系統的性能就是良好的,若是每一個CPU的任務數大於5,那麼就表示這臺機器的性能有嚴重問題。對 於上面的例子來講,假設系統有兩個CPU,那麼其每一個CPU的當前任務數爲:8.13/2=4.065。這表示該系統的性能是能夠接受的。