Linux服務器性能評估(轉)

工作這麼久了,主要就是服務器端的開發,由於業務性質,對於性能的考慮是每天不得不面對的問題,每次出方案,都是以預估總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


原文:http://www.kuqin.com/linux/20110910/264584.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章