轉(zhuǎn)自:http://www.cnblogs.com/suihui/p/3799669.htmllinux服務(wù)器的性能分析與優(yōu)化(十三)【教程主題】:1.linux服務(wù)器的性能分析與優(yōu)化 【主要內(nèi)容】 【1】影響Linux服務(wù)器性能的因素 操作系統(tǒng)級(jí) CPU 目前大部分CPU在同一時(shí)間只能運(yùn)行一個(gè)線程,超線程的處理器可以在同一時(shí)間處理多個(gè)線程,因此可以利用超線程特性提高系統(tǒng)性能。 在linux系統(tǒng)下只有運(yùn)行SMP內(nèi)核才能支持超線程,但是安裝的CPu數(shù)量越多,從超線程獲得的性能提升越少。 另外linux內(nèi)核會(huì)將多核的處理器當(dāng)做多個(gè)單獨(dú)的CPU來(lái)識(shí)別,例如,兩個(gè)4核的CPU會(huì)被當(dāng)成8個(gè)單個(gè)CPU,從性能角度講,兩個(gè)4核的CPU整體性能要比8個(gè)單核CPU低25%-30%。 可能出現(xiàn)CPU瓶頸的應(yīng)用有郵件服務(wù)器、動(dòng)態(tài)web服務(wù)器等。
內(nèi)存 內(nèi)存太小,系統(tǒng)進(jìn)程將被阻塞,應(yīng)用也將變得緩慢,甚至失去響應(yīng);內(nèi)存太大,導(dǎo)致資源浪費(fèi)。 虛擬內(nèi)存可以緩解物理內(nèi)存的不足,但是虛擬內(nèi)存的過(guò)多占用會(huì)導(dǎo)致應(yīng)用程序的性能明顯下降。 在一個(gè)32位處理器的linux系統(tǒng)中超過(guò)8GB的物理內(nèi)存都將被浪費(fèi),因此要使用更大的內(nèi)存,建議安裝64位的操作系統(tǒng),同時(shí)開啟linux的大內(nèi)存內(nèi)核支持。 由于處理器尋址范圍的限制,在32位linux操作系統(tǒng)上,應(yīng)用程序單個(gè)進(jìn)程最大只能使用2GB的內(nèi)存。 可能出現(xiàn)內(nèi)存瓶頸的有打印服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、靜態(tài)web服務(wù)器等。
磁盤I/O性能 磁盤RAID技術(shù),Redundant Array of Independent Disk,即獨(dú)立磁盤冗余陣列,簡(jiǎn)稱磁盤陣列。 RAID通過(guò)將多塊獨(dú)立的磁盤(物理硬盤)按不同的方式組合起來(lái)形成一個(gè)磁盤組(邏輯硬盤),從而提供比單個(gè)磁盤更高的IO性能和數(shù)據(jù)冗余。 根據(jù)磁盤組合方式不同,分為RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等,常用的有RAID0、RAID1、RAID5、RAID0+1。 RAID0:通過(guò)把多塊硬盤粘合成一個(gè)容量更大的硬盤組,提高磁盤的性能和吞吐量,成本低,至少兩塊磁盤,但是沒有容錯(cuò)和數(shù)據(jù)修復(fù)功能,只能用在對(duì)數(shù)據(jù)安全性要求不高的環(huán)境中。 RAID1:也就是磁盤鏡像,通過(guò)把一個(gè)磁盤的數(shù)據(jù)鏡像到另外一個(gè)磁盤上,最大限度的保證磁盤數(shù)據(jù)的可靠性和可修改性,具有很高的數(shù)據(jù)冗余能力,但是磁盤利用率只有50%,成本較高,多用在保存重要數(shù)據(jù)的場(chǎng)合。 RAID5:磁盤分段加奇偶校驗(yàn)技術(shù),提高了系統(tǒng)的可靠性。讀出效率很高,寫效率一般,至少需要3塊磁盤,允許一塊磁盤故障,不影響數(shù)據(jù)的可用性。 RAID0+1:把RAID0和RAID1技術(shù)結(jié)合起來(lái),至少需要4塊硬盤,每個(gè)盤都有其鏡像盤,提高全冗余能力,并具有快速讀寫能力。
網(wǎng)絡(luò)帶寬 程序應(yīng)用級(jí) 【2】系統(tǒng)性能評(píng)估標(biāo)準(zhǔn)
其中: %user:表示CPU處在用戶模式下的時(shí)間百分比。 %sys:表示CPU處在系統(tǒng)模式下的時(shí)間百分比。 %iowait:表示CPU等待輸入輸出完成時(shí)間的百分比。 swap in:即si,表示虛擬內(nèi)存的頁(yè)導(dǎo)入,即從SWAP DISK交換到RAM swap out:即so,表示虛擬內(nèi)存的頁(yè)導(dǎo)出,即從RAM交換到SWAP DISK。 【3】系統(tǒng)性能分析工具 常用系統(tǒng)命令 Vmstat、sar、iostat、netstat、free、ps、top等 常用組合方式 l 用vmstat、sar、iostat檢測(cè)是否是CPU瓶頸 l 用free、vmstat檢測(cè)是否是內(nèi)存瓶頸 l 用iostat檢測(cè)是否是磁盤I/O瓶頸 l 用netstat檢測(cè)是否是網(wǎng)絡(luò)帶寬瓶頸
1:系統(tǒng)整體性能評(píng)估(uptime命令) [root@web1 ~]# uptime 16:38:00 up 118 days, 3:01, 5 users, load average: 1.22, 1.02, 0.91 這里需要注意的是:load average這個(gè)輸出值,這三個(gè)值的大小一般不能大于系統(tǒng)CPU的個(gè)數(shù),例如,本輸出中系統(tǒng)有8個(gè)CPU,如果load average的三個(gè)值長(zhǎng)期大于8時(shí),說(shuō)明CPU很繁忙,負(fù)載很高,可能會(huì)影響系統(tǒng)性能,但是偶爾大于8時(shí),倒不用擔(dān)心,一般不會(huì)影響系統(tǒng)性能。相反,如果load average的輸出值小于CPU的個(gè)數(shù),則表示CPU還有空閑的時(shí)間片,比如本例中的輸出,CPU是非??臻e的。 2:cpu性能評(píng)估 (1)利用vmstat命令監(jiān)控系統(tǒng)CPU 該命令可以顯示關(guān)于系統(tǒng)各種資源之間相關(guān)性能的簡(jiǎn)要信息,這里我們主要用它來(lái)看CPU一個(gè)負(fù)載情況。 下面是vmstat命令在某個(gè)系統(tǒng)的輸出結(jié)果:
[root@node1 ~]# vmstat 2 3 #每2秒更新信息,統(tǒng)計(jì)3次 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0 0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0 0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0 Procs r列表示運(yùn)行和等待cpu時(shí)間片的進(jìn)程數(shù),這個(gè)值如果長(zhǎng)期大于系統(tǒng)CPU的個(gè)數(shù),說(shuō)明CPU不足,需要增加CPU。 b列表示在等待資源的進(jìn)程數(shù),比如正在等待I/O、或者內(nèi)存交換等。 Cpu us列顯示了用戶進(jìn)程消耗的CPU 時(shí)間百分比。us的值比較高時(shí),說(shuō)明用戶進(jìn)程消耗的cpu時(shí)間多,但是如果長(zhǎng)期大于50%,就需要考慮優(yōu)化程序或算法。 sy列顯示了內(nèi)核進(jìn)程消耗的CPU時(shí)間百分比。Sy的值較高時(shí),說(shuō)明內(nèi)核消耗的CPU資源很多。 根據(jù)經(jīng)驗(yàn),us+sy的參考值為80%,如果us+sy大于 80%說(shuō)明可能存在CPU資源不足。 (2) 利用sar命令監(jiān)控系統(tǒng)CPU sar功能很強(qiáng)大,可以對(duì)系統(tǒng)的每個(gè)方面進(jìn)行單獨(dú)的統(tǒng)計(jì),但是使用sar命令會(huì)增加系統(tǒng)開銷,不過(guò)這些開銷是可以評(píng)估的,對(duì)系統(tǒng)的統(tǒng)計(jì)結(jié)果不會(huì)有很大影響。 下面是sar命令對(duì)某個(gè)系統(tǒng)的CPU統(tǒng)計(jì)輸出: [root@webserver ~]# sar -u 3 5 #u顯示系統(tǒng)所有cpu在采樣時(shí)間內(nèi)的負(fù)載狀態(tài) Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU) 11:41:24 AM CPU %user %nice %system %iowait %steal %idle 11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83 11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50 11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92 11:41:36 AM all 90.08 0.00 0.13 0.16 0.00 9.63 11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41 Average: all 0.34 0.00 0.16 0.05 0.00 99.45 對(duì)上面每項(xiàng)的輸出解釋如下: l %user列顯示了用戶進(jìn)程消耗的CPU 時(shí)間百分比。 l %nice列顯示了運(yùn)行正常進(jìn)程所消耗的CPU 時(shí)間百分比。 l %system列顯示了系統(tǒng)進(jìn)程消耗的CPU時(shí)間百分比。 l %iowait列顯示了IO等待所占用的CPU時(shí)間百分比 l %steal列顯示了在內(nèi)存相對(duì)緊張的環(huán)境下pagein強(qiáng)制對(duì)不同的頁(yè)面進(jìn)行的steal操作 。 l %idle列顯示了CPU處在空閑狀態(tài)的時(shí)間百分比。 3:內(nèi)存性能評(píng)估 free是監(jiān)控linux內(nèi)存使用狀況最常用的指令,看下面的一個(gè)輸出: [root@webserver ~]# free -m #查看以M為單位的內(nèi)存使用情況 total used free shared buffers cached Mem: 8111 7185 926 0 243 6299 -/+ buffers/cache: 643 7468 Swap: 8189 0 8189 一般有這樣一個(gè)經(jīng)驗(yàn)公式:應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存>70%時(shí),表示系統(tǒng)內(nèi)存資源非常充足,不影響系統(tǒng)性能,應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<20%時(shí),表示系統(tǒng)內(nèi)存資源緊缺,需要增加系統(tǒng)內(nèi)存,20%<應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<70%時(shí),表示系統(tǒng)內(nèi)存資源基本能滿足應(yīng)用需求,暫時(shí)不影響系統(tǒng)性能。 (2) 利用vmstat命令監(jiān)控內(nèi)存 [root@node1 ~]# vmstat 2 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0 0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0 0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0 memory swpd列表示切換到內(nèi)存交換區(qū)的內(nèi)存數(shù)量(以k為單位)。如果swpd的值不為0,或者比較大,只要si、so的值長(zhǎng)期為0,這種情況下一般不用擔(dān)心,不會(huì)影響系統(tǒng)性能。 free列表示當(dāng)前空閑的物理內(nèi)存數(shù)量(以k為單位) buff列表示buffers cache的內(nèi)存數(shù)量,一般對(duì)塊設(shè)備的讀寫才需要緩沖。 cache列表示page cached的內(nèi)存數(shù)量,一般作為文件系統(tǒng)cached,頻繁訪問(wèn)的文件都會(huì)被cached,如果cache值較大,說(shuō)明cached的文件數(shù)較多,如果此時(shí)IO中bi比較小,說(shuō)明文件系統(tǒng)效率比較好。 swap si列表示由磁盤調(diào)入內(nèi)存,也就是內(nèi)存進(jìn)入內(nèi)存交換區(qū)的數(shù)量。 so列表示由內(nèi)存調(diào)入磁盤,也就是內(nèi)存交換區(qū)進(jìn)入內(nèi)存的數(shù)量。 一般情況下,si、so的值都為0,如果si、so的值長(zhǎng)期不為0,則表示系統(tǒng)內(nèi)存不足。需要增加系統(tǒng)內(nèi)存。 4:磁盤I/O性能評(píng)估 (1)磁盤存儲(chǔ)基礎(chǔ) l 熟悉RAID存儲(chǔ)方式,可以根據(jù)應(yīng)用的不同,選擇不同的RAID方式。 l 盡可能用內(nèi)存的讀寫代替直接磁盤I/O,使頻繁訪問(wèn)的文件或數(shù)據(jù)放入內(nèi)存中進(jìn)行操作處理,因?yàn)閮?nèi)存讀寫操作比直接磁盤讀寫的效率要高千倍。 l 將經(jīng)常進(jìn)行讀寫的文件與長(zhǎng)期不變的文件獨(dú)立出來(lái),分別放置到不同的磁盤設(shè)備上。 l 對(duì)于寫操作頻繁的數(shù)據(jù),可以考慮使用裸設(shè)備代替文件系統(tǒng)。 使用裸設(shè)備的優(yōu)點(diǎn)有: ü 數(shù)據(jù)可以直接讀寫,不需要經(jīng)過(guò)操作系統(tǒng)級(jí)的緩存,節(jié)省了內(nèi)存資源,避免了 內(nèi)存資源爭(zhēng)用。 ü 避免了文件系統(tǒng)級(jí)的維護(hù)開銷,比如文件系統(tǒng)需要維護(hù)超級(jí)塊、I-node等。 ü 避免了操作系統(tǒng)的cache預(yù)讀功能,減少了I/O請(qǐng)求。 ü 使用裸設(shè)備的缺點(diǎn)是: ü 數(shù)據(jù)管理、空間管理不靈活,需要很專業(yè)的人來(lái)操作。 (2)利用iostat評(píng)估磁盤性能 [root@webserver ~]# iostat -d 2 3 #-d 顯示磁盤的使用情況 Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 1.87 2.58 114.12 6479462 286537372
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 1.00 0.00 12.00 0 24 對(duì)上面每項(xiàng)的輸出解釋如下: Blk_read/s表示每秒讀取的數(shù)據(jù)塊數(shù)。 Blk_wrtn/s表示每秒寫入的數(shù)據(jù)塊數(shù)。 Blk_read表示讀取的所有塊數(shù)。 Blk_wrtn表示寫入的所有塊數(shù)。 可以通過(guò)Blk_read/s和Blk_wrtn/s的值對(duì)磁盤的讀寫性能有一個(gè)基本的了解,如果Blk_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優(yōu)化磁盤或者優(yōu)化程序,如果Blk_read/s值很大,表示磁盤直接讀取操作很多,可以將讀取的數(shù)據(jù)放入內(nèi)存中進(jìn)行操作。 對(duì)于這兩個(gè)選項(xiàng)的值沒有一個(gè)固定的大小,根據(jù)系統(tǒng)應(yīng)用的不同,會(huì)有不同的值,但是有一個(gè)規(guī)則還是可以遵循的:長(zhǎng)期的、超大的數(shù)據(jù)讀寫,肯定是不正常的,這種情況一定會(huì)影響系統(tǒng)性能。 (3)利用sar評(píng)估磁盤性能 通過(guò)“sar –d”組合,可以對(duì)系統(tǒng)的磁盤IO做一個(gè)基本的統(tǒng)計(jì),請(qǐng)看下面的一個(gè)輸出: [root@webserver ~]# 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 需要關(guān)注的幾個(gè)參數(shù)含義: await表示平均每次設(shè)備I/O操作的等待時(shí)間(以毫秒為單位)。 svctm表示平均每次設(shè)備I/O操作的服務(wù)時(shí)間(以毫秒為單位)。 %util表示一秒中有百分之幾的時(shí)間用于I/O操作。
對(duì)以磁盤IO性能,一般有如下評(píng)判標(biāo)準(zhǔn): 正常情況下svctm應(yīng)該是小于await值的,而svctm的大小和磁盤性能有關(guān),CPU、內(nèi)存的負(fù)荷也會(huì)對(duì)svctm值造成影響,過(guò)多的請(qǐng)求也會(huì)間接的導(dǎo)致svctm值的增加。 await值的大小一般取決與svctm的值和I/O隊(duì)列長(zhǎng)度以及I/O請(qǐng)求模式,如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠(yuǎn)高于svctm的值,則表示I/O隊(duì)列等待太長(zhǎng),系統(tǒng)上運(yùn)行的應(yīng)用程序?qū)⒆兟藭r(shí)可以通過(guò)更換更快的硬盤來(lái)解決問(wèn)題。 %util項(xiàng)的值也是衡量磁盤I/O的一個(gè)重要指標(biāo),如果%util接近100%,表示磁盤產(chǎn)生的I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿負(fù)荷的在工作,該磁盤可能存在瓶頸。長(zhǎng)期下去,勢(shì)必影響系統(tǒng)的性能,可以通過(guò)優(yōu)化程序或者通過(guò)更換更高、更快的磁盤來(lái)解決此問(wèn)題。 5:網(wǎng)絡(luò)性能評(píng)估. (1)通過(guò)ping命令檢測(cè)網(wǎng)絡(luò)的連通性 (2)通過(guò)netstat –i組合檢測(cè)網(wǎng)絡(luò)接口狀況 (3)通過(guò)netstat –r組合檢測(cè)系統(tǒng)的路由表信息 (4)通過(guò)sar –n組合顯示系統(tǒng)的網(wǎng)絡(luò)運(yùn)行狀態(tài) sar -n DEV 5 3 【5】常用分析
netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}' 查看tcp鏈接數(shù) netstat -pant |grep ":80"|awk '{print $5}' | awk -F: '{print $1}'|sort|uniq -c|sort -nr 查看連接數(shù)最多的ip cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n10 提取日志 分別是訪問(wèn)URL和URL訪問(wèn)來(lái)源 排序 awk '{print $7}' access.log | sort | uniq -c |sort -nr | head -n10 > test.txt 【6】shell分析nginx日志
178.255.215.86 - - [04/Jul/2013:00:00:31 +0800] "GET /tag/316/PostgreSQL HTTP/1.1" 200 4779 "-" "Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www./go/robot)" "-"- 178.255.215.86 - - [04/Jul/2013:00:00:34 +0800] "GET /tag/317/edit HTTP/1.1" 303 5 "-" "Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); +http://www./go/robot)" "-"- 103.29.134.200 - - [04/Jul/2013:00:00:34 +0800] "GET /code-snippet/2022/edit HTTP/1.0" 303 0 "-" "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0" "-"- 103.29.134.200 - - [04/Jul/2013:00:00:35 +0800] "GET /user/login?url=http%3A//outofmemory.cn/code-snippet/2022/edit HTTP/1.0" 200 4748 "-" "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0" "-"-
以下腳本都是基于上面日志格式的,如果你的日志格式不同需要調(diào)整awk后面的參數(shù)。 |
|
|
來(lái)自: 海漩渦 > 《knowledge》