來源:半劫小仙 發(fā)布時間:2019-01-14 14:41:11 閱讀量:1691
本文節(jié)選自淺談服務(wù)器性能測試的全生命周期——從測試、結(jié)果分析到優(yōu)化策略
小白用戶一個,前段時間自己選擇云服務(wù)器時就面臨了不知道選什么參數(shù)配置的問題,也不知道各個性能指標(biāo)是怎樣限制服務(wù)器性能的。覺得此文拿來做科普非常好,這里備忘一下。
硬件對服務(wù)器性能影響還是蠻大的,如果是土豪的話,可以直接買最好的。我們分析硬件主要是希望選擇合適的配置,節(jié)約資源,避免出現(xiàn)高射炮打蚊子的情況。
在資金的充足下,一般來說CPU的數(shù)量越多,主頻越高,那么服務(wù)器的性能也就會越好。在實際測試過程中,如果在大壓力下持續(xù)觀察CPU的使用率很低,那么CPU的資源基本上是可以滿足服務(wù)器要求的。這樣的情況其實是有點浪費CPU資源的,比較理想的情況是壓力不大的時候CPU利用率比較低,壓力上來之后CPU利用率保持在60%-70%。
大部分的CPU在同一時間內(nèi)只能運行一個線程,但是超線程的處理器可以在同一個時間運行多個線程,我們可以利用處理前超線程特性提高系統(tǒng)性能。雖然采用超線程技術(shù)能同時執(zhí)行兩個線程,但它并不象兩個真正的CPU那樣,每個CPU都具有獨立的資源。當(dāng)兩個線程都同時需要某一個資源時,其中一個要暫時停止,并讓出資源,直到這些資源閑置后才能繼續(xù)。因此超線程的性能并不等于兩顆CPU的性能。
內(nèi)存的大小也是影響服務(wù)器性能的一個重要因素。內(nèi)存太小,系統(tǒng)進程要被阻塞,應(yīng)用程序會變得緩慢,甚至是失去響應(yīng);如果太大的話,也是造成一種浪費。Linux系統(tǒng)中采用物理內(nèi)存和虛擬內(nèi)存兩種方式,使用虛擬內(nèi)存可以緩解物理內(nèi)存的不足,但是如果占用過多的虛擬內(nèi)存的話,應(yīng)用程序的性能會明顯的下降。
網(wǎng)絡(luò)帶寬的大小限制了客戶端與服務(wù)器交互的流量,相對其他硬件資源,網(wǎng)絡(luò)帶寬在價格上更貴。這需要我們合理預(yù)估服務(wù)器的可服務(wù)器能力,需要占用的帶寬資源。
目前磁盤都是機械方式運作的,主要體現(xiàn)在磁盤讀寫前尋找磁道的過程。磁盤自帶的讀寫緩存大小,對于磁盤讀寫速度至關(guān)重要。讀寫速度快的磁盤,通常都帶有較大的讀寫緩存。磁盤的尋道過程是機械方式,決定了其隨機讀寫速度將明顯低于順序讀寫。在我們做系統(tǒng)設(shè)計和實現(xiàn)時,需要考慮到磁盤的這一特性。
不同的操作系統(tǒng)在內(nèi)核實現(xiàn)上可能各不相同,因而對運行在上面的應(yīng)用程序來說可能影響比較大。
筆者并沒有做過分析不同操作系統(tǒng)對服務(wù)器性能的影響,因為只用過Linux開發(fā)服務(wù)器程序。Linux操作系統(tǒng)在這十幾年發(fā)展的異常迅猛,目前大部分的服務(wù)器都是運行在Linux操作系統(tǒng)上的。Linux目前具有最好的生態(tài)系統(tǒng),服務(wù)器端的各種軟件都為它而設(shè)計,默認(rèn)都認(rèn)為你是在 Linux 上跑,你要是整一個非 Linux 的服務(wù)器,你得有足夠的心理準(zhǔn)備,因為出現(xiàn)任何問題,你可能未必能找到能幫你解決問題的人。
先說一個小故事。福特公司一套重要設(shè)備出現(xiàn)故障,找了很多人來維修,結(jié)果都沒有維修好,沒辦法了,就在購買設(shè)備的英國公司高價聘請一位工程師過來維修,工程師來到之后,反復(fù)查找原因,最后在一個小零件上劃了一條線,然后對旁邊福特公司的人說,在劃線的地方切掉就好了,果不其然,切掉之后故障真的解除了,按照合約,福特公司應(yīng)支付公司一萬美元,周圍的人都唏噓不已,感嘆一條線就可以價值一萬美元,工程師回答到:那條線只值一美元,而怎樣找到那條線值9999美元。
我們在測試服務(wù)器的過程中,經(jīng)常會遇到性能上不去。查看CPU,網(wǎng)絡(luò),IO消耗都挺低的,就是定位不到問題的原因。有經(jīng)驗的程序員可能會告訴你你把某個參數(shù)修改一下,立馬性能噌噌噌上去了。比如mysql相關(guān)設(shè)置,系統(tǒng)文件描述符,緩沖區(qū)大小,time_wait快速回收設(shè)置等,甚至是線程池配置的線程個數(shù)也會對服務(wù)器的性能產(chǎn)生較大的影響。
關(guān)于數(shù)據(jù)庫參數(shù)的設(shè)置,比如mysql的配置文件my.cnf文件中,修改不同的配置(比如innodb_flush_log_at_trx_commit 設(shè)置為0,1還是2 )可能會對數(shù)據(jù)庫的讀寫性能影響很大。
比如程序中需要頻繁申請內(nèi)存,使用bzero和memset對服務(wù)器性能影響差距可能會很大。
另外程序中的一些查詢操作,采用不同的數(shù)據(jù)結(jié)構(gòu),可以實現(xiàn)時間和空間上的相互轉(zhuǎn)化,從而影響服務(wù)器的性能。