CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%。web
上下文切換:與CPU利用率相關聯,若是CPU利用率狀態良好,大量的上下文切換也是能夠接受的。緩存
可運行隊列:每一個處理器的可運行隊列<=3個線程。服務器
vmstat網絡
$ vmstat 1tcp
先看一個字段能對齊的:工具
下面的是別人服務器的狀況:性能
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------spa
r b swpd free buff cache si so bi bo in cs us sy id wa st線程
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0server
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
重要參數:
r,run queue,可運行隊列的進程數,這些進程都是可運行狀態,只不過CPU暫時不可用。
b,被blocked的進程數,正在等待IO請求。
in,interrupts,被處理過的中斷數。
cs,context switch,系統上正在作上下文切換的數目。
us,用戶佔用CPU的百分比。
sys,內核和中斷佔用CPU的百分比。
id,CPU徹底空閒的百分比。
上例可得:
sy高us低,以及高頻度的上下文切換(cs),說明應用程序進行了大量的系統調用。
這臺4核機器的r應該在12個之內,如今r在14個線程以上,此時CPU負荷很重。
查看某個進程佔用的CPU資源
$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'db_server_login'; sleep 1; done
PID NI PRI %CPU PSR COMMAND
28577 0 23 0.0 0 db_server_login
28578 0 23 0.0 3 db_server_login
28579 0 23 0.0 2 db_server_login
28581 0 23 0.0 2 db_server_login
28582 0 23 0.0 3 db_server_login
28659 0 23 0.0 0 db_server_login
……
swap in (si) == 0,swap out (so) == 0
應用程序可用內存/系統物理內存 <= 70%
vmstat
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 3 252696 2432 268 7148 3604 2368 3608 2372 288 288 0 0 21 78 1
0 2 253484 2216 228 7104 5368 2976 5372 3036 930 519 0 0 0 100 0
0 1 259252 2616 128 6148 19784 18712 19784 18712 3821 1853 0 1 3 95 1
1 2 260008 2188 144 6824 11824 2584 12664 2584 1347 1174 14 0 0 86 0
2 1 262140 2964 128 5852 24912 17304 24952 17304 4737 2341 86 10 0 0 4
重要參數:
swpd,已使用的 SWAP 空間大小,KB 爲單位。
free,可用的物理內存大小,KB 爲單位。
buff,物理內存用來緩存讀寫操做的buffer大小,KB 爲單位。
cache,物理內存用來緩存進程地址空間的 cache 大小,KB 爲單位。
si,數據從 SWAP 讀取到 RAM(swap in)的大小,KB 爲單位;
so,數據從 RAM 寫到 SWAP(swap out)的大小,KB 爲單位。
上例可得:
物理可用內存 free 基本沒什麼顯著變化,swapd逐步增長,說明最小可用的內存始終保持在 256MB(物理內存大小) * 10% = 2.56MB 左右,當髒頁達到10%的時候就開始大量使用swap。
free
$ free -m
total used free shared buffers cached
Mem: 8111 7185 926 0 243 6299
-/+ buffers/cache: 643 7468
Swap: 8189 0 8189
iowait % < 20%
提升命中率的一個簡單方式就是增大文件緩存區面積,緩存區越大預存的頁面就越多,命中率也越高。
Linux 內核但願能儘量產生次缺頁中斷(從文件緩存區讀),而且能儘量避免主缺頁中斷(從硬盤讀),這樣隨着次缺頁中斷的增多,文件緩存區也逐步增大,直到系統只有少許可用物理內存的時候 Linux 纔開始釋放一些不用的頁。
查看物理內存和文件緩存狀況
$ cat /proc/meminfo
MemTotal: 8182776 kB
MemFree: 3053808 kB
Buffers: 342704 kB
Cached: 3972748 kB
這臺服務器總共有 8GB 物理內存(MemTotal),3GB 左右可用內存(MemFree),343MB左右用來作磁盤緩存(Buffers),4GB左右用來作文件緩存區(Cached)。
sar
$ sar -d 2 3
Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00
11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02
重要參數:
await表示平均每次設備I/O操做的等待時間(以毫秒爲單位)。
svctm表示平均每次設備I/O操做的服務時間(以毫秒爲單位)。
%util表示一秒中有百分之幾的時間用於I/O操做。
若是svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,若是await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢。
若是%util接近100%,表示磁盤產生的I/O請求太多,I/O系統已經滿負荷的在工做,該磁盤可能存在瓶頸。
接收、發送緩衝區沒有長時間等待處理的網絡包。
netstat
對於UDP服務,查看全部監聽的UDP端口的網絡狀況
$ watch netstat -lunp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:64000 0.0.0.0:* -
udp 0 0 0.0.0.0:38400 0.0.0.0:* -
udp 0 0 0.0.0.0:38272 0.0.0.0:* -
udp 0 0 0.0.0.0:36992 0.0.0.0:* -
udp 0 0 0.0.0.0:17921 0.0.0.0:* -
udp 0 0 0.0.0.0:11777 0.0.0.0:* -
udp 0 0 0.0.0.0:14721 0.0.0.0:* -
udp 0 0 0.0.0.0:36225 0.0.0.0:* -
RecvQ、SendQ爲0,或者沒有長時間大於0的數值是比較正常的。
對於UDP服務,查看丟包狀況(網卡收到了,可是應用層沒有處理過來形成的丟包)
$ watch netstat -su
Udp:
278073881 packets received
4083356897 packets to unknown port received.
2474435364 packet receive errors
1079038030 packets sent
packet receive errors 這一項數值增加了,則代表在丟包。
對於TCP而言,不會出現由於緩存不足而存在丟包的事,由於網絡等其餘緣由,致使丟了包,協議層也會經過重傳機制來保證丟的包到達對方。
因此,tcp而言更多的專一重傳率。
# cat /proc/net/snmp | grep Tcp:
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts
Tcp: 1 200 120000 -1 105112 76272 620 23185 6 2183206 2166093 550 6 968812
重傳率 = RetransSegs / OutSegs
至於這個值在多少範圍內,算ok的,得看具體的業務了。
業務側更關注的是響應時間。