工作這么久了,主要就是服務(wù)器端的開發(fā),由于業(yè)務(wù)性質(zhì),對于性能的考慮是每天不得不面對的問題,每次出方案,都是以預(yù)估總pv、單機(jī)支持最大并發(fā)、預(yù)計機(jī)器資源。。。。。。等等一系列問題開始,所以程序運行中單個函數(shù)的耗時,上線后整體性能的觀察都非常重要。經(jīng)過一段時間的積累和同事的指點,把相關(guān)的內(nèi)容記錄下,也與有同樣需求的同學(xué)分享,共同進(jìn)步。
一:首先,可已從如下四個方面觀察你的服務(wù)器機(jī)器目前的性能情況:
1,CPU
2,內(nèi)存
3,磁盤I/O帶寬
4,網(wǎng)絡(luò)I/O帶寬
二:其次,要對如何評估系統(tǒng)性能有個基本的標(biāo)準(zhǔn),經(jīng)過一段時間的觀察,歸納如下:
1,對于CPU,正常情況(非高峰期)下, user% + sys% < 60% 是很好的情況
也許你會問,為什么要小于60%,剩余的40%做什么?這個是業(yè)務(wù)性質(zhì)決定的,tx的業(yè)務(wù)都是有時間段高峰期的,比如早九點-十點,晚八點-十點,是用戶訪問高峰期,我們要保證服務(wù)器能夠處理尖峰并發(fā),所以大多時候有30%~40%的空閑是可以接受而且是必須的。當(dāng)你的服務(wù)器在平時cpu使用率一直>80%,那就要不得不考慮擴(kuò)容或者程序本身性能優(yōu)化了調(diào)皮。
2,對于內(nèi)存,同樣正常情況下,Swap In(si)=0,Swap Out(so)=0是很好的情況,當(dāng)然允許偶爾的尖峰,但是曲線要相對平滑,消峰是很有必要的。如果出現(xiàn) Per CPU with 10 page/s,那么就要重點觀察了。
3,對于磁盤,正常情況下,iowait % < 25%是很好的情況,如果長期>40%,那么就會影響反映能力了
其中:
%user:表示CPU處在用戶模式下的時間百分比。
%sys:表示CPU處在系統(tǒng)模式下的時間百分比。
%iowait:表示CPU等待輸入輸出完成時間的百分比。
swap in:即si,表示虛擬內(nèi)存的頁導(dǎo)入,即從SWAP DISK交換到RAM
swap out:即so,表示虛擬內(nèi)存的頁導(dǎo)出,即從RAM交換到SWAP DISK。
三:接下來介紹,在工作中常用到的性能分析工具, 有些常用的系統(tǒng)命令:
vmstat、sar、iostat、netstat、free、ps、top等
工作中,我比較常用的組合方式為:
1, 用vmstat、sar、iostat檢測是否是CPU瓶頸
2,用free、vmstat檢測是否是內(nèi)存瓶頸
3,用iostat檢測是否是磁盤I/O瓶頸
4, 用netstat檢測是否是網(wǎng)絡(luò)帶寬瓶頸
通常,會用命令uptime,看下總體cpu使用情況,例如我其中一臺線上機(jī)器情況
uptime
8:40pm up 580 days 2:34, 3 users, load average: 1.24, 1.44, 1.67
重點關(guān)注,load average ,這三個值的大小一般不能大于系統(tǒng)CPU的個數(shù),例如,本輸出中系統(tǒng)有4個CPU,如果load average的三個值長期大于4時,說明CPU很繁忙,負(fù)載很高,可能會影響系統(tǒng)性能,但是偶爾大于4時,倒不用擔(dān)心,一般不會影響系統(tǒng)性能。相反,如果load average的輸出值小于CPU的個數(shù),則表示CPU還有空閑的時間片,比如本例中的輸出,CPU是非??臻e的,為下次業(yè)務(wù)放量最準(zhǔn)備,哈哈。
1) 用vmstat 詳細(xì)分析cpu的性能:用該命令分析我線上機(jī)器
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時間片的進(jìn)程數(shù),這個值如果長期大于系統(tǒng)CPU的個數(shù),說明CPU不足,需要增加CPU。
b:列表示在等待資源的進(jìn)程數(shù),比如正在等待I/O、或者內(nèi)存交換等。
Cpu
us:列顯示了用戶進(jìn)程消耗的CPU 時間百分比。us的值比較高時,說明用戶進(jìn)程消耗的cpu時間多,但是如果長期大于50%,就需要考慮優(yōu)化程序或算法。
sy:列顯示了內(nèi)核進(jìn)程消耗的CPU時間百分比。Sy的值較高時,說明內(nèi)核消耗的CPU資源很多。
根據(jù)經(jīng)驗,us+sy的參考值為70%,如果us+sy大于 70%說明可能存在CPU資源不足。
Memory
swpd: 虛擬內(nèi)存使用情況,單位:KB
free: 空閑的內(nèi)存,單位KB
buff: 被用來做為緩存的內(nèi)存數(shù),一般對塊設(shè)備的讀寫才需要緩沖,單位:KB
cache:表示page cached的內(nèi)存數(shù)量,一般作為文件系統(tǒng)cached,頻繁訪問的文件都會被cached,如果cache值較大,說明cached的文件數(shù)較多,如果此時IO中bi比較小,說明文件系統(tǒng)效率比較好。
Swap
si: 從磁盤交換到內(nèi)存的交換頁數(shù)量,單位:KB/秒
so: 從內(nèi)存交換到磁盤的交換頁數(shù)量,單位:KB/秒
I/O
bi: 發(fā)送到塊設(shè)備的塊數(shù),單位:塊/秒
bo: 從塊設(shè)備接收到的塊數(shù),單位:塊/秒
System
in: 每秒的中斷數(shù),包括時鐘中斷
cs: 每秒的環(huán)境(上下文)切換次數(shù)
注意:如果 r經(jīng)常大于 4 ,且id經(jīng)常少于40,表示cpu的負(fù)荷很重。
如果si,so 長期不等于0,表示內(nèi)存不足。
如果disk 經(jīng)常不等于0, 且在 b中的隊列 大于3, 表示 io性能不好。
2) 用sar分析cpu性能,sar是個非常強(qiáng)大的工具,可以對系統(tǒng)的每個方面進(jìn)行單獨的統(tǒng)計,但是使用sar命令會增加系統(tǒng)開銷,不過這些開銷是可以評估的,對系統(tǒng)的統(tǒng)計結(jié)果不會有很大影響。
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列顯示了用戶進(jìn)程消耗的CPU 時間百分比。
%nice列顯示了運行正常進(jìn)程所消耗的CPU 時間百分比。
%system列顯示了系統(tǒng)進(jìn)程消耗的CPU時間百分比。
%iowait列顯示了IO等待所占用的CPU時間百分比
%steal列顯示了在內(nèi)存相對緊張的環(huán)境下pagein強(qiáng)制對不同的頁面進(jìn)行的steal操作 。
%idle列顯示了CPU處在空閑狀態(tài)的時間百分比。
有的時候會遇到cpu很空閑,但是性能低下的情況,可能是由于開的進(jìn)程數(shù)小于你cpu的數(shù)目,通常web svr進(jìn)程都會開的很大,因為會調(diào)用很多后臺服務(wù),屬于io類型偏多,邏輯處理偏少的,例如我線上web svr 是240個proc,但邏輯svr通常進(jìn)程數(shù)相對小,因為邏輯處理是耗cpu型的,如果是異步的通常是4個proc,同步的16-32個不等。進(jìn)程數(shù)與服務(wù)器性能也是息息相關(guān)的。
3)內(nèi)存性能評估free
free -m
total used free shared buffers cached
Mem: 8110 2792 5318 0 494 1263
-/+ buffers/cache: 1034 7076
Swap: 2055 184 1870
注意:一般有這樣一個經(jīng)驗公式:應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存>70%時,表示系統(tǒng)內(nèi)存資源非常充足,不影響系統(tǒng)性能,應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<20%時,表示系統(tǒng)內(nèi)存資源緊缺,需要增加系統(tǒng)內(nèi)存,20%<應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<70%時,表示系統(tǒng)內(nèi)存資源基本能滿足應(yīng)用需求,暫時不影響系統(tǒng)性能。
同樣也可以用vmstat觀察內(nèi)存情況,重點關(guān)注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表示每秒讀取的數(shù)據(jù)塊數(shù)。
Blk_wrtn/s表示每秒寫入的數(shù)據(jù)塊數(shù)。
Blk_read表示讀取的所有塊數(shù)。
Blk_wrtn表示寫入的所有塊數(shù)。
注意:1:可以通過Blk_read/s和Blk_wrtn/s的值對磁盤的讀寫性能有一個基本的了解,如果Blk_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優(yōu)化磁盤或者優(yōu)化程序,如果Blk_read/s值很大,表示磁盤直接讀取操作很多,可以將讀取的數(shù)據(jù)放入內(nèi)存中進(jìn)行操作。
2:對于這兩個選項的值沒有一個固定的大小,根據(jù)系統(tǒng)應(yīng)用的不同,會有不同的值,但是有一個規(guī)則還是可以遵循的:長期的、超大的數(shù)據(jù)讀寫,肯定是不正常的,這種情況一定會影響系統(tǒng)性能。
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
需要重點關(guān)注的幾個參數(shù)含義:
await表示平均每次設(shè)備I/O操作的等待時間(以毫秒為單位)。
svctm表示平均每次設(shè)備I/O操作的服務(wù)時間(以毫秒為單位)。
%util表示一秒中有百分之幾的時間用于I/O操作。
對以磁盤IO性能,一般有如下評判標(biāo)準(zhǔn):
注意: 正常情況下svctm應(yīng)該是小于await值的,而svctm的大小和磁盤性能有關(guān),CPU、內(nèi)存的負(fù)荷也會對svctm值造成影響,過多的請求也會間接的導(dǎo)致svctm值的增加。
await值的大小一般取決與svctm的值和I/O隊列長度以及I/O請求模式,如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠(yuǎn)高于svctm的值,則表示I/O隊列等待太長,系統(tǒng)上運行的應(yīng)用程序?qū)⒆兟?,此時可以通過更換更快的硬盤來解決問題。
%util項的值也是衡量磁盤I/O的一個重要指標(biāo),如果%util接近100%,表示磁盤產(chǎn)生的I/O請求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統(tǒng)的性能,可以通過優(yōu)化程序或者通過更換更高、更快的磁盤來解決此問題。
6)網(wǎng)絡(luò)性能netstat,重用的幾種方式為:
netstat -s 統(tǒng)計不同協(xié)議否有丟包
netstat -nlp Rev-Q是否有未讀取的數(shù)據(jù)
netstat -antl 所有tcp連接狀況
注意:可以通過netstat查看是否timewait過多的情況,導(dǎo)致端口不夠用,在短連接服務(wù)中且大并發(fā)情況下,要不系統(tǒng)的如下兩個選項打開,允許端口重用
cat tcp_tw_recycle
1
cat tcp_tw_reuse
7) 網(wǎng)絡(luò)接收詳細(xì)情況tcpdump
如果想要獲取主機(jī)210.27.48.1除了和主機(jī)210.27.48.2之外所有主機(jī)通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
如果想要獲取主機(jī)210.27.48.1接收或發(fā)出的telnet包,使用如下命令:
#sudo tcpdump -i eht1 -Xnns0 tcp port 23 host 210.27.48.1
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。