內容:html
一. 命令詳解node
二. 識別cpu/io/內存/network瓶頸,及決方法啊linux
經常使用的和性能有關的命令ios
Iostat/vmstat/top/mpstat/time/strace/ipcs/ipcrm/ifconfig/tethereal/netstat/free/uptime算法
一.命令詳解緩存
1. Top命令詳解:網絡
參考:http://bbs.linuxtone.org/thread-1684-1-1.htmloracle
[root@localhost ~]# topapp
top - 12:08:54 up 1 day, 21:06, 2 users, load average: 0.16, 0.11, 0.06異步
Tasks: 123 total, 2 running, 121 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.9% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 8173076k total, 3188184k used, 4984892k free, 147472k buffers
Swap: 10223608k total, 0k used, 10223608k free, 2833104k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 16 0 4772 564 468 S 0.0 0.0 0:01.34 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/2
7 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/2
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/3
9 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/3
10 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/4
11 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/4
12 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/5
13 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/5
14 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/6
15 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/6
16 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/7
17 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/7
top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器; top是一個動態顯示過程,便可以經過用戶按鍵來不斷刷新當前狀態.若是在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止.
默認狀況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。能夠經過下面的快捷鍵來更改顯示內容。
1. 更改顯示內容經過 f 鍵能夠選擇顯示的內容。按 f 鍵以後會顯示列的列表,按 a-z 便可顯示或隱藏對應的列,最後按回車鍵肯定。
2. 按 o 鍵能夠改變列的顯示順序。按小寫的 a-z 能夠將相應的列向右移動,而大寫的 A-Z 能夠將相應的列向左移動。最後按回車鍵肯定。
3. 按大寫的 F 或 O 鍵,而後按 a-z 能夠將進程按照相應的列進行排序。而大寫的 R 鍵能夠將當前的排序倒轉。
統計信息區前五行是系統總體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容以下:
12:08:54
當前時間
up 1 day, 21:06
系統運行時間,格式爲時:分
2 user
當前登陸用戶數
load average: 0.16, 0.11, 0.06
系統負載,即任務隊列的平均長度。
三個數值分別爲 1分鐘、5分鐘、15分鐘前到如今的平均值。
第2、三行爲進程和CPU的信息。當有多個CPU時,經過按鍵「1「能夠在總cpu和每一個cpu信息之間切換,這些內容可能會超過兩行。內容以下:
Tasks: 123 total
進程總數
2 running
正在運行的進程數
121 sleeping
睡眠的進程數
0 stopped
中止的進程數
0 zombie
殭屍進程數
Cpu(s): 0.0% us
用戶空間佔用CPU百分比
0.0% sy
內核空間佔用CPU百分比
0.0% ni
用戶進程空間內改變過優先級的進程佔用CPU百分比
99.9% id
空閒CPU百分比
0.0% wa
等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si
最後兩行爲內存信息。內容以下:
Mem: 8173076k total
物理內存總量
3188184k used
使用的物理內存總量
4984892k free
空閒內存總量
147472k buffers
用做內核緩存的內存量
Swap: 10223608k total
交換區總量
0k used
使用的交換區總量
10223608k free
空閒交換區總量
2833104k cached
緩衝的交換區總量。
內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋,
該數值即爲這些內容已存在於內存中的交換區的大小。
相應的內存再次被換出時可沒必要再對交換區寫入。
進程信息區統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號
列名
含義
a
PID
進程id
b
PPID
父進程id
c
RUSER
Real user name
d
UID
進程全部者的用戶id
e
USER
進程全部者的用戶名
f
GROUP
進程全部者的組名
g
TTY
啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?
h
PR
優先級
i
NI
nice值。負值表示高優先級,正值表示低優先級
j
P
最後使用的CPU,僅在多CPU環境下有意義
k
%CPU
上次更新到如今的CPU時間佔用百分比
l
TIME
進程使用的CPU時間總計,單位秒
m
TIME+
進程使用的CPU時間總計,單位1/100秒
n
%MEM
進程使用的物理內存百分比
o
VIRT
進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p
SWAP
進程使用的虛擬內存中,被換出的大小,單位kb。
q
RES
進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r
CODE
可執行代碼佔用的物理內存大小,單位kb
s
DATA
可執行代碼之外的部分(數據段+棧)佔用的物理內存大小,單位kb
t
SHR
共享內存大小,單位kb
u
nFLT
頁面錯誤次數
v
nDRT
最後一次寫入到如今,被修改過的頁面數。
w
S
進程狀態。
D=不可中斷的睡眠狀態
R=運行
S=睡眠
T=跟蹤/中止
Z=殭屍進程
x
COMMAND
命令名/命令行
y
WCHAN
若該進程在睡眠,則顯示睡眠中的系統函數名
z
Flags
任務標誌,參考 sched.h
2. vmstat命令詳解
[root@localhost ~]# vmstat 1 5
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 4886396 147552 2905036 0 0 1 4 4 3 0 0 100 0
0 0 0 4886396 147552 2905036 0 0 0 228 4144 4103 1 1 98 0
0 0 0 4886396 147552 2905036 0 0 0 88 1964 1286 0 0 99 0
0 0 0 4886396 147552 2905036 0 0 0 100 2321 2007 1 0 99 0
1 0 0 4886332 147552 2905036 0 0 0 156 2647 2265 1 0 99 0
[root@localhost ~]#
usage: vmstat [-V] [-n] [delay [count]]
-V prints version.
-n causes the headers not to be reprinted regularly.
-a print inactive/active page stats.
-d prints disk statistics
-D prints disk table
-p prints disk partition statistics
-s prints vm table
-m prints slabinfo
-S unit size
delay is the delay between updates in seconds.
unit size k:1000 K:1024 m:1000000 M:1048576 (default is K)
count is the number of updates.
vmstat是一個至關全面的性能分析工具,能夠觀察到系統的進程狀態、內存使用、虛擬內存使用、磁盤的IO、中斷、上下問切換、CPU使用等性能信息
Procs
r: The number of processes waiting for run time.(運行的和等待(CPU時間片)運行的進程數,這個值也能夠判斷是否須要增長CPU(長期大於cpu個數))
b: The number of processes in uninterruptible sleep.(處於不可中斷狀態的進程數,這個值通常爲2-3倍cpu的個數就代表cpu排隊比較嚴要了,常見的狀況是由IO引發的)
Memory
swpd: the amount of virtual memory used.(如今已經使用的虛擬內存,單位k)
free: the amount of idle memory.(空閒物理內存,單位k)
buff: the amount of memory used as buffers.(做爲buffer使用的物理內存,對塊設備讀寫進行緩衝,單位k)
cache: the amount of memory used as cache. (做爲cache使用的物理內存,對文件系統的緩衝,單位k)
inact: the amount of inactive memory. (-a option) (沒有活動的物理內存,單位k)
active: the amount of active memory. (-a option) (有活動的物理內存,單位k)
buffer和cache的區別:
buffers are only used for file metadata (inodes, etc) and data from raw block devices. It's accessed via block device and block number.
Cache has file data blocks, and memory mapped information (i.e. files mapped with mmap() calls). It's accessed primarily via inode number.
So, the main difference would be scope, One's more concerened with blocks on a device, the other with information in a file.
buffer and cache both can flush to disk, however. The buffer to the device file and the cache through the file system layer to the block device.
Swap
si: Amount of memory swapped in from disk (k/s). (每秒由磁盤調入內存的數量)
so: Amount of memory swapped to disk (k/s). (每秒由內存調入磁盤的數量)
IO
bi: Blocks received from a block device (blocks/s). (從塊設備讀入的數據塊數量)
bo: Blocks sent to a block device (blocks/s). (寫到塊設備的數據塊數量)
若是這兩個值比較大,說明io的壓力也較大,cpu在io的等待可能也會大
System
in: The number of interrupts per second, including the clock. (每秒產生中斷的次數)
cs: The number of context switches per second.(每秒產生上下文切換的次數)
這個兩個值比較大說明,說明消耗內核上cpu較多,可能不合理的使用cpu
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time) (用戶進程使用cpu的時間)
sy: Time spent running kernel code. (system time) (內核進程使用cpu的時間)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.(空閒事件使用cpu的時間,這個值越小,說明cpu可能很忙)
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero. (等待io使用cpu的時間)
3. iostat命令詳解
iostat用於監控cpu的統計信息和磁盤的統計信息
[oracle@localhost ~]$ iostat
Linux 2.6.9-78.ELsmp (localhost) 09/29/2010
avg-cpu: %user %nice %sys %iowait %idle
0.18 0.00 0.08 0.02 99.72
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 8.48 26.06 111.87 6429617 27601457
sda1 0.00 0.00 0.00 628 0
sda2 0.00 0.01 0.00 1654 33
sda3 8.48 26.05 111.87 6426351 27601424
dm-0 14.65 26.04 111.87 6425698 27601424
dm-1 0.00 0.00 0.00 360 0
cpu的統計信息,若是是多cpu系統,顯示的全部cpu的平均統計信息。
%user:用戶進程消耗cpu的比例
%nice:用戶進程優先級調整消耗的cpu比例
%sys:系統內核消耗的cpu比例
%iowait:等待磁盤io所消耗的cpu比例
%idle:閒置cpu的比例(不包括等待磁盤io的s)
磁盤的統計信息:
Device:設備的名稱
Tps:設備上每秒的io傳輸(可能多個io被組成一個io)的次數
Blk_read/s:每秒從設備讀取block(kernel 2.4以上,block=512byte)的數量
Blk_wrtn/s:每秒寫到設備block(kernel 2.4以上,block=512byte)的數量
Blk_read:間隔時間內,從設備讀取總的block數量
Blk_wrtn:間隔時間內,寫到設備總的block數量
默認iostat不帶任何參數顯示的是概要信息,若是要看更比較詳細的信息,能夠用「iostat –x「,例子以下:
[root@localhost ~]# iostat -x
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
avg-cpu: %user %nice %sys %iowait %idle
0.14 0.00 0.07 0.01 99.78
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 0.04 5.08 0.46 6.74 19.21 94.55 9.60 47.27 15.80 0.01 0.93 0.18 0.13
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 26.17 0.00 3.08 2.83 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.57 0.00 0.99 0.84 0.00
sda3 0.03 5.08 0.46 6.74 19.20 94.55 9.60 47.27 15.80 0.01 0.93 0.18 0.13
dm-0 0.00 0.00 0.49 11.82 19.19 94.55 9.60 47.27 9.24 0.36 29.58 0.11 0.13
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 6.22 0.62 0.00
字段說明:
rrqm/s:每秒進行merge(多個io的合併)讀操做的數量
wrqm/s:每秒進行merge(多個io的合併)寫操做的數量
r/s:每秒完成讀io設備的次數
w/s:每秒完成寫io設備的次數
rsec/s:每秒讀扇區的次數
wsec/s:每秒寫扇區的次數
rkB/s:每秒讀多少k字節,在kernel2.4以上,rkB/s=2×rsec/s,由於一個扇區爲512bytes
wkB/s:每秒寫多少k字節,在kernel2.4以上,wkB/s =2×wsec/s,由於一個扇區爲512bytes
avgrq-sz:平均每次io設備的大小(以扇區爲單位),由於有merge讀或寫,因此每次io大小須要計算
avgqu-sz:平均I/O隊列長度
await:每次io設備的等待時間,也包括io服務時間(毫秒)。
await的大小通常取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。
若是 svctm 比較接近 await,說明I/O 幾乎沒有等待時間;
若是 await 遠大於 svctm,說明 I/O隊列太長,應用獲得的響應時間變慢,
若是響應時間超過了用戶能夠允許的範圍,這時能夠考慮更換更快的磁盤,調整內核 elevator算法,優化應用,或者升級 CPU。
隊列長度(avgqu-sz)也可做爲衡量系統 I/O 負荷的指標,但因爲 avgqu-sz 是按照單位時間的平均值,因此不能反映瞬間的 I/O 洪水
svctm:每次io設備的服務時間(毫秒),它的大小通常和磁盤性能有關:CPU/內存的負荷也會對其有影響,請求過多也會間接致使 svctm 的增長
%util:處理io操做的cpu比例,若是這個着接近100%,說明io請求很是多,cpu的全部時間都用來處理io請求,io系統負載很大(也有可能cpu資源不足),磁盤可能存在瓶頸;在%util等於70%的時候,io的讀取就會有不少等待。
下面是別人寫的這個參數輸出的分析
# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
上面的 iostat 輸出代表秒有 28.57 次設備 I/O 操做: 總IO(io)/s = r/s(讀) +w/s(寫) = 1.02+27.55 = 28.57 (次/秒) 其中寫操做佔了主體 (w:r = 27:1)。
平均每次設備 I/O 操做只須要 5ms 就能夠完成,但每一個 I/O 請求卻須要等上 78ms,爲何? 由於發出的 I/O 請求太多 (每秒鐘約 29 個),假設這些請求是同時發出的,那麼平均等待時間能夠這樣計算:
平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + ... + 請求總數-1) / 請求總數
應用到上面的例子: 平均等待時間 = 5ms * (1+2+...+28)/29 = 70ms,和 iostat 給出的78ms 的平均等待時間很接近。這反過來代表 I/O 是同時發起的。
每秒發出的 I/O 請求不少 (約 29 個),平均隊列卻不長 (只有 2 個 左右),這代表這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的。
一秒中有 14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裏 I/O 系統無事可作,全部 29 個 I/O 請求都在142毫秒以內處理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s=78.21 * delta(io)/s = 78.21*28.57 =2232.8,代表每秒內的I/O請求總共須要等待2232.8ms。因此平均隊列長度應爲 2232.8ms/1000ms = 2.23,而iostat 給出的平均隊列長度 (avgqu-sz) 卻爲 22.35,爲何?! 由於 iostat 中有 bug,avgqu-sz值應爲 2.23,而不是 22.35。
4. sar命令詳解
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關鍵字是全部系統進程的統計
查看cpu
[root@localhost ~]# sar -u 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
06:08:27 PM CPU %user %nice %system %iowait %idle
06:08:28 PM all 0.00 0.00 0.00 0.00 100.00
06:08:29 PM all 0.00 0.00 0.12 0.00 99.88
06:08:30 PM all 0.00 0.00 0.00 0.00 100.00
06:08:30 PM CPU %user %nice %system %iowait %idle
06:08:31 PM all 0.00 0.00 0.00 0.00 100.00
06:08:32 PM all 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.02 0.00 99.98
在顯示內容包括:
%user:CPU處在用戶模式下的時間百分比。
%nice:CPU處在帶NICE值的用戶模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完成時間的百分比。
%idle:CPU空閒時間百分比。
在全部的顯示中,咱們應主要注意%iowait和%idle,%iowait的值太高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閒,若是%idle值高但系統響應慢時,有多是CPU等待分配內存,此時應加大內存容量。%idle值若是持續低於10,那麼系統的CPU處理能力相對較低,代表系統中最須要解決的資源是CPU。
查看io
[root@localhost ~]# sar -b 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
06:10:06 PM tps rtps wtps bread/s bwrtn/s
06:10:07 PM 0.00 0.00 0.00 0.00 0.00
06:10:08 PM 3.00 0.00 3.00 0.00 48.00
06:10:09 PM 2.00 0.00 2.00 0.00 112.00
06:10:09 PM tps rtps wtps bread/s bwrtn/s
06:10:10 PM 21.78 0.00 21.78 0.00 213.86
06:10:11 PM 3.00 0.00 3.00 0.00 48.00
Average: 5.99 0.00 5.99 0.00 84.63
查看物理內存和swap空間使用信息
[root@localhost ~]# sar -r 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
06:12:21 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
06:12:22 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:23 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:24 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:24 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
06:12:25 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:26 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
Average: 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
查看網卡流量統計
root@localhost ~]# sar -n EDEV 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
06:18:22 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:23 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:24 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:25 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:26 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:27 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
查看運行進程隊列長度
[root@localhost ~]# sar -q 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010
08:00:04 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
08:00:05 PM 0 127 0.02 0.16 0.10
08:00:06 PM 0 127 0.02 0.16 0.10
08:00:07 PM 0 127 0.02 0.16 0.10
08:00:07 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
08:00:08 PM 0 127 0.02 0.16 0.10
08:00:09 PM 0 127 0.01 0.16 0.10
Average: 0 127 0.02 0.16 0.10
字段說明:
runq-sz: 準備運行的進程運行隊列。
plist-sz: 進程隊列裏的進程和線程的數量
ldavg-1: 前一分鐘的系統平均負載(load average)
ldavg-5 : 前五分鐘的系統平均負載(load average)
ldavg-15 : 前15分鐘的系統平均負載(load average)
通常來講只要每一個CPU的當前活動進程數不大於3那麼系統的性能就是良好的,若是每一個CPU的任務數大於5,那麼就表示這臺機器的性能有嚴重問題。負載/cpu數量,表示每一個cpu的活動進程數
5. ps命令詳解
ps用戶查看進程的相關信息,和top相似
查看系統當前運行的全部進程
ps –ef 或ps auxw
其中參數a表示顯示系統中全部用戶的的進程;u表示輸出進程用戶所屬信息; x表示也顯示沒有控制檯的進程;w表示加寬能夠顯示較多的資訊;若顯示行太長而被截斷則可使用f參數
[root@localhost ~]# ps -auxw|more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4772 564 ? S Sep26 0:01 init [5]
root 2 0.0 0.0 0 0 ? S Sep26 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S Sep26 0:00 [migration/1]
root 5 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/1]
root 6 0.0 0.0 0 0 ? S Sep26 0:00 [migration/2]
root 7 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/2]
root 8 0.0 0.0 0 0 ? S Sep26 0:00 [migration/3]
root 9 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/3]
root 10 0.0 0.0 0 0 ? S Sep26 0:00 [migration/4]
root 11 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/4]
字段說明:
USER: 行程擁有者
PID: pid
%CPU: 佔用的 CPU 使用率
%MEM: 佔用的記憶體使用率
VSZ: 佔用的虛擬記憶體大小
RSS: 佔用的記憶體大小
TTY: 終端的次要裝置號碼 (minor device number of tty)
STAT: 該行程的狀態:
D: 不可中斷的靜止 (通悸□□縝b進行 I/O 動做)
R: 正在執行中
S: 靜止狀態
T: 暫停執行
Z: 不存在但暫時沒法消除
W: 沒有足夠的記憶體分頁可分配
<: 高優先序的行程
N: 低優先序的行程
L: 有記憶體分頁分配並鎖在記憶體內 (即時系統或捱A I/O)
START: 行程開始時間
TIME: 執行的時間
COMMAND:所執行的指令
6. time命令詳解
查看命令運行的時間
[root@localhost ~]# time ps -ef | wc -l
134
real 0m0.009s
user 0m0.004s
sys 0m0.006s
7. pstree命令詳解
顯示進程的樹形結構
[root@localhost ~]# pstree |more
init─┬─acpid
├─atd
├─crond
├─cups-config-dae
├─cupsd
├─dbus-daemon-1
├─dhclient
├─events/0─┬─aio/0
│ ├─aio/1
│ ├─aio/2
│ ├─aio/3
│ ├─aio/4
│ ├─aio/5
│ ├─aio/6
│ ├─aio/7
│ ├─kacpid
│ ├─kblockd/0
│ ├─kblockd/1
│ ├─kblockd/2
│ ├─kblockd/3
│ ├─kblockd/4
│ ├─kblockd/5
│ ├─kblockd/6
│ ├─kblockd/7
--More—
8. 進程的跟蹤命令介紹
進程沒法啓動,軟件運行速度忽然變慢,程序的"SegmentFault"等等都是讓每一個Unix系統用戶頭痛的問題,能夠用這些進程跟蹤命令來診斷(在aix上有相似gdb命令)
truss和strace:用來跟蹤一個進程的系統調用或信號產生的狀況,
ltrace:用來跟蹤進程調用庫函數的狀況。
這三個命令的用戶基本相同,介紹下經常使用的參數
-f :除了跟蹤當前進程外,還跟蹤其子進程。
-o file :將輸出信息寫到文件file中,而不是顯示到標準錯誤輸出(stderr)。
-p pid :綁定到一個由pid對應的正在運行的進程。此參數經常使用來調試後臺進程。
-e execve :只記錄 execve 這類系統調用
9. 網絡相關命令
ifconfig # 查看全部網絡接口的屬性
netstat -lntp # 查看全部監聽端口
netstat -antp # 查看全部已經創建的鏈接
netstat -s # 查看網絡統計信息進程
tethereal
iptraf:能夠監控網絡流量
安裝方式:
1.官網及下載 http://iptraf.seul.org/download.html
2. get ftp://iptraf.seul.org/pub/iptraf/iptraf-3.0.0.tar.gz
3. yum install -y iptraf
帶說明:
10.Ipcs和Ipcrm命令詳解
Ipcs和ipcrm是管理System V IPC對象的(消息、信號量(semaphores)和共享內存),在平常工做中,有時會遇到共享內存沒法釋放。這個時候就能夠經過ipcs查詢,ipcrm刪除
樣例:
ipcs [-m|-q|-s]
-m 輸出有關共享內存(shared memory)的信息
-q 輸出有關信息隊列(message queue)的信息
-s 輸出有關「遮斷器」(semaphore)的信息
#ipcs -m
刪除ipc
ipcrm -m|-q|-s shm_id
#ipcrm -m 105
參考:http://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_6519.html
性能分析分類彙總:
進程性能分析相關的命令:
top,ps,pstree
Cpu性能分析相關命令:
vmstat,sar,time,top
Memory性能分析相關命令:
vmstat,top,ipcs,ipcrm,cat /proc/meminfo,cat /proc/slabinfo,cat /proc/<pid #>/maps
io性能分析相關命令:
vmstat,iostat,
網絡性能分析相關命令:
Ifconfig,netstat,tethereal,sar –n EDEV
二. 識別cpu/io/內存/network瓶頸,及決方法啊
1. 識別cpu性能瓶頸
衡量Cpu性能指標:
1. 用戶使用CPU的狀況;
CPU運行常規用戶進程
CPU運行niced process
CPU運行實時進程
2. 系統使用CPU狀況;
用於I/O管理:中斷和驅動
用於內存管理:頁面交換
用戶進程管理:進程開始和上下文切換
3.WIO:用於進程等待磁盤I/O而使CPU處於空閒狀態的比率。
4.CPU的空閒率,除了上面的WIO之外的空閒時間
5.CPU用於上下文交換的比率
6.nice
7.real-time
8.運行進程隊列的長度
9.平均負載
用於查看cpu性能的命令有:vmstat,iostat,sar,top,strace
既然已經知道cpu性能指標了,那就用命令查看確認
步驟一:先用vmstat查看系統的cpu總體運行情況
[root@localhost ~]# vmstat -n 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1282844 176332 6389000 0 0 1 6 10 8 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1028 120 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 8 1011 41 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 28 1033 146 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 40 1009 31 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1048 156 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 24 1010 35 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1026 119 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1017 63 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 24 1032 141 0 0 100 0
紅色的字表是和cpu性能有關的
r: 若是在procs中運行的序列(process r)是連續的大於在系統中的CPU的個數,表示cpu比較忙,系統如今運行比較慢,有多數的進程等待CPU.。若是r的輸出數大於系統中可用CPU個數的4倍的話, 則系統面臨着CPU短缺的問題,或者是CPU的速率太低,系統中有多數的進程在等待CPU,形成系統中進程運行過慢.
b : 若是在procs中運行的序列(process b), 即處於不可中斷狀態的進程數,連續我爲cpu的2-3倍就代表cpu排隊比較嚴要了
SYSTEM
in:每秒產生的中斷次數
cs:每秒產生的上下文切換次數
上面2個值越大,會看到由內核消耗的CPU時間會越大
CPU
us:用戶進程消耗的CPU時間百分,
us的值比較高時,說明用戶進程消耗的CPU時間多,在服務高峯期持續大於50-60,是能夠接受,可是若是長期超50%的使用,那麼咱們就該考慮優化程序算法或者進行加速
sy: 內核進程消耗的CPU時間百分比
sy的值高時,說明系統內核消耗的CPU資源多,這並非良性表現,咱們應該檢查緣由
wa: IO等待消耗的CPU時間百分比
wa的值高時,說明IO等待比較嚴重,這可能因爲磁盤大量做隨機訪問形成,也有可能磁盤出現瓶頸(塊操做)。
id:CPU處於空閒狀態時間百分比,若是空閒時間(cpu id)持續爲0而且系統時間(cpu sy)是用戶時間的兩倍(cpu us) 系統則面臨着CPU資源的短缺. 在服務高峯期持續小於50,能夠接受
經過這個命令能夠觀察cpu性能的結果是:
A.若是r連續大於cpu的個數,甚至幾倍cpu個數;b也有持續有值,甚至cpu的2-3倍,而且id也持續小於50%,wa也比較小,這就代表cpu符合很嚴重。
B 再詳細確承認以用:sar -u 1 5,sar -q 1 5能夠觀察cpu的使用率和cpu運行進程隊列長度及負載。
C. 若是想再看看具體是什麼進程在消耗cpu,就要使用命令:top,ps –auxw | more
D. 若是知道了某個進程消耗大量的cpu,想主要知道這個進程在作成什麼,那就用命令:strace
2.識別memory性能瓶頸
爲了提升磁盤存取效率, Linux作了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採起了兩種主要Cache方式:Buffer Cache和Page Cache.前者針對磁盤塊的讀寫,後者針對文件inode的讀寫.這些Cache有效縮短了I/O系統調用(好比read,write,getdents)的時間.
內存活動基本上能夠用3個數字來量化:活動虛擬內存總量,交換(swapping)率和調頁(paging)率.其中第一個數字代表內存的總需求量,後兩個數字表示那些內存中有多少比例正處在使用之中.目標是減小內存活動或增長內存量,直到調頁率保持在一個能夠接受的水平上爲止.
活動虛擬內存的總量(VM)=實際內存大小(size of real memory)(物理內存)+使用的交換空間大小(amount of swap space used)
當程序運行須要的內存大於物理內存時,UNIX系統採用了調頁機制,即系統copy一些內存中的頁面到磁盤上,騰出來空間供進程使用。
大多數系統能夠忍受偶爾的調頁,可是頻繁的調頁會使系統性能急劇降低。
UNIX內存管理:UNIX系統經過2種方法進行內存管理,「調頁算法」,「交換技術」。
調頁算法:是將內存中最近不常使用的頁面換到磁盤上,把常使用的頁面(活動頁面)保留
在內存中供進程使用。
交換技術:是系統將整個進程,而不是部分頁面,所有換到磁盤上。正常狀況下,系統會發
生一些交換過程。
當內存嚴重不足時,系統會頻繁使用調頁和交換,這增長了磁盤I/O的負載。進一步下降了系統對做業的執行速度,即系統I/O資源問題又會影響到內存資源的分配。
Unix的虛擬內存
Unix的虛擬內存是一個十分複雜的子系統,它實現了進程間代碼與數據共享機制的透明性,並可以分配比系統現有物理內存更多的內存,某些操做系統的虛存甚至能經過提供緩存功能影響到文件系統的性能,各類風格的UNIX的虛存的實現方式區別很大,但都離不開下面的4個概念。
1:實際內存
實際內存是指一個系統中實際存在的物理內存,稱爲RAM。實際內存是存儲臨時數據最快最有效的方式,所以必須儘量地分配給應用程序,如今的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,不少RAM均可以使用糾錯機制(ECC)。
2:交換空間
交換空間是專門用於臨時存儲內存的一塊磁盤空間,一般在頁面調度和交換進程數據時使用,一般推薦交換空間的大小應該是物理內存的二到四倍。
3:頁面調度
頁面調度是指從磁盤向內存傳輸數據,以及相反的過程,這個過程之因此被稱爲頁面調度,是由於Unix內存被平均劃分紅大小相等的頁面;一般頁面大小爲4KB和8KB(在Solaris中能夠用pagesize命令查看)。當可執行程序開始運行時,它的映象會一頁一頁地從磁盤中換入,與此相似,當某些內存在一段時間內空閒,就能夠把它們換出到交換空間中,這樣就能夠把空閒的RAM交給其餘須要它的程序使用。
4:交換
頁面調度一般容易和交換的概念混淆,頁面調度是指把一個進程所佔內存的空閒部分傳輸到磁盤上,而交換是指當系統中實際的內存已不夠知足新的分配需求時,把整個進程傳輸到磁盤上,交換活動一般意味着內存不足。
[root@ticketA ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 81616 105616 122168 31284140 1 1 16 24 0 0 2 0 98 0
3 0 81616 105616 122168 31284140 0 0 0 12 5594 4285 3 1 96 0
2 0 81616 105616 122172 31284136 0 0 0 16 5574 4176 3 1 96 0
1 0 81616 105552 122172 31284136 0 0 0 108 5545 4329 3 1 96 0
3 0 81616 105360 122172 31284136 0 0 0 36 5533 4195 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 60 5538 4341 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 48 5473 4179 3 1 96 0
1 0 81616 105360 122180 31284128 0 0 0 8 5553 4299 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 20 5608 4231 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 60 5585 4285 3 0 96 0
MEMORY
-swap:切換到交換內存上的內存(默認以KB爲單位)
若是SWAP的值不爲0,或者還比較大,好比超過100M了,可是SI,SO的值長期爲0,這種狀況咱們能夠不用擔憂,不會影響系統性能。-free:空閒的物理內存
- buff:做爲buffer cache的內存,對塊設備的讀寫進行緩衝
- cache:做爲page cache的內存,文件系統的cache
若是cache的值大的時候,說明cache處的文件數多,若是頻繁訪問到的文件都能被cache處,那麼磁盤的讀IO bi會很是小。
SWAP
-si:交換內存使用,由磁盤調入內存
-so:交換內存使用,由內存調入磁盤
內存夠用的時候,這2個值都是0,若是這2個值長期大於0時,系統性能會受到影響,磁盤IO和CPU資源都會被消耗。
我發現有些朋友看到空閒內存(FREE)不多的或接近於0時,就認爲內存不夠用了,實際上不能光看這一點,Linux是搶佔內存式的OS,還要結合si,so,若是free不多,可是si,so也不多(大多時候是0),那麼不用擔憂,系統性能這時不會受到影響的。
3.識別io性能瓶頸
首先用命令vmstat大概瞭解系統情況
[root@localhost ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1225516 176836 6452620 0 0 0 4 3 3 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 32 1021 66 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 0 1028 122 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 40 1009 36 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 0 1028 124 0 0 100 0
若是b的值爲2-3倍cpu數量,bi和bo的值很大(有時bi和bo值很小,但in和cs很大,也會引發磁盤io負載重),wa的值持續很高,如高於40,id也持續高於70,這些現象都代表系統的io可能出現性能問題。能夠進一步經過iostat命令分析。
root@localhost ~]# iostat -x 1 5
Linux 2.6.9-78.ELsmp (localhost) 10/08/2010
avg-cpu: %user %nice %sys %iowait %idle
0.07 0.00 0.03 0.01 99.89
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 0.01 3.26 0.16 4.36 6.42 60.99 3.21 30.49 14.91 0.00 0.56 0.16 0.07
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 26.17 0.00 3.08 2.83 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.57 0.00 0.99 0.84 0.00
sda3 0.01 3.26 0.16 4.36 6.42 60.99 3.21 30.49 14.91 0.00 0.56 0.16 0.07
dm-0 0.00 0.00 0.17 7.62 6.42 60.99 3.21 30.49 8.65 0.12 15.45 0.09 0.07
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 6.22 0.62 0.00
查看iostat的結果,首先看%util(服務io的時間佔總時間的百分比),若是這個值接近100%,表示io的請求不少(表示任務服務的全部時間幾乎都用在io上),這種現象代表磁盤io性能出現瓶頸。
再看await(表示每次io設備等待時間)和svctm(表示每次io設備服務時間,通常性能越好的磁盤,這個值越小)。
若是svctm接近await,說明io幾乎沒有等待,每一個io設備都獲得及時的響應
若是svctm遠小於await,說明io等待隊列可能很長,io的獲得服務的時間將延長(排隊+服務時間)。
avgqu-sz表示io排隊的現象,若是排隊過長會影響io的響應時間
r/s+w/s:能夠計算當前系統的iops(能夠結合硬盤的測試或者硬件參數來衡量是否超過磁盤的iops最大值)
4.網絡性能識別與分析
能夠經過命令netstat,iptraf命令來識別
能夠經過ifconfig,netstat鏈接網絡基本狀況
ifconfig # 查看全部網絡接口的屬性
netstat -lntp # 查看全部監聽端口
netstat -antp # 查看全部已經創建的鏈接
netstat -s # 查看網絡統計信息進程
用iptraf鏈接網絡的速率,若是網絡的帶寬達到極限,那通常系統的支持的進程數或者最大鏈接數也會成爲瓶頸
知道哪有問題了,接下來就是調整了,調整的方法以下:
Cpu的調整:
通常在cpu的wa小於5%就須要調整cpu,調整的相關參數在目錄下:/proc/sys/kernel/;一邊調整參數threads-max,pid_max,以下:
[root@localhost ~]# sysctl kernel.pid_max
kernel.pid_max = 32768
[root@localhost ~]# sysctl kernel.pid_max=32769
kernel.pid_max = 32769
memory調整:
當出現嚴重的換頁現象,應該注意內存不足的影響
1. 關閉沒必要要的非核心進程
2. 調整/proc/sys/vm/下的系統參數
保證linux有足夠的物理內存,能夠調整vm的以下參數
vm.min_free_kbytes=409600;//默認值是3797,保證物理內存有足夠空閒空間,防止突發性換頁
vm.vfs_cache_pressure=200;//默認是100,增大這個參數設置了虛擬內存回收directory和i-node緩衝的傾向,這個值越大。越易回收
vm.swappiness=40 //缺省60,減小這個參數會使系統儘快經過swapout不使用的進程資源來釋放更多的物理內存
3. 配置較大的swap,通常爲物理內存2倍
Io的調整:
1. 負載平衡,磁盤io均分
2. 啓用異步io
查看是否啓用異步io
[root@localhost ~]# cat /proc/slabinfo |grep kio
kioctx 0 0 384 10 1 : tunables 54 27 8 : slabdata 0 0 0
kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0
3. 塊設備調大預讀扇區readahead
[root@localhost ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 570949632 /dev/sda
rw 256 512 1024 63 80262 /dev/sda1
rw 256 512 1024 80325 208845 /dev/sda2
rw 256 512 512 289170 570644865 /dev/sda3
rw 256 512 4096 289170 550109184 /dev/dm-0
rw 256 512 4096 289170 20447232 /dev/dm-1
[root@localhost ~]# blockdev --setra 2048 /dev/sda1
[root@localhost ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 0 570949632 /dev/sda
rw 2048 512 1024 63 80262 /dev/sda1
rw 2048 512 1024 80325 208845 /dev/sda2
rw 2048 512 512 289170 570644865 /dev/sda3
rw 256 512 4096 289170 550109184 /dev/dm-0
rw 256 512 4096 289170 20447232 /dev/dm-1
4. 調整vm相關參數
改善io系統的性能的vm參數
overcommit_memory = 0
vm.overcommit_ratio = 10 //默認值是50,用於虛擬內存的物理內存的百分比
vm.dirty_ratio = 20 //默認值是40,爲了保持穩定,持續的寫入,把這個值調整的小一些,經驗值是20
vm.dirty_background_ratio //缺省數值是500,也就是5秒,若是系統要求穩定持續的寫,能夠適當下降該值,把峯值的寫操做平均屢次,也避免宕機丟失更多的數據
vm.dirty_expire_centisecs //缺省是3000,也就是30秒,若是系統寫操做壓力很大,能夠適當減少該值,但也不要過小;建議設置爲 1500
=====================================================
轉至http://blog.csdn.net/wyzxg/article/details/6234457