1. 程式人生 > >網站運維技術與實踐之測試評估

網站運維技術與實踐之測試評估

在一個網站應用系統的完整生命週期中,上線之前還有漫長的開發和測試階段。作為系統未來的管理者和負責人,運維人員有必要在這個階段就參與進來,根據業務的預期,完成系統層面的容量和壓力測試,根據測試資料做出切實的運維規劃,包括採購清單、結構設計、預警閾值和應急預案等。

可以說,監控,是防止“千里之堤,潰於蟻穴”;測試,是“萬丈高樓第一層”。

一、伺服器效能測試

和監控一樣,測試工作也分為伺服器和應用兩大部分。可以說,所有監控需要關心的資料,都對應地需要提前進行測試,這裡不再舉例。下面介紹一些常用的測試工具,功能也許會有重疊,但都會有自己側重的有特色的地方。掌握好工具最鋒利的部分,靈活運用,就可以構建出最適合自己的測試工具箱了。

1.IOzone

檔案讀寫效能包括兩個層面,一方面是純粹的磁碟讀寫能力。這方面本書之前章節已有介紹,我們可以通過硬體裝置的資料進行估算;另一方面是檔案系統的讀寫能力。在這方面,各種檔案系統的實現細節毫釐千里,一般運維人員很難也沒有必要花費大量時間來逐一研讀程式碼。通過儘可能貼近場景的模擬測試,來獲取足以支援選擇某個檔案系統理由的資料,成為最方便快捷的辦法。

IOzone可以使用系統呼叫,通過模擬在檔案系統層面的各種讀寫操作,來統計系統的檔案I/O效能。比較貼心的是,IOzone還能自動把測試結果通過gnuplot繪製成三維圖形,使得使用者可以更直觀地瞭解I/O情況。IOzone官網地址:http://www.iozone.org/

IOzone目前支援13種I/O型別的測試,可以根據業務情況採用多個"-I"引數來指定,具體引數值和型別如下:

(1)write/re-write

寫新檔案和重寫一個已存在檔案,差別在於重寫檔案不需要建立檔案元資訊。

(2)read/re-read

讀檔案和重讀檔案,差別在於作業系統的快取。

(3)random-read/write

隨機讀寫。主要受作業系統快取大小、磁碟資料和RAID級別、磁碟轉速等因素影響。

(4)Read-backwards

逆序讀檔案。某些作業系統對上TB大小的檔案讀寫做的不太好,所以出現這個測試。

(5)Re-write-record

對檔案的一個特定點進行重寫測試。當這個特定點的大小分佈介於CPU快取、TLB、作業系統快取的不同區間時,效能會大大不同。

(6)stride-read

跳躍式讀取檔案。比如從檔案起始位置連續讀取4KB內容,然後seek到200KB之後,再讀取4KB長度,接著又seek,以此類推。這個行為用來模擬某些應用的特定資料結構操作。

(7)fwrite/re-fwrite

使用fwrite庫測試。fwrite會利用使用者空間的buffer,所以當應用在寫比較小的內容時,fwrite會進行阻塞合併操作,然後每次以較大的內容進行一次真正的寫操作以提高效能。

(8)fread/re-fread

使用fread庫測試,特點和fwrite一致。

(9)random mix

混合隨機讀寫。這個測試只用於吞吐量測試。每個執行緒都可以執行讀或者寫,具體如何執行則由round-robin輪詢決定。

(10)pwrite/re-pwrite

在檔案的指定偏移量處開始寫和重寫。之前的測試都是從起始位置開始的。

(11)pread/re-pread

在檔案的指定偏移量處開始讀和重讀。

(12)pwritev/re-pwritev

與pwrite類似,不過是從多個buffer中寫出資料。

(13)preadv/re-preadv

和pread類似,不過是讀取到多個buffer中。

關於IOzone的安裝和使用,我覺得可以參考這個教程:https://blog.csdn.net/u012528029/article/details/51002950

2.Netperf

衡量網路效能主要有五項指標,包括:可用性、響應時間、網路利用率、網路吞吐量和網路頻寬容量。而獲取這些的指標方式,也有三種:

其一,通過Net-SNMP工具從網路裝置中讀取資料;

其二,通過TCPDump工具抓取網路報文分析;

其三,通過模擬測試獲取資料。

最常見的模擬測試工具,就是Netperf。Netperf工具以client/server方式工作。server端是netserver,用來偵聽來自client端的連線;client是netperf,用來向server發起網路測試。在client和server之間,首先要建立一個控制連線,傳遞有關測試配置的資訊,以及測試的結果。在控制連線建立並傳遞測試配置資訊以後,client和server之間會再建立一個測試連線,用來來回傳遞這特殊的流量模式,以測試網路的效能。

官網地址:http://www.netperf.org/

(1)測試流量模式介紹

Netperf主要測試的是基於TCP或UDP的傳輸,針對兩種協議分別有不同的流量模式。Netperf測試結果所反映的是一個系統能夠以多塊的速度向另外一個系統傳送資料,以及另外一個系統能夠以多塊的速度接收資料。

TCP協議能夠提供端對端的可靠傳輸,其建立並維護連線、控制資料有序地傳遞等都會消耗一定的網路頻寬。所以TCP測試會比較考慮頻寬和效率的問題。Netperf可以模擬三種不同的TCP流量模式。

a.單個TCP連線,批量傳輸大量資料。

b.單個TCP連線,Client少量請求/Server大量響應的交易模式。

c.多個TCP連線,每個連線中一對請求/響應的交易模式。

UDP協議沒有建立連線的負擔,但是卻不能保證傳輸的可靠性,使用UDP的應用程式需要自行跟蹤每個發出的分組,並重發丟失的分組。所以UDP測試會比較關注丟包率的問題。Netperf可以模擬兩種UDP的流量模式。

a.從client到server的單向批量傳輸。

b.請求/響應的交易模式。

注意:由於UDP傳輸的不可靠性,在使用Netperf時要確保傳送的緩衝區大小不能大於接收緩衝區大小,否則資料會丟失,Netperf測試結論丟包率會變得比實際大很多。

3.pktgen

pktgen工具,主要用來測試伺服器本身在網絡卡方面的效能,考量伺服器本身對包的處理能力-這也是上層協議和應用的效能基礎。事實上在全面測試中,通過dstat命令可以發現,HTTP服務極限場景的收發包速度,和pktgen測試的結果是接近的。

pktgen是一個Linux核心模組,通過CONFIG_NET_PKTGEN開關來控制編譯即可。pktgen執行的時候,會自動在裝置的每個CPU上都繫結執行一個執行緒,同時在procfs偽檔案系統上生成狀態檔案和控制檔案。包括以下三種:

(1)/proc/net/pktgen/pgctrl

(2)/proc/net/pktgen/kpktgend_0

(3)/proc/net/pktgen/eth*

pktgen的所有配置和命令都是通過想procfs輸入指令來完成。

4.sysbench

sysbench是為資料庫應用準備的系統測試工具,也就是說,影響資料庫效能的系統元件,包括CPU、記憶體、檔案系統、程序排程和執行緒等,sysbench都可以對其進行測試。

專案地址:https://sourceforge.net/

(1)CPU效能測試

CPU測試主要測試的是計算能力,具體來說就是做質數的加法運算。命令如下:

sysbench --test=cpu --cpu-max-prime=20000 run

 (2)檔案I/O效能測試

前面說到過IOzone測試檔案I/O。其實sysbench測試的要點大同小異,只是測試的I/O型別沒有那麼多。sysbench支援的I/O測試型別包括:seqwr(順序寫)、seqrewri(順序重寫)、seqrd(順序讀)、rndrd(隨機讀)、rndwr(隨機寫)和rndrw(隨機讀寫)等六種。

此外,在隨機讀寫測試模式下,還可以指定讀寫操作和寫操作的百分比。測試需要先預設好指定大小檔案。

(3)記憶體測試

記憶體測試中也可以指定順序或者隨機讀寫模式,不過這裡最重要的是,指定的記憶體傳輸大小不能超過裝置的實際記憶體大小!預設值為100GB,顯然是大於一般裝置的記憶體總量的。

(4)資料庫測試

sysbench中的oltp測試支援MySQL、Oracle和PostgreSQL三種資料庫,都需要在編譯的時候指定庫檔案,然後在測試時通過"--db-driver"引數指定。如果編譯的時候只支援一種資料庫,那麼可以忽略這個引數。

otp測試引數分為兩部分:一部分是oltp相關引數,用於規劃最終形成的資料庫測試表的資料。最簡單的就是表的大小,這個預設值是10000條記錄。另一部分是db-driver相關引數,用來完成資料庫連線,比如IP地址和埠、使用者名稱密碼,資料庫是MySQL的話還有特有的儲存引擎設定。MySQL資料庫效能基準測試工具還有很多,比如MySQL自帶的mysqlslap和Perl編寫的MyBench、Super-Smack等。Sysbench自動支援了事務處理測試,還是比較方便的。

二、應用效能測試

網站應用除了資料庫之外,另一個重要部分就是HTTP服務。尤其是大規模擴充套件的情況下,應用元件之間也大多采用HTTP介面相互呼叫,HTTP服務效能測試就更加重要。這裡介紹三個各有優勢的HTTP效能測試工具。

1.http_load

http_load是一個極為簡單的小工具,它只利用單核單程序完成測試,可以很放心地在伺服器上使用。使用方面,在總結過運維最常見的需求後,http_load只提供兩對測試引數來隨機測試一組URL列表。在一些需要快速定位的場合中,非常實用。

官網地址:http://www.acme.com/software/http_load/

使用詳解:https://www.cnblogs.com/shijingjing07/p/6539179.html

2.AB(ApacheBench)

AB是Apache httpd專案自帶的測試工具。也是大多數運維人員最熟悉和最早接觸的HTTP服務效能測試工具。

AB對HTTP協議的支援比較全面,包括HEAD、GET、POST和PUT四種請求方式,以及自定義TCP收發緩衝的大小,自定義RequestHeader和Cookie,支援KeepAlive特性、HTTPS協議和WWW-Authentication認證等。不過AB只支援單個URL和併發請求/總請求數的測試模式(相對於http_load的-p/-f模式)。

AB的安裝和使用參考:https://www.cnblogs.com/Ryana/p/6279232.html

AB的使用詳解:https://www.cnblogs.com/xiaoyaowuming/p/5622660.html

3.weighttp

weighttp和AB類似,它是另一款著名開源HTTP伺服器Lighttpd專案下的效能測試工具。官網地址:http://redmine.lighttpd.net/projects/weighttp/wiki

weighttp目前的測試模式將很少。但作為年齡比較小的專案,weighttp也有自己的特點-它底層使用libev庫。libev是一個性能比著名的libevent還要好一些的網路事件驅動庫。所以weighttp本身的效能也很不錯。

安裝和使用:https://blog.csdn.net/yang382197207/article/details/19190089?locationNum=2&fps=1

三、分散式測試環境

1.AutoBench

AutoBench是一個用Perl編寫的基於Httperf開發的分散式測試系統。程式碼量不大,使用也很簡單,我們可以從這個系統中學習如何構建一個分散式測試環境。

官網地址:http://www.xenoclast.org/autobench/

AutoBench安裝和使用:https://www.cnblogs.com/Ryana/p/6279232.html

2.TCPCopy

TCPCopy的用途很廣,常見的應用場景如下:

(1)分散式壓力測試:利用線上資料,可以測試系統能夠承受的壓力大小,也可以提前發現一些bug。

(2)上線測試:可以發現新系統是否穩定,提前發現上線過程中會出現的諸多問題。

(3)對比測試:針對不同程式或相同程式的不同版本,使用相同的流量請求做效能對比。

(4)流量放大:可以利用多種手段構造無限線上壓力,滿足壓力測試要求。

(5)利用TCPCopy轉發傳統壓力測試工具發出的請求,可以增加網路延遲,使其壓力測試更加真實。

(6)熱備份

程式碼託管地址:https://github.com/wangbin579/tcpcopy

TCPCopy安裝和使用:https://www.cnblogs.com/phennry/p/6382755.html?utm_source=itdadao&utm_medium=referral