轉貼---Linux服務器性能評估

 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緩存

相關文章
相關標籤/搜索