轉(zhuǎn)轉(zhuǎn)基礎(chǔ)服務(wù)性能壓測(cè)實(shí)戰(zhàn)
作者|楊立志
壓測(cè)背景
為了業(yè)務(wù)穩(wěn)定性、系統(tǒng)穩(wěn)定性、業(yè)務(wù)大促目標(biāo)提供基礎(chǔ)保障。
1、壓測(cè)服務(wù)
(1)確定壓測(cè)服務(wù):
通過(guò)服務(wù)管理平臺(tái)監(jiān)控?cái)?shù)據(jù)獲得,核心服務(wù)核心接口流量較高的top10接口。
(2)確定壓測(cè)接口
服務(wù)管理平臺(tái)中監(jiān)控獲得歷史大促時(shí)的QPS高峰數(shù)據(jù),響應(yīng)時(shí)間ms級(jí)別。
緩存命中率RD給出大部分都是90%以上甚至99%。
由于增加了新業(yè)務(wù),以及服務(wù)有一些優(yōu)化。大促預(yù)估單接口QPS在歷史壓測(cè)基礎(chǔ)上增加30%量。
說(shuō)明:QPS目標(biāo)值必須大于等于歷史壓測(cè)結(jié)果。可以根據(jù)歷史大促增長(zhǎng)量以及新業(yè)務(wù)的拓展進(jìn)行評(píng)估。
舉例:假如接口getProductBussinessById ,目標(biāo)QPS15600,緩存命中率92%

2、壓測(cè)工具
jmeter 壓測(cè)平臺(tái):是基于jmeter工具二次開發(fā)的壓測(cè)平臺(tái)。目前僅支持http協(xié)議。RPC接口可以通過(guò)腳本調(diào)用方式實(shí)現(xiàn)。
3、壓測(cè)時(shí)間
為防止影響線上用戶,壓測(cè)定于凌晨之后進(jìn)行。
4、壓測(cè)場(chǎng)景
(1)壓測(cè)時(shí)長(zhǎng) 每次并發(fā) 5分鐘。
(2)數(shù)據(jù)參數(shù)化,根據(jù)緩存命中率 部分?jǐn)?shù)據(jù)走緩存,部分?jǐn)?shù)據(jù)直接走數(shù)據(jù)庫(kù)
(3)單接口壓測(cè)。摸底接口是否達(dá)到目標(biāo)并發(fā)量,混合場(chǎng)景不在本次壓測(cè)范圍。
壓測(cè)腳本設(shè)計(jì)
由于是scf協(xié)議,不能用jmeter壓測(cè)http方式進(jìn)行壓測(cè)。所以本次采用腳本方式調(diào)用接口,然后通過(guò)jmeter加載腳本來(lái)進(jìn)行測(cè)試。
參數(shù)化數(shù)據(jù)分兩個(gè)文件,一個(gè)是緩存中已經(jīng)存在的數(shù)據(jù),一個(gè)是緩存中不存在的數(shù)據(jù)。
另外說(shuō)明一下:讀取文件不易過(guò)大,會(huì)降低性能。
緩存文件:原來(lái)4MB分割為 2000個(gè)小文件。下圖為部分截圖
非緩存文件同理。

1、壓測(cè)腳本實(shí)例
getProductBussinessById 接口腳本實(shí)例,其他接口同理。setupTest方法中是初始化數(shù)據(jù),半部分代碼截圖

下面是jmeter執(zhí)行的并發(fā)方法。通過(guò)隨機(jī)數(shù)百分比占比來(lái)確定是否使用緩存數(shù)據(jù),還是非緩存數(shù)據(jù)。
由于命中率92%,所以隨機(jī)數(shù)小于92的走緩存,大于92的數(shù)據(jù)走非緩存。
下圖沒(méi)有加斷言,壓測(cè)結(jié)束后會(huì)通過(guò)命令行分析返回結(jié)果日志。

2、jmeter配置
說(shuō)明:jmeter上傳下面各種配置比較復(fù)雜。壓測(cè)平臺(tái)后續(xù)版本會(huì)優(yōu)化此處,方便快捷操作。
(1)上傳lib0
lib0是你本機(jī)eclipse或者ideal 生成的腳本依賴的jar包以及用例jar包
ideal為例子:腳本寫好后, 第一、點(diǎn)擊clean ,第二點(diǎn)擊package

服務(wù)器進(jìn)入 lib下,命令: cd /opt/soft/apache-jmeter/lib
#上傳lib0 命令:rz -bey
解壓道lib文件夾下 此時(shí)生成了lib0文件夾 命令:unzip lib0.zip

(2)上傳本地用例jar包
進(jìn)入 /opt/soft/apache-jmeter/lib/ext 命令:cd /opt/soft/apache-jmeter/lib/ext
上傳用例jar包 命令:rz -bey
選擇工程生成的jarD:\mycode\zhuanzhuan_performance_zzsearch\target\jar\zhuanzhuan_performance_zzsearch-0.0.1-SNAPSHOT.jar

(3)上傳scf.conf 以及參數(shù)化文件
上傳配置scf.conf文件以及 參數(shù)化文件(若有參數(shù)化文件,路徑自己定義的路徑。一般我都放在/opt/soft/apache-jmeter/data)
cd /opt/soft/apache-jmeter
mkdir data
cd data
rz -bey #上傳scf.conf 以及參數(shù)化數(shù)據(jù)文件 (代碼寫死的配置在哪路徑 就放在哪里路徑 我這只是個(gè)例子)

注意:
scf.conf存放路徑跟代碼中要一致
比如代碼中scf.conf配置路徑是 /opt/soft/apache-jmeter/data/scf.config 那么 就上傳到服務(wù)器該配置的目錄下

參數(shù)化所需要數(shù)據(jù) 同理
(4)修改jmeter結(jié)果日志文件路徑
cd /opt/soft/apache-jmeter/bin
vi jmeter-server
${DIRNAME}/jmeter ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s -j /opt/soft/apache-jmeter/jmeter-server.log "$@"
3、執(zhí)行壓測(cè)
執(zhí)行壓測(cè)不多說(shuō),每次并發(fā)5分鐘。
需要注意的點(diǎn)是確定壓測(cè)基線,不能一上來(lái)就幾十、幾百個(gè)并發(fā)。
并發(fā)過(guò)程中,關(guān)注監(jiān)控 以及系統(tǒng)資源的利用。
若并發(fā)量大的情況,根據(jù)個(gè)人經(jīng)驗(yàn),并發(fā)過(guò)程中建議手動(dòng)打開頁(yè)面查看真實(shí)響應(yīng)的用戶體驗(yàn)。
壓測(cè)結(jié)果
監(jiān)控結(jié)果: 壓測(cè)結(jié)果符合要求。


日志分析:壓測(cè)日志數(shù)據(jù)由于服務(wù)器已經(jīng)歸還,下面是訂單列表jmeter壓測(cè)最終日志分析,可以通過(guò)命令行統(tǒng)計(jì),實(shí)例如下:

其中一臺(tái)jmeter日志分析:結(jié)果中沒(méi)有返回?cái)?shù)據(jù)為288926 ,總數(shù)440365 沒(méi)有返回?cái)?shù)據(jù)的結(jié)果約占 65% 。
總結(jié)
1、確定目標(biāo)QPS
QPS每秒查詢率(Query Per Second)
QPS:每秒請(qǐng)求數(shù),就是說(shuō)服務(wù)器在一秒的時(shí)間內(nèi)處理了多少個(gè)請(qǐng)求。
TPS(Transactions Per Second):每秒事務(wù)數(shù),每秒系統(tǒng)能夠處理的事務(wù)次數(shù)
TPS可能包含多個(gè)QPS
2、壓測(cè)前需要和RD確認(rèn), 所調(diào)服務(wù)流量限制,以及白名單等
3、壓測(cè)代理機(jī)器,沙箱機(jī)器盡量多申請(qǐng)幾臺(tái),并發(fā)測(cè)試一臺(tái)壓測(cè)機(jī)器可能并發(fā)不上去。
4、本次壓測(cè)只是單接口摸底測(cè)試。并沒(méi)有混合接口測(cè)試。若業(yè)務(wù)需要可以進(jìn)行混合接口壓測(cè),比較真實(shí)。
5、由于被壓測(cè)接口為內(nèi)部調(diào)用的接口,外部訪問(wèn)不到。所以壓測(cè)的時(shí)候需要在沙箱機(jī)器上進(jìn)行。
6、梳理壓測(cè)數(shù)據(jù),壓測(cè)方案,確定壓測(cè)場(chǎng)景。
