http://fuliang.iteye.com/blog/1024360ios
http://unixhelp.ed.ac.uk/CGI/man-cgi?vmstatweb
-------------------------------------------------------------------------------------------------------------------------------- 算法
工做這麼久了,主要就是服務器端的開發,因爲業務性質,對於性能的考慮是天天不得不面對的問題,每次出方案,都是以預估總pv、單機支持最大併發、預計機器資源。。。。。。等等一系列問題開始,因此程序運行中單個函數的耗時,上線後總體性能的觀察都很是重要。通過一段時間的積累和同事的指點,把相關的內容記錄下,也與有一樣需求的同窗分享,共同進步。
一:首先,可已從以下四個方面觀察你的服務器機器目前的性能狀況:
1,CPU
2,內存
3,磁盤I/O帶寬
4,網絡I/O帶寬
二:其次,要對如何評估系統性能有個基本的標準,通過一段時間的觀察,概括以下:
1,對於CPU,正常狀況(非高峯期)下, user% + sys% < 60% 是很好的狀況
也許你會問,爲何要小於60%,剩餘的40%作什麼?這個是業務性質決定的,tx的業務都是有時間段高峯期的,好比早九點-十點,晚八點-十點,是用戶訪問高峯期,咱們要保證服務器可以處理尖峯併發,因此大多時候有30%~40%的空閒是能夠接受並且是必須的。當你的服務器在平時cpu使用率一直>80%,那就要不得不考慮擴容或者程序自己性能優化了調皮。
2,對於內存,一樣正常狀況下,Swap In(si)=0,Swap Out(so)=0是很好的狀況,固然容許偶爾的尖峯,可是曲線要相對平滑,消峯是頗有必要的。若是出現 Per CPU with 10 page/s,那麼就要重點觀察了。
3,對於磁盤,正常狀況下,iowait % < 25%是很好的狀況,若是長期>40%,那麼就會影響反映能力了
其中:
%user:表示CPU處在用戶模式下的時間百分比。
%sys:表示CPU處在系統模式下的時間百分比。
%iowait:表示CPU等待輸入輸出完成時間的百分比。
swap in:即si,表示虛擬內存的頁導入,即從SWAP DISK交換到RAM
swap out:即so,表示虛擬內存的頁導出,即從RAM交換到SWAP DISK。
三:接下來介紹,在工做中經常使用到的性能分析工具, 有些經常使用的系統命令:
vmstat、sar、iostat、netstat、free、ps、top等
工做中,我比較經常使用的組合方式爲:
1, 用vmstat、sar、iostat檢測是不是CPU瓶頸
2,用free、vmstat檢測是不是內存瓶頸
3,用iostat檢測是不是磁盤I/O瓶頸
4, 用netstat檢測是不是網絡帶寬瓶頸
一般,會用命令uptime,看下整體cpu使用狀況,例如我其中一臺線上機器狀況
uptime
8:40pm up 580 days 2:34, 3 users, load average: 1.24, 1.44, 1.67
重點關注,load average ,這三個值的大小通常不能大於系統CPU的個數,例如,本輸出中系統有4個CPU,若是load average的三個值長期大於4時,說明CPU很繁忙,負載很高,可能會影響系統性能,可是偶爾大於4時,倒不用擔憂,通常不會影響系統性能。相反,若是load average的輸出值小於CPU的個數,則表示CPU還有空閒的時間片,好比本例中的輸出,CPU是很是空閒的,爲下次業務放量最準備,哈哈。
1) 用vmstat 詳細分析cpu的性能:用該命令分析我線上機器
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
2 0 189216 5439580 506476 1303832 0 0 0 0 0 0 14 6 79 1 0
6 1 189216 5439588 506476 1303832 0 0 0 60 12544 13986 17 5 77 1 0
1 0 189216 5439340 506476 1303832 0 0 0 0 12441 14394 18 4 78 0 0
1 0 189216 5439588 506476 1303832 0 0 0 0 12540 15346 18 4 78 0 0
解釋下:
Procs
r:列表示運行和等待cpu時間片的進程數,這個值若是長期大於系統CPU的個數,說明CPU不足,須要增長CPU。
b:列表示在等待資源的進程數,好比正在等待I/O、或者內存交換等。
Cpu
us:列顯示了用戶進程消耗的CPU 時間百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,可是若是長期大於50%,就須要考慮優化程序或算法。
sy:列顯示了內核進程消耗的CPU時間百分比。Sy的值較高時,說明內核消耗的CPU資源不少。
根據經驗,us+sy的參考值爲70%,若是us+sy大於 70%說明可能存在CPU資源不足。
Memory
swpd: 虛擬內存使用狀況,單位:KB
free: 空閒的內存,單位KB
buff: 被用來作爲緩存的內存數,通常對塊設備的讀寫才須要緩衝,單位:KB
cache:表示page cached的內存數量,通常做爲文件系統cached,頻繁訪問的文件都會被cached,若是cache值較大,說明cached的文件數較多,若是此時IO中bi比較小,說明文件系統效率比較好。
Swap
si: 從磁盤交換到內存的交換頁數量,單位:KB/秒
so: 從內存交換到磁盤的交換頁數量,單位:KB/秒
I/O
bi: 發送到塊設備的塊數,單位:塊/秒
bo: 從塊設備接收到的塊數,單位:塊/秒
System
in: 每秒的中斷數,包括時鐘中斷
cs: 每秒的環境(上下文)切換次數
注意:若是 r常常大於 4 ,且id常常少於40,表示cpu的負荷很重。
若是si,so 長期不等於0,表示內存不足。
若是disk 常常不等於0, 且在 b中的隊列 大於3, 表示 io性能很差。
2) 用sar分析cpu性能,sar是個很是強大的工具,能夠對系統的每一個方面進行單獨的統計,可是使用sar命令會增長系統開銷,不過這些開銷是能夠評估的,對系統的統計結果不會有很大影響。
sar -u 1 4
Linux 2.6.16.60-0.21-TENCENT-090803 (RS_Server_vip) 04/28/11
21:06:13 CPU %user %nice %system %iowait %idle
21:06:14 all 16.83 0.00 4.46 0.99 77.72
21:06:15 all 15.08 0.00 4.52 0.00 80.40
21:06:16 all 17.21 0.00 3.99 0.00 78.80
21:06:17 all 16.75 0.00 3.25 0.00 80.00
Average: all 16.47 0.00 4.05 0.25 79.23
對上面每項的輸出解釋以下:
%user列顯示了用戶進程消耗的CPU 時間百分比。
%nice列顯示了運行正常進程所消耗的CPU 時間百分比。
%system列顯示了系統進程消耗的CPU時間百分比。
%iowait列顯示了IO等待所佔用的CPU時間百分比
%steal列顯示了在內存相對緊張的環境下pagein強制對不一樣的頁面進行的steal操做 。
%idle列顯示了CPU處在空閒狀態的時間百分比。
有的時候會遇到cpu很空閒,可是性能低下的狀況,多是因爲開的進程數小於你cpu的數目,一般web svr進程都會開的很大,由於會調用不少後臺服務,屬於io類型偏多,邏輯處理偏少的,例如我線上web svr 是240個proc,但邏輯svr一般進程數相對小,由於邏輯處理是耗cpu型的,若是是異步的一般是4個proc,同步的16-32個不等。進程數與服務器性能也是息息相關的。
3)內存性能評估free
free -m
total used free shared buffers cached
Mem: 8110 2792 5318 0 494 1263
-/+ buffers/cache: 1034 7076
Swap: 2055 184 1870
注意:通常有這樣一個經驗公式:應用程序可用內存/系統物理內存>70%時,表示系統內存資源很是充足,不影響系統性能,應用程序可用內存/系統物理內存<20%時,表示系統內存資源緊缺,須要增長系統內存,20%<應用程序可用內存/系統物理內存<70%時,表示系統內存資源基本能知足應用需求,暫時不影響系統性能。
一樣也能夠用vmstat觀察內存狀況,重點關注si,so的值
4)i/o性能評估iostat命令
iostat -d 2
Linux 2.6.16.60-0.21-TENCENT-090803 (RS_Server_vip) 04/28/11
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 9.48 22.73 41.50 1139188426 2080012464
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 7.50 0.00 112.00 0 224
對上面每項的輸出解釋以下:
Blk_read/s表示每秒讀取的數據塊數。
Blk_wrtn/s表示每秒寫入的數據塊數。
Blk_read表示讀取的全部塊數。
Blk_wrtn表示寫入的全部塊數。
注意:1:能夠經過Blk_read/s和Blk_wrtn/s的值對磁盤的讀寫性能有一個基本的瞭解,若是Blk_wrtn/s值很大,表示磁盤的寫操做很頻繁,能夠考慮優化磁盤或者優化程序,若是Blk_read/s值很大,表示磁盤直接讀取操做不少,能夠將讀取的數據放入內存中進行操做。
2:對於這兩個選項的值沒有一個固定的大小,根據系統應用的不一樣,會有不一樣的值,可是有一個規則仍是能夠遵循的:長期的、超大的數據讀寫,確定是不正常的,這種狀況必定會影響系統性能。
5)I/O性能評估sar
sar -d 2 3
Linux 2.6.16.60-0.21-TENCENT-090803 (RS_Server_vip) 04/28/11
21:24:24 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
21:24:26 dev8-0 10.40 0.00 324.75 31.24 0.08 7.43 5.52 5.74
21:24:26 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
21:24:28 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
21:24:28 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
21:24:30 dev8-0 2.99 0.00 31.84 10.67 0.03 11.33 10.00 2.99
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 4.48 0.00 119.40 26.67 0.04 8.30 6.52 2.92
須要重點關注的幾個參數含義:
await表示平均每次設備I/O操做的等待時間(以毫秒爲單位)。
svctm表示平均每次設備I/O操做的服務時間(以毫秒爲單位)。
%util表示一秒中有百分之幾的時間用於I/O操做。
對以磁盤IO性能,通常有以下評判標準:
注意: 正常狀況下svctm應該是小於await值的,而svctm的大小和磁盤性能有關,CPU、內存的負荷也會對svctm值形成影響,過多的請求也會間接的致使svctm值的增長。
await值的大小通常取決與svctm的值和I/O隊列長度以及I/O請求模式,若是svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,若是await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢,此時能夠經過更換更快的硬盤來解決問題。
%util項的值也是衡量磁盤I/O的一個重要指標,若是%util接近100%,表示磁盤產生的I/O請求太多,I/O系統已經滿負荷的在工做,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,能夠經過優化程序或者經過更換更高、更快的磁盤來解決此問題。
6)網絡性能netstat,重用的幾種方式爲:
netstat -s 統計不一樣協議否有丟包
netstat -nlp Rev-Q是否有未讀取的數據
netstat -antl 全部tcp鏈接情況
注意:能夠經過netstat查看是否timewait過多的狀況,致使端口不夠用,在短鏈接服務中且大併發狀況下,要不繫統的以下兩個選項打開,容許端口重用
cat tcp_tw_recycle
1
cat tcp_tw_reuse
7) 網絡接收詳細狀況tcpdump
若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#sudo tcpdump -i eht1 -Xnns0 tcp port 23 host 210.27.48.1緩存