- 論壇徽章:
- 0
|
本帖最后由 aaaaaa 于 2013-12-19 22:54 編輯
# jtest與ATS壓力測試 #
作為一個高性能的proxy代理服務(wù)器,Apache Traffic Server是很難用常用工具進(jìn)行細(xì)致的性能壓測的,本文嘗試對性能壓測進(jìn)行定義并介紹如何在這種高性能、高并發(fā)、大規(guī)模的系統(tǒng)中,進(jìn)行破壞級別的壓力測試。
## 壓力測試的定義 ##
很多情況下,大家都希望在服務(wù)器上線前、業(yè)務(wù)上線前,對業(yè)務(wù)的支撐能力做一個測試,希望知道自己的改動是不是在進(jìn)步,是不是能夠比較平穩(wěn)的抗住預(yù)期的流量壓力,等等,總結(jié)下來壓力測試的主要用途有:
1. 確定新版本的改進(jìn)不會引起性能問題
2. 找出業(yè)務(wù)的單機(jī)qps數(shù)據(jù),并定義好安全的水位線
3. 使用性能數(shù)據(jù)作為硬件采購以及預(yù)算的參數(shù)
4. 更好的理解業(yè)務(wù)的波動對線上系統(tǒng)的壓力
日常開發(fā)中,最最有意義的是,找出新代碼是否在性能上有回退;找出新的性能改進(jìn)到底提高了多少。
根據(jù)壓力的來源,壓力測試又會被分為:
1. 實驗室仿真壓力測試
實驗室仿真,在http proxy服務(wù)器測試場景下,客戶端和服務(wù)器端的數(shù)據(jù)和請求,都是由工具生成的。
2. 業(yè)務(wù)copy仿真壓力測試
顯然,如果希望服務(wù)器程序真正的能夠在線上跑,簡單的實驗室測試與業(yè)務(wù)需求肯定是差異非常大,因此就有了為什么不把業(yè)務(wù)流量復(fù)制到系統(tǒng)中來的想法。這也就是所謂的流量復(fù)制的壓測方式。
## jtest工具初步介紹 ##
jtest是一個專門用于proxy/cache系統(tǒng)的實驗室性能壓力測試工具,具有極高的性能。能夠同時擔(dān)當(dāng)后臺服務(wù)器和客戶端。ATS系統(tǒng)專用的性能壓測工具。
商業(yè)的壓力測試工具,一般也是一個所謂的盒子,自帶客戶端、服務(wù)器端,能夠自己生成模擬流量、copy客戶提交流量等,很像目前jtest的模式
最早的jtest被設(shè)計為可以分布式的集群上運(yùn)行,用上層腳本系統(tǒng)起停,來壓測一個ATS集群系統(tǒng),早先的系統(tǒng)并沒有考慮像現(xiàn)在這樣的多核CPU普遍性。
### jtest簡單說明 ###
### 基本測試
jtest作為專門針對ATS的測試,已經(jīng)就ATS的最簡單配置下,做了很多簡化的默認(rèn)參數(shù),以便于用戶快速的上手,我們以最簡單的本機(jī)jtest壓測本機(jī)的默認(rèn)配置ATS為例子,介紹最基本的jtest用法:
1. 設(shè)置ATS的remap規(guī)則:
在默認(rèn)的空remap.config中添加一條規(guī)則
> map http://localhost:9080/ http://127.0.0.1:9080/
2. 運(yùn)行jtest:
> jtest
這個命令默認(rèn)的參數(shù),即相當(dāng)于 "jtest -s 9080 -S localhost -p 8080 -P localhost -c 100 -z 0.4",將會起100個連接使用127.0.0.1的9080端口作為jtest源服務(wù)器(jtest監(jiān)聽),對本機(jī)(localhost)的8080端口上跑的ATS進(jìn)行測試,并控制整體命中率在40%。
輸出結(jié)果:
con new ops 1byte lat bytes/per svrs new ops total time err
100 468 2329.6 39 39 36323315/363233 617 617 617 46131904 136980.9 0
100 471 2361.5 39 40 35993941/359939 619 619 619 45466393 136981.9 0
100 465 2327.0 40 41 35385495/353854 607 607 607 45095273 136982.9 0
其中:
* con: 并發(fā)連接數(shù)。并發(fā)連接數(shù),單進(jìn)程單cpu處理能力取決于CPU與測試場景,請酌情設(shè)置,推薦小于9999
* new: 每秒新建連接數(shù)。這個參數(shù)取決于并發(fā)連接數(shù)量與長連接效率。
* ops: 每秒請求數(shù)。也作qps,是比較體現(xiàn)服務(wù)器性能的關(guān)鍵指標(biāo)。
* 1byte:首字節(jié)平均響應(yīng)時間。這個是體現(xiàn)整體轉(zhuǎn)發(fā)效率的關(guān)鍵指標(biāo)。
* lat: 完成請求整體響應(yīng)時間(收到最后一個字節(jié))。cache系統(tǒng)性能關(guān)鍵指標(biāo)。
* bytes/per:每秒字節(jié)流量/每秒每連接流量
* svrs:服務(wù)器端請求數(shù)
* new:服務(wù)器端新建連接數(shù)
* ops:服務(wù)器端每秒請求數(shù)
* total:服務(wù)器端總請求的字節(jié)數(shù)
* time:測試時間(秒)
* err:出錯數(shù)量(連接數(shù))。穩(wěn)定性測試中,這個數(shù)據(jù)可以作為一個關(guān)鍵指標(biāo)。
### jtest命令詳解
jtest有非常多的參數(shù),這些參數(shù)的組合又會產(chǎn)生很多特殊的效果,我們將從完整的使用說明開始,詳細(xì)說明jtest測試的命令參數(shù):
localhost:tools zym$ ./jtest/jtest -h
JTest Version 1.94 - Dec 9 2013 17:11:24 (zym@zymMBPr.local)
Usage: /Users/zym/git/traffic.git/tools/jtest/.libs/jtest [--SWITCH [ARG]]
#### 參數(shù)格式:
參數(shù)格式是 短參數(shù)_長參數(shù)_類型_默認(rèn)值_參數(shù)說明,多數(shù)參數(shù)能做到自我說明比較詳細(xì),更多說明參見下面的說明以及后續(xù)高級用法示例。
switch__________________type__default___description
#### 測試機(jī)器IP與端口設(shè)置:
這幾個設(shè)置是最最常用的幾個參數(shù)
-p, --proxy_port int 8080 Proxy Port
-P, --proxy_host str localhost Proxy Host
-s, --server_port int 0 Server Port (0:auto select)
-S, --server_host str (null) Server Host (null:localhost)
* -p -P是用來指定要測試的ATS服務(wù)器地址、端口信息
* -s -S是用來指定要測試的ATS服務(wù)器,用來作為源的jtest監(jiān)聽域名(IP)和端口信息。
#### 服務(wù)器壓力控制:
服務(wù)器的壓力仿真,主要是主動生成的隨機(jī)流量控制
-r, --server_speed int 0 Server Bytes Per Second (0:unlimit)
-w, --server_delay int 0 Server Initial Delay (msec)
-c, --clients int 100 Clients
-R, --client_speed int 0 Client Bytes Per Second (0:unlimit)
-b, --sbuffersize int 4096 Server Buffer Size
-B, --cbuffersize int 2048 Client Buffer Size
-a, --average_over int 5 Seconds to Average Over
-z, --hitrate dbl 0.400 Hit Rate
-Z, --hotset int 1000 Hotset Size
-i, --interval int 1 Reporting Interval (seconds)
-k, --keepalive int 4 Keep-Alive Length
-K, --keepalive_cons int 4 # Keep-Alive Connections (0:unlimit)
-L, --docsize int -1 Document Size (-1:varied)
-j, --skeepalive int 4 Server Keep-Alive (0:unlimit)
* -r -w -R,控制客戶端、服務(wù)器端的速度,多數(shù)壓測的情況下,不會做特殊限制,在需要仿真大并發(fā)、大延遲等情況下,可以做控制。
* -b -B,模擬客戶端和服務(wù)器端的buffer大小設(shè)置,buffer的大小可以極大的影響IO的能力,也會影響內(nèi)存的占用。
* -z -Z,這是用來控制命中率和熱點數(shù)據(jù)。命中率是由熱點數(shù)據(jù)的命中,加miss的請求。熱點數(shù)據(jù)的多少,也會影響服務(wù)器的內(nèi)存使用。
* -k -K -j,控制客戶端和服務(wù)器的長連接。
* -i,用來控制jtest匯報間隔時間。
* -L,用來控制jtest生成的隨機(jī)url的大小,默認(rèn)-1表示完全隨機(jī),沒有控制。
#### 控制輸入輸出的配置:
-x, --show_urls on false Show URLs before they are accessed
-X, --show_headers on false Show Headers
-f, --ftp on false FTP Requests
- , --ftp_mdtm_err_rate dbl 0.000 FTP MDTM 550 Error Rate
- , --ftp_mdtm_rate int 0 FTP MDTM Update Rate (sec, 0:never)
* -x -X,用來debug,顯示url以及所有header頭,是個排查利器。
* ftp相關(guān)的是用來壓測ftp的,不過ATS對ftp的支持已經(jīng)刪除啦。
#### 測試的流程處理:
jtest測試,是可以進(jìn)行復(fù)雜的情況,比如對一個網(wǎng)站進(jìn)行深度抓取測試,對反向、正向、透明模式測試
-l, --fullpage on false Full Page (Images)
-F, --follow on false Follow Links
-J, --same_host on false Only follow URLs on same host
-t, --test_time int 0 run for N seconds (0:unlimited)
-u, --urls str (null) URLs from File
-U, --urlsdump str (null) URLs to File
-H, --hostrequest int 0 Host Request(1=yes,2=transparent)
-C, --check_content on false Check returned content
- , --nocheck_length on false Don't check returned length
-m, --obey_redirects off true Obey Redirects
-M, --embed URL off true Embed URL in synth docs
* -l -F -J,用來對html文件進(jìn)行解析,并提前其中的所有圖片元素等進(jìn)行深度抓取的控制。
* -t,控制測試運(yùn)行時間,默認(rèn)一直跑
* -u -U,給jtest指定url,紀(jì)錄jtest跑的url(如過存在解析html的方式,則紀(jì)錄的可能會多于指定的)
* -H,控制服務(wù)器測試模式,是否帶host頭,決定了服務(wù)器是跑在反向代理、正向代理、透明代理模式
* -C --nocheck_length,是否檢查返回的內(nèi)容、長度
* -m,是否跳轉(zhuǎn)
* -M,控制是否把url放到doc里
#### 請求的分散度與熱點:
hash是jtest、ats里無處不在的,如何讓hash互相影響,甚至測試hash碰撞等情況??
-q, --url_hash_entries int 1000000 URL Hash Table Size (-1:use file size)
-Q, --url_hash_filename str (null) URL Hash Table Filename
-q -Q,hash控制
#### 服務(wù)器的控制:
服務(wù)器的使用類型控制,可以讓jtest跑在不同的模式下
-y, --only_clients on false Only Clients
-Y, --only_server on false Only Server
-A, --bandwidth_test int 0 Bandwidth Test
-T, --drop_after_CL on false Drop after Content-Length
* -y -Y,可以將jtest單獨(dú)跑為服務(wù)器和客戶端分離的服務(wù)。
* -A,-T,可以做更快的流量壓測工具。
#### 其他控制信息機(jī)制:
-V, --version on false Version
-v, --verbose on false Verbose Flag
-E, --verbose_errors off true Verbose Errors Flag
* -v -E,可以用于debug錯誤等
#### 請求的隨機(jī)機(jī)制:
本類參數(shù),主要控制服務(wù)器和請求的隨機(jī)程度、復(fù)雜度,構(gòu)建一個復(fù)雜的測試用例,將會對服務(wù)器的穩(wěn)定性測試起到很好的效果。
-D, --drand int 0 Random Number Seed
-I, --ims_rate dbl 0.500 IMS Not-Changed Rate
-g, --client_abort_rate dbl 0.000 Client Abort Rate
-G, --server_abort_rate dbl 0.000 Server Abort Rate
-n, --extra_headers int 0 Number of Extra Headers
-N, --alternates int 0 Number of Alternates
-e, --client_rate int 0 Clients Per Sec
-o, --abort_retry_speed int 0 Abort/Retry Speed
- , --abort_retry_bytes int 0 Abort/Retry Threshhold (bytes)
- , --abort_retry_secs int 5 Abort/Retry Threshhold (secs)
-W, --reload_rate dbl 0.000 Reload Rate
* -D,用于生成url的隨機(jī)數(shù),如果有多個jtest并發(fā)運(yùn)行,可以對這個隨機(jī)的seed進(jìn)行區(qū)分以控制cache的多小等
* -I,請求的內(nèi)容中,帶的IMS比例
* -g -G,客戶端和服務(wù)器的Abort比例
* -n -N,控制客戶端發(fā)送的header數(shù)量,服務(wù)器的內(nèi)容的副本數(shù)量
* -e,每秒的客戶端數(shù)量
* -o --abort_retry_bytes --abort_retry_secs,控制重試的速度
* -W 控制內(nèi)容的重復(fù)度??
#### 服務(wù)的仿真程度:
-O, --compd_port int 0 Compd port
-1, --compd_suite on false Compd Suite
-2, --vary_user_agent int 0 Vary on User-Agent (use w/ alternates)
-3, --content_type int 0 Server Content-Type (1 html, 2 jpeg)
-4, --request_extension int 0 Request Extn (1".html" 2".jpeg" 3"/"
-5, --no_cache int 0 Send Server no-cache
-7, --zipf_bucket int 1 Bucket size (of 1M buckets) for Zipf
-8, --zipf dbl 0.000 Use a Zipf distribution with this alpha (say 1.2)
-9, --evo_rate dbl 0.000 Evolving Hotset Rate (evolutions/hour)
* -0 -1,compress服務(wù)
* -2,控制是否對不同的UA啟用多副本
* -3,服務(wù)器返回的內(nèi)容的類型
* -4,請求的內(nèi)容類型
* -5,是否發(fā)送給服務(wù)器no-cache控制
* -7 -8,zipf服務(wù)
* -9,熱點的偏移調(diào)整
#### 其他信息:
-d, --debug on false Debug Flag
-h, --help Help
=============================================================================
#### 上面參數(shù)中一些經(jīng)常用的參數(shù)
* -c, --clients int 100 Clients
跟ab的-c參數(shù)類似,默認(rèn)jtest會啟用100并發(fā)
* -k, --keepalive int 4 Keep-Alive Length
* -K, --keepalive_cons int 4 # Keep-Alive Connections (0:unlimit)
跟ab的-k參數(shù)功能類似,控制長連接的數(shù)量以及長連接的效率
* -z, --hitrate dbl 0.400 Hit Rate
命中率40%,在反向代理里太低了
* -u, --urls str (null) URLs from File
提供自己的urls,可以像http_load一樣使用jtest
* -y, --only_clients on false Only Clients
* -Y, --only_server on false Only Server
如果你需要獨(dú)立運(yùn)行jtest客戶端和服務(wù)器端,以提高性能和吞吐量等
## jtest進(jìn)階用法
本段將會介紹如何更好的使用jtest壓榨ATS性能,避免瓶頸問題
### 獨(dú)立測試機(jī)器
進(jìn)階用法里,我們先嘗試用用2個機(jī)器,一個跑jtest,一個跑ATS,做壓力測試:
1. 定義機(jī)器角色:
我們使用 'ts.cn' 作為壓測的URL的域名,192.168.0.1作為我們的ATS服務(wù)器,192.168.0.2作為我們的測試端,跑jtest。
2. 設(shè)置ATS的map規(guī)則:
在我們的例子里,我們應(yīng)該設(shè)置如下規(guī)則:
`map http://ts.cn:9080/ http://192.168.0.2:9080/`
3. 在192.168.0.2運(yùn)行jtest命令:
`jtest -S ts.cn -P 192.168.0.1`
在這個例子里,我們設(shè)置了服務(wù)器端的域名為`ts.cn`,同時給了`-P`參數(shù)指定了要測試的服務(wù)器是192.168.0.1,這樣我們的jtest將會使用192.168.0.1:8080作為代理服務(wù)器,使用ts.cn作為要壓測的域名來進(jìn)行壓力測試。
### 一個機(jī)器多個jtest
由于jtest是單進(jìn)程模式,進(jìn)程壓測一個當(dāng)前多大16個core以上的ATS系統(tǒng),肯定是壓不動的,如何才能更好的進(jìn)行壓測呢?接上面的例子,我們可以在測試端多跑幾個jtest進(jìn)程,我們暫跑6個:
1. 定義機(jī)器角色:
我們使用 'ts.cn' 作為壓測的URL的域名,192.168.0.1作為我們的ATS服務(wù)器,192.168.0.2作為我們的測試端,跑jtest。
2. 設(shè)置ATS的map規(guī)則:
在我們的例子里,我們應(yīng)該設(shè)置如下規(guī)則:
map http://ts.cn:9080/ http://192.168.0.2:9080/
map http://ts.cn:9081/ http://192.168.0.2:9081/
map http://ts.cn:9082/ http://192.168.0.2:9082/
map http://ts.cn:9083/ http://192.168.0.2:9083/
map http://ts.cn:9084/ http://192.168.0.2:9084/
map http://ts.cn:9085/ http://192.168.0.2:9085/
3. 在192.168.0.2運(yùn)行對應(yīng)的6個jtest命令:
jtest -S ts.cn -s 9080 -P 192.168.0.1 &
jtest -S ts.cn -s 9081 -P 192.168.0.1 &
jtest -S ts.cn -s 9082 -P 192.168.0.1 &
jtest -S ts.cn -s 9083 -P 192.168.0.1 &
jtest -S ts.cn -s 9084 -P 192.168.0.1 &
jtest -S ts.cn -s 9085 -P 192.168.0.1 &
這樣就可以啦,問題是一個窗口里會持續(xù)打印很多很多結(jié)果信息,不太容易分辨問題。如何更優(yōu)雅的跑多個機(jī)器多個jtest能?我們下面進(jìn)行詳細(xì)介紹
## jtest集群用法
在服務(wù)器集群中,一對一的壓測是很見的,通常我們?yōu)闇p少jtest性能瓶頸,會采用多個機(jī)器,多個jtest一起跑的情況,我們將需要引入其他控制機(jī)制、數(shù)據(jù)統(tǒng)計機(jī)制才好。
### screen的并行jtest管理
首先,我們必須有一個并發(fā)測試的機(jī)制,單機(jī)多進(jìn)程、多機(jī)并行,并且可以統(tǒng)計各個進(jìn)程返回的結(jié)果。當(dāng)初ATS有一個測試框架,可以執(zhí)行多個機(jī)器的并行測試,并能夠匯總多個jtest的返回結(jié)果。我們這里采用簡單的模式,screen腳本:
screen的`-c`參數(shù),可以很方便的啟動一個screen腳本,在這個腳本里,可以啟動多個screen窗口,我們采用這個機(jī)制來并發(fā)的啟動多個jtest命令,由于screen同時有后臺駐留的功能,可以確保我們在需要的時候回來看看各個jtest的測試結(jié)果,下面是一個screen的腳本:
screen jtest -P 192.168.0.1 -S ts.cn -s 192.168.0.2 -z 1.0 -D 9080 -k 2 -c 30 -Z 1000 -q 10000 -L 50000
screen jtest -P 192.168.0.1 -S ts.cn -s 192.168.0.2 -z 1.0 -D 9081 -k 2 -c 30 -Z 1000 -q 10000
screen top
detach
我們采用screen的`-X quit`命令,來停止jtest壓測。同時,為了表示各個目標(biāo)的機(jī)器,我們可以給各個screen打上標(biāo)識,以方便區(qū)分一個機(jī)器上的多個screen。
### N:N的測試機(jī)器
為了測試,我們假定有10臺測試機(jī)器192.168.0.{10..19},10臺服務(wù)器192.168.0.{100..109}(組成cluster或其他),這里是我用來生成測試的一些小腳本:
修改測試方法jtest參數(shù)
# c為服務(wù)器ip 10..19
# s為客戶端ip 10..19
# i為每個機(jī)器最多對一個服務(wù)器起10個進(jìn)程壓測 0..9
# 我們的端口為 $c$s$i
for c in {10..19}
do
for s in {20..29}
do
for i in {0..9}
do echo map http://ts.cn:$c$s$i/ http://192.168.0.$c c$s$i/
done
done
done
這會生成一個很長的map文件:
map http://ts.cn:10200/ http://192.168.0.10:10200/
map http://ts.cn:10201/ http://192.168.0.10:10201/
map http://ts.cn:10202/ http://192.168.0.10:10202/
.
.
.
map http://ts.cn:19297/ http://192.168.0.19:19297/
map http://ts.cn:19298/ http://192.168.0.19:19298/
map http://ts.cn:19299/ http://192.168.0.19:19299/
我們就可以用來做一些測試的screen腳本,我們在每個測試機(jī)器上,生成一些針對每個福爾起機(jī)器的腳本:
for c in {10..19};do for s in {20..29};do echo "
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}0 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000 -L 5000
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}1 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000 -L 10000
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}2 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000 -L 10000
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}3 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000 -L 20000
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}4 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000 -L 50000
screen jtest -P 192.168.0.${s} -S ts.cn -s ${c}${s}5 -z 1.0 -D ${c}${s} -k 2 -c 30 -Z 1000 -q 10000
screen top
detach
" | ssh root@192.168.0.$c tee jtest.screen.$s;done;done
然后,測試腳本的啟動將會非常簡單:
for c in {10..19}
do
for s in {20..29}
do
ssh -t 192.168.0.$c screen -R jtest$s -c jtest.screen.$s
done
done
停止測試的命令也是很簡單的:
for c in {10..19}
do
for s in {20..29}
do
ssh -t 192.168.0.$c screen -Rx jtest$s -X quit
done
done
### 測試的定義
通過上面的screen腳本的定義,我們可以隨時修改其中的重要設(shè)置,如-c -z等等,甚至增加一些客戶端仿真的隨機(jī)因素等等,具體情況不再贅述。
## 如何更好的仿真出線上的復(fù)雜情況
TBD
## 如何使用jtest來跑stress測試
TBD
## 如何分析jtest爆出的一些ATS問題
TBD
## jtest的待改進(jìn)問題以及后續(xù)計劃
* 支持https??
* 支持spdy??
* 單進(jìn)程太弱??
* 集群壓測上層調(diào)度工具???
* 循環(huán)(隨機(jī))壓測urls提供的列表,類似http_load一樣
原文發(fā)表于:https://blog.zymlinux.net/
|
|