基于Linux服務(wù)器的性能分析與優(yōu)化
作為一名Linux系統(tǒng)管理員,最主要的工作是優(yōu)化系統(tǒng)配置,使應(yīng)用在系統(tǒng)上以最優(yōu)的狀態(tài)運(yùn)行,但硬件問題、軟件問題、網(wǎng)絡(luò)環(huán)境等的復(fù)雜性和多變性,導(dǎo)致了對系統(tǒng)的優(yōu)化變得異常復(fù)雜,如何定位性能問題出在哪個(gè)方面,是性能優(yōu)化的一大難題。本文從系統(tǒng)入手,重點(diǎn)講述由于系統(tǒng)軟、硬件配置不當(dāng)造成的性能問題,并且給出了檢測系統(tǒng)故障和優(yōu)化性能的一般方法和流程。
一、系統(tǒng)性能分析的目的
1.1找到系統(tǒng)性能的瓶頸
系統(tǒng)的性能是指操作系統(tǒng)完成任務(wù)的有效性、穩(wěn)定性和響應(yīng)速度。Linux系統(tǒng)管理員可能經(jīng)常會遇到系統(tǒng)不穩(wěn)定、響應(yīng)速度慢等問題,例如在Linux上搭建了一個(gè)Web服務(wù),經(jīng)常出現(xiàn)網(wǎng)頁無法打開、打開速度慢等現(xiàn)象。遇到這些問題,就有人會抱怨Linux系統(tǒng)不好,其實(shí)這些都是表面現(xiàn)象。操作系統(tǒng)完成一個(gè)任務(wù)是與系統(tǒng)自身設(shè)置、網(wǎng)絡(luò)拓樸結(jié)構(gòu)、路由設(shè)備、路由策略、接入設(shè)備、物理線路等多個(gè)方面都密切相關(guān)的,任何一個(gè)環(huán)節(jié)出現(xiàn)問題,都會影響整個(gè)系統(tǒng)的性能。因此,當(dāng)Linux應(yīng)用出現(xiàn)問題時(shí),應(yīng)當(dāng)從應(yīng)用程序、操作系統(tǒng)、服務(wù)器硬件、網(wǎng)絡(luò)環(huán)境等方面綜合排查,定位問題出現(xiàn)在哪個(gè)部分,然后集中解決。
1.2提供性能優(yōu)化方案
查找系統(tǒng)性能瓶頸是個(gè)復(fù)雜而耗時(shí)的過程,需要在應(yīng)用程序、操作系統(tǒng)、服務(wù)器硬件、網(wǎng)絡(luò)環(huán)境等方面進(jìn)行查找和定位,影響性能最大的是應(yīng)用程序和操作系統(tǒng)兩個(gè)方面,因?yàn)檫@兩個(gè)方面出現(xiàn)的問題不易察覺,隱蔽性很強(qiáng)。而硬件、網(wǎng)絡(luò)方面出現(xiàn)的問題,一般都能馬上定位。一旦找到了系統(tǒng)性能問題,解決起來就非常迅速和容易,例如發(fā)現(xiàn)系統(tǒng)硬件存在問題,如果是物理故障,那么更換硬件就可以了,如果是硬件性能不能滿足需求,升級硬件就可以了;如果發(fā)現(xiàn)是網(wǎng)絡(luò)問題,比如帶寬不夠、網(wǎng)絡(luò)不穩(wěn)定,只需優(yōu)化和升級網(wǎng)絡(luò)即可;如果發(fā)現(xiàn)是應(yīng)用程序問題,修改或優(yōu)化軟件系統(tǒng)即可;而如果是操作系統(tǒng)配置問題,修改系統(tǒng)參數(shù)、修改系統(tǒng)配置即可。 可見,只要找到了性能瓶頸,就可以提供性能優(yōu)化方案,有標(biāo)準(zhǔn)、有目的地進(jìn)行系統(tǒng)優(yōu)化。
1.3使系統(tǒng)硬件和軟件資源的使用達(dá)到平衡
Linux操作系統(tǒng)是一個(gè)開源產(chǎn)品,也是一個(gè)開源軟件的實(shí)踐和應(yīng)用平臺,在這個(gè)平臺下由無數(shù)的開源軟件支撐,常見的有Apache、Tomcat、MySQL、PHP等。開源軟件的最大理念是自由、開放,那么Linux作為一個(gè)開源平臺,最終要實(shí)現(xiàn)的是通過這些開源軟件的支持,以最低廉的成本,達(dá)到應(yīng)用性能的最優(yōu)化。但是,系統(tǒng)的性能問題并非是孤立的,解決了一個(gè)性能瓶頸,可能會出現(xiàn)另一個(gè)性能瓶頸,所以說性能優(yōu)化的最終目的是:在一定范圍內(nèi)使系統(tǒng)的各項(xiàng)資源使用趨于合理并保持一定的平衡,即系統(tǒng)運(yùn)行良好的時(shí)候恰恰就是系統(tǒng)資源達(dá)到了一個(gè)平衡狀態(tài)的時(shí)候。而在操作系統(tǒng)中,任何一項(xiàng)資源的過度使用都會破壞這種平衡狀態(tài),從而導(dǎo)致系統(tǒng)響應(yīng)緩慢或者負(fù)載過高。例如,CPU資源的過度使用會造成系統(tǒng)中出現(xiàn)大量的等待進(jìn)程,導(dǎo)致應(yīng)用程序響應(yīng)緩慢,而進(jìn)程的大量增加又會導(dǎo)致系統(tǒng)內(nèi)存資源的增加,當(dāng)物理內(nèi)存耗盡時(shí),系統(tǒng)就會使用虛擬內(nèi)存,而虛擬內(nèi)存的使用又會造成磁盤I/O的增加并加大CPU的開銷。因此,系統(tǒng)性能的優(yōu)化就是在硬件、操作系統(tǒng)、應(yīng)用軟件之間找到一個(gè)平衡點(diǎn)。
二、分析系統(tǒng)性能涉及的人員
2.1 Linux系統(tǒng)管理人員
在做性能優(yōu)化過程中,系統(tǒng)管理人員承擔(dān)著很重要的任務(wù),首先,系統(tǒng)管理人員要了解和掌握操作系統(tǒng)的當(dāng)前運(yùn)行狀態(tài),例如系統(tǒng)負(fù)載、內(nèi)存狀態(tài)、進(jìn)程狀態(tài)、CPU負(fù)荷等信息,這些信息是檢測和判斷系統(tǒng)性能的基礎(chǔ)和依據(jù);其次,系統(tǒng)管理人員還有掌握系統(tǒng)的硬件信息,例如磁盤I/O、CPU型號、內(nèi)存大小、網(wǎng)卡帶寬等參數(shù)信息,然后根據(jù)這些信息綜合評估系統(tǒng)資源的使用情況;第三,作為一名系統(tǒng)管理人員,還要掌握應(yīng)用程序?qū)ο到y(tǒng)資源的使用情況,更深入的一點(diǎn)就是要了解應(yīng)用程序的運(yùn)行效率,例如是否有程序BUG、內(nèi)存溢出等問題,通過對系統(tǒng)資源的監(jiān)控,就能發(fā)現(xiàn)應(yīng)用程序是否存在異常,如果確實(shí)是應(yīng)用程序存在問題,需要把問題立刻反映給程序開發(fā)人員,進(jìn)而改進(jìn)或升級程序。 性能優(yōu)化本身就是一個(gè)復(fù)雜和繁瑣的過程,系統(tǒng)管理人員只有了解了系統(tǒng)硬件信息、網(wǎng)絡(luò)信息、操作系統(tǒng)配置信息和應(yīng)用程序信息才能有針對性地的展開對服務(wù)器性能優(yōu)化,這就要求系統(tǒng)管理員有充足的理論知識、豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)以及縝密分析問題的頭腦。
2.2 系統(tǒng)架構(gòu)設(shè)計(jì)人員
系統(tǒng)性能優(yōu)化涉及的第二類人員就是應(yīng)用程序的架構(gòu)設(shè)計(jì)人員。如果系統(tǒng)管理人員在經(jīng)過綜合判斷后,發(fā)現(xiàn)影響性能的是應(yīng)用程序的執(zhí)行效率,那么程序架構(gòu)設(shè)計(jì)人員就要及時(shí)介入,深入了解程序運(yùn)行狀態(tài)。首先,系統(tǒng)架構(gòu)設(shè)計(jì)人員要跟蹤了解程序的執(zhí)行效率,如果執(zhí)行效率存在問題,要找出哪里出現(xiàn)了問題;其次,如果真的是架構(gòu)設(shè)計(jì)出現(xiàn)了問題,那么就要馬上優(yōu)化或改進(jìn)系統(tǒng)架構(gòu),設(shè)計(jì)更好的應(yīng)用系統(tǒng)架構(gòu)。
2.3 軟件開發(fā)人員
系統(tǒng)性能優(yōu)化最后一個(gè)環(huán)節(jié)涉及的是程序開發(fā)人員,在系統(tǒng)管理員或架構(gòu)設(shè)計(jì)人員找到程序或結(jié)構(gòu)瓶頸后,程序開發(fā)人員要馬上介入進(jìn)行相應(yīng)的程序修改。修改程序要以程序的執(zhí)行效率為基準(zhǔn),改進(jìn)程序的邏輯,有針對性地進(jìn)行代碼優(yōu)化。例如,系統(tǒng)管理人員在系統(tǒng)中發(fā)現(xiàn)有條SQL語句耗費(fèi)大量的系統(tǒng)資源,抓取這條執(zhí)行的SQL語句,發(fā)現(xiàn)此SQL語句的執(zhí)行效率太差,是開發(fā)人員編寫的代碼執(zhí)行效率低造成的,這就需要把這個(gè)信息反饋給開發(fā)人員,開發(fā)人員在收到這個(gè)問題后,可以有針對性的進(jìn)行SQL優(yōu)化,進(jìn)而實(shí)現(xiàn)程序代碼的優(yōu)化。 從上面這個(gè)過程可以看出,系統(tǒng)性能優(yōu)化一般遵循的流程是:首先系統(tǒng)管理人員查看系統(tǒng)的整體狀況,主要從系統(tǒng)硬件、網(wǎng)絡(luò)設(shè)備、操作系統(tǒng)配置、應(yīng)用程序架構(gòu)和程序代碼五個(gè)方面進(jìn)行綜合判斷,如果發(fā)現(xiàn)是系統(tǒng)硬件、網(wǎng)絡(luò)設(shè)備或者操作系統(tǒng)配置問題,系統(tǒng)管理員可以根據(jù)情況自主解決;如果發(fā)現(xiàn)是程序結(jié)構(gòu)問題,就需要提交給程序架構(gòu)設(shè)計(jì)人員;如果發(fā)現(xiàn)是程序代碼執(zhí)行問題,就交給開發(fā)人員進(jìn)行代碼優(yōu)化。這樣就完成了一個(gè)系統(tǒng)性能優(yōu)化的過程。
三、影響Linux性能的各種因素
3.1 系統(tǒng)硬件資源
1.CPU
CPU是操作系統(tǒng)穩(wěn)定運(yùn)行的根本,CPU的速度與性能在很大程度上決定了系統(tǒng)整體的性能,因此,CPU數(shù)量越多、主頻越高,服務(wù)器性能也就相對越好。但事實(shí)并非完全如此。 目前大部分CPU在同一時(shí)間內(nèi)只能運(yùn)行一個(gè)線程,超線程的處理器可以在同一時(shí)間運(yùn)行多個(gè)線程,因此,可以利用處理器的超線程特性提高系統(tǒng)性能。在Linux系統(tǒng)下,只有運(yùn)行SMP內(nèi)核才能支持超線程,但是,安裝的CPU數(shù)量越多,從超線程獲得的性能方面的提高就越少。另外,Linux內(nèi)核會把多核的處理器當(dāng)作多個(gè)單獨(dú)的CPU來識別,例如兩個(gè)4核的CPU,在Lnux系統(tǒng)下會被當(dāng)作8個(gè)單核CPU。但是從性能角度來講,兩個(gè)4核的CPU和8個(gè)單核的CPU并不完全等價(jià),根據(jù)權(quán)威部門得出的測試結(jié)論,前者的整體性能要比后者低25%~30%。 可能出現(xiàn)CPU瓶頸的應(yīng)用有郵件服務(wù)器、動態(tài)Web服務(wù)器等,對于這類應(yīng)用,要把CPU的配置和性能放在主要位置。
2.內(nèi)存
內(nèi)存的大小也是影響Linux性能的一個(gè)重要的因素,內(nèi)存太小,系統(tǒng)進(jìn)程將被阻塞,應(yīng)用也將變得緩慢,甚至失去響應(yīng);內(nèi)存太大,導(dǎo)致資源浪費(fèi)。Linux系統(tǒng)采用了物理內(nèi)存和虛擬內(nèi)存兩種方式,虛擬內(nèi)存雖然可以緩解物理內(nèi)存的不足,但是占用過多的虛擬內(nèi)存,應(yīng)用程序的性能將明顯下降,要保證應(yīng)用程序的高性能運(yùn)行,物理內(nèi)存一定要足夠大;但是過大的物理內(nèi)存,會造成內(nèi)存資源浪費(fèi),例如,在一個(gè)32位處理器的Linux操作系統(tǒng)上,超過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)存,這樣以來,即使系統(tǒng)有更大的內(nèi)存,應(yīng)用程序也無法“享”用,解決的辦法就是使用64位處理器,安裝64位操作系統(tǒng)。在64位操作系統(tǒng)下,可以滿足所有應(yīng)用程序?qū)?nèi)存的使用需求,幾乎沒有限制。 可能出現(xiàn)內(nèi)存性能瓶頸的應(yīng)用有打印服務(wù)器、數(shù)據(jù)庫服務(wù)器、靜態(tài)Web服務(wù)器等,對于這類應(yīng)用要把內(nèi)存大小放在主要位置。
3.磁盤I/O性能 磁盤的I/O性能直接影響應(yīng)用程序的性能,在一個(gè)有頻繁讀寫的應(yīng)用中,如果磁盤I/O性能得不到滿足,就會導(dǎo)致應(yīng)用停滯。好在現(xiàn)今的磁盤都采用了很多方法來提高I/O性能,比如常見的磁盤RAID技術(shù)。
RAID的英文全稱為:RedundantArrayofIndependentDisk,即獨(dú)立磁盤冗余陣列,簡稱磁盤陣列。RAID通過將多塊獨(dú)立的磁盤(物理硬盤)按不同方式組合起來形成一個(gè)磁盤組(邏輯硬盤),從而提供比單個(gè)硬盤更高的I/O性能和數(shù)據(jù)冗余。 通過RAID技術(shù)組成的磁盤組,就相當(dāng)于一個(gè)大硬盤,用戶可以對它進(jìn)行分區(qū)格式化、建立文件系統(tǒng)等操作,跟單個(gè)物理硬盤一模一樣,唯一不同的是RAID磁盤組的I/O性能比單個(gè)硬盤要高很多,同時(shí)在數(shù)據(jù)的安全性也有很大提升。
根據(jù)磁盤組合方式的不同,RAID可以分為RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+1、RAID10等級別,常用的RAID級別有RAID0、RAID1、RAID5、RAID0+1,這里進(jìn)行簡單介紹。
RAID0:通過把多塊硬盤粘合成一個(gè)容量更大的硬盤組,提高了磁盤的性能和吞吐量。這種方式成本低,要求至少兩個(gè)磁盤,但是沒有容錯(cuò)和數(shù)據(jù)修復(fù)功能,因而只能用在對數(shù)據(jù)安全性要求不高的環(huán)境中。
RAID1:也就是磁盤鏡像,通過把一個(gè)磁盤的數(shù)據(jù)鏡像到另一個(gè)磁盤上,最大限度地保證磁盤數(shù)據(jù)的可靠性和可修復(fù)性,具有很高的數(shù)據(jù)冗余能力,但磁盤利用率只有50%,因而,成本最高,多用在保存重要數(shù)據(jù)的場合。
RAID5:采用了磁盤分段加奇偶校驗(yàn)技術(shù),從而提高了系統(tǒng)可靠性,RAID5讀出效率很高,寫入效率一般,至少需要3塊盤。允許一塊磁盤故障,而不影響數(shù)據(jù)的可用性。
RAID0+1:把RAID0和RAID1技術(shù)結(jié)合起來就成了RAID0+1,至少需要4個(gè)硬盤。此種方式的數(shù)據(jù)除分布在多個(gè)盤上外,每個(gè)盤都有其鏡像盤,提供全冗余能力,同時(shí)允許一個(gè)磁盤故障,而不影響數(shù)據(jù)可用性,并具有快速讀/寫能力。 通過了解各個(gè)RAID級別的性能,可以根據(jù)應(yīng)用的不同特性,選擇適合自身的RAID級別,從而保證應(yīng)用程序在磁盤方面達(dá)到最優(yōu)性能。
4.網(wǎng)絡(luò)寬帶
Linux下的各種應(yīng)用,一般都是基于網(wǎng)絡(luò)的,因此網(wǎng)絡(luò)帶寬也是影響性能的一個(gè)重要因素,低速的、不穩(wěn)定的網(wǎng)絡(luò)將導(dǎo)致網(wǎng)絡(luò)應(yīng)用程序的訪問阻塞,而穩(wěn)定、高速的網(wǎng)絡(luò)帶寬,可以保證應(yīng)用程序在網(wǎng)絡(luò)上暢通無阻地運(yùn)行。幸運(yùn)的是,現(xiàn)在的網(wǎng)絡(luò)一般都是千兆帶寬或光纖網(wǎng)絡(luò),帶寬問題對應(yīng)用程序性能造成的影響也在逐步降低。
3.2 操作系統(tǒng)相關(guān)資源
基于操作系統(tǒng)的性能優(yōu)化也是多方面的,可以從系統(tǒng)安裝、系統(tǒng)內(nèi)核參數(shù)、網(wǎng)絡(luò)參數(shù)、文件系統(tǒng)等幾個(gè)方面進(jìn)行衡量,下面依次進(jìn)行簡單介紹。
1.系統(tǒng)安裝優(yōu)化
系統(tǒng)優(yōu)化可以從安裝操作系統(tǒng)開始,當(dāng)安裝Linux系統(tǒng)時(shí),磁盤的劃分,SWAP內(nèi)存的分配都直接影響以后系統(tǒng)的運(yùn)行性能,例如,磁盤分配可以遵循應(yīng)用的需求:對于對寫操作頻繁而對數(shù)據(jù)安全性要求不高的應(yīng)用,可以把磁盤做成RAID0;而對于對數(shù)據(jù)安全性較高,對讀寫沒有特別要求的應(yīng)用,可以把磁盤做成RAID1;對于對讀操作要求較高,而對寫操作無特殊要求,并要保證數(shù)據(jù)安全性的應(yīng)用,可以選擇RAID5;對于對讀寫要求都很高,并且對數(shù)據(jù)安全性要求也很高的應(yīng)用,可以選擇RAID01。這樣通過不同的應(yīng)用需求設(shè)置不同的RAID級別,在磁盤底層對系統(tǒng)進(jìn)行優(yōu)化操作。
隨著內(nèi)存價(jià)格的降低和內(nèi)存容量的日益增大,對虛擬內(nèi)存SWAP的設(shè)定,現(xiàn)在已經(jīng)沒有了所謂虛擬內(nèi)存是物理內(nèi)存兩倍的要求,但是SWAP的設(shè)定還是不能忽略,根據(jù)經(jīng)驗(yàn),如果內(nèi)存較小(物理內(nèi)存小于4GB),一般設(shè)置SWAP交換分區(qū)大小為內(nèi)存的2倍;如果物理內(nèi)存大于4GB小于16GB,可以設(shè)置SWAP大小等于或略小于物理內(nèi)存即可;如果內(nèi)存大小在16GB以上,原則上可以設(shè)置SWAP為0,但并不建議這么做,因?yàn)樵O(shè)置一定大小的SWAP還是有一定作用的。
2.內(nèi)核參數(shù)優(yōu)化
系統(tǒng)安裝完成后,優(yōu)化工作并沒有結(jié)束,接下來還可以對系統(tǒng)內(nèi)核參數(shù)進(jìn)行優(yōu)化,不過內(nèi)核參數(shù)的優(yōu)化要和系統(tǒng)中部署的應(yīng)用結(jié)合起來整體考慮。例如,如果系統(tǒng)部署的是Oracle數(shù)據(jù)庫應(yīng)用,那么就需要對系統(tǒng)共享內(nèi)存段(kernel.shmmax、kernel.shmmni、kernel.shmall)、系統(tǒng)信號量(kernel.sem)、文件句柄(fs.file-max)等參數(shù)進(jìn)行優(yōu)化設(shè)置;如果部署的是Web應(yīng)用,那么就需要根據(jù)Web應(yīng)用特性進(jìn)行網(wǎng)絡(luò)參數(shù)的優(yōu)化,例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等網(wǎng)絡(luò)內(nèi)核參數(shù)。
3.文件系統(tǒng)優(yōu)化
文件系統(tǒng)的優(yōu)化也是系統(tǒng)資源優(yōu)化的一個(gè)重點(diǎn),在Linux下可選的文件系統(tǒng)有ext2、ext3、xfs、ReiserFS,根據(jù)不同的應(yīng)用,選擇不同的文件系統(tǒng)。
Linux標(biāo)準(zhǔn)文件系統(tǒng)是從VFS開始的,然后是ext,接著就是ext2,應(yīng)該說,ext2是Linux上標(biāo)準(zhǔn)的文件系統(tǒng),ext3是在ext2基礎(chǔ)上增加日志形成的,從VFS到ext3,其設(shè)計(jì)思想沒有太大變化,都是早期UNIX家族基于超級塊和inode的設(shè)計(jì)理念。
XFS文件系統(tǒng)是SGI開發(fā)的一個(gè)高級日志文件系統(tǒng),后來移植到了Linux系統(tǒng)下,XFS通過分布處理磁盤請求、定位數(shù)據(jù)、保持Cache的一致性來提供對文件系統(tǒng)數(shù)據(jù)的低延遲、高帶寬的訪問,因此,XFS極具伸縮性,非常健壯,具有優(yōu)秀的日志記錄功能、可擴(kuò)展性強(qiáng)、快速寫入性能等優(yōu)點(diǎn)。 ReiserFS是在HansReiser領(lǐng)導(dǎo)下開發(fā)出來的一款高性能的日志文件系統(tǒng),它通過完全平衡樹結(jié)構(gòu)來管理數(shù)據(jù),包括文件數(shù)據(jù),文件名及日志支持等,與ext2/ext3相比,最大的優(yōu)點(diǎn)是訪問性能和安全性大幅提升。ReiserFS具有高效、合理利用磁盤空間,先進(jìn)的日志管理機(jī)制,特有的搜尋方式,海量磁盤存儲等優(yōu)點(diǎn)。
3.3 應(yīng)用程序軟件資源
應(yīng)用程序的優(yōu)化其實(shí)是整個(gè)優(yōu)化工程的核心,如果一個(gè)應(yīng)用程序存在BUG,那么即使所有其他方面都達(dá)到了最優(yōu)狀態(tài),整個(gè)應(yīng)用系統(tǒng)還是性能低下,所以,對應(yīng)用程序的優(yōu)化是性能優(yōu)化過程的重中之重,這就對程序架構(gòu)設(shè)計(jì)人員和程序開發(fā)人員提出了更高的要求。