日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地

發(fā)布時間:2023/11/27 windows 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
項目背景

隨著業(yè)務(wù)拓展,對于接口性能的要求也在上升,各部門也開始針對部分慢接口進行優(yōu)化,從測試角度針對這些優(yōu)化需求進行測試時不僅要保證對應(yīng)接口的功能正常使用同時也要驗證接口優(yōu)化成果。在日常的開發(fā)工作中一些后臺服務(wù)配置的改動也會對接口的性能產(chǎn)生影響,我們急需要一套性能壓測巡檢平臺,對平時接口服務(wù)的技改,后端配置的優(yōu)化進行持續(xù)的性能驗證。

項目日常痛點

1.測試與開發(fā)都無法確定這次改動優(yōu)化程度如何,與之前比較究竟提升多少性能。只能驗證相關(guān)功能正常。

2.測試不清楚開發(fā)優(yōu)化接口用了那些方法需要觀察那些指標(biāo)。

3.優(yōu)化接口的改動與新增接口是否存在性能bug無法確定。

為了清楚的展示每次優(yōu)化的成果,對新上線的接口檢查是否存在性能bug。基于目前的zat自動化平臺開發(fā)了性能壓測功能。

ZAT性能壓測巡檢實現(xiàn)方法

1.ZAT性能巡檢平臺實現(xiàn)機制介紹

①平臺后臺使用jmeter執(zhí)行自動化case本身就支持對于后端接口的性能壓測,通過對平臺的改造可以快速實現(xiàn)在平臺上對于接口性能壓測的功能。而不需要重新開發(fā)一套工具。

②性能壓測使用的case可以直接復(fù)制自動化case,修改幾個變量的配置可以直接用于性能壓測。節(jié)省編寫壓測用例的時間,同時使用自動化用例還可以模擬用戶使用場景。

③壓測結(jié)果通過平臺讀取直接存入數(shù)據(jù)庫,可以對多次性能壓測數(shù)據(jù)比對,接口優(yōu)化時也可以通過歷史數(shù)據(jù)來比對是否有優(yōu)化。

2.后期還需要解決的問題

Jmeter運行壓測時占用系統(tǒng)資源多,同時目前針對uat環(huán)境進行壓測大部分服務(wù)只有1臺機器,為了放置多部門壓測時對公共服務(wù)的調(diào)用影響到接口性能的數(shù)據(jù)。所以現(xiàn)在設(shè)置成同一時間只允許運行1個壓測job。其他端可以看到當(dāng)前那個組在壓測狀態(tài)和進度。

之后會采取2種修改改進這個問題:

①采取分布式壓測,各組可以自己提供壓測機器通過slave的方式分擔(dān)壓測壓力。②等服務(wù)端接入docker后,通過各種策略將請求發(fā)送到對應(yīng)容器。避免多個部門壓測同時調(diào)用同一個公共服務(wù)導(dǎo)致影響到性能數(shù)據(jù)ZAT性能壓測巡檢平臺實現(xiàn)架構(gòu)圖

ZAT性能壓測巡檢平臺流程圖

目前zat自動化平臺后端使用jmeter來執(zhí)行case。基于原有功能在之前的基礎(chǔ)上加入jmeter自身線程組與壓測所需的csv數(shù)據(jù)文件的設(shè)置進行改造,實現(xiàn)了壓測用例的生成,執(zhí)行。通過對jtl文件中各性能數(shù)據(jù)的計算獲取接口相應(yīng)時間,吞吐量,95線,99線等數(shù)據(jù),同時調(diào)用grafana接口獲取壓測時對應(yīng)服務(wù)器的內(nèi)存,cpu和負載數(shù)據(jù)。匯總收集到的數(shù)據(jù)存入數(shù)據(jù)庫。用來跟歷史數(shù)據(jù)或者之后的數(shù)據(jù)進行比對。

ZAT性能壓測巡檢平臺的實現(xiàn)ZAT性能壓測巡檢平臺執(zhí)行壓測的流程如下

API信息設(shè)置

壓測中需要關(guān)注對應(yīng)的服務(wù)器的內(nèi)存 CPU所以要在對應(yīng)壓測case所使用的API信息中增加對應(yīng)的APPID與需要壓測的IP地址

壓測Case的生成落地

1.線程組設(shè)置

為了測試接口性能,需要模擬大量用戶發(fā)送請求的場景所以在自動化case的基礎(chǔ)上增加了對線程組數(shù)據(jù)的設(shè)置,通過這個設(shè)置可以模擬大量用戶訪問。

a.普通線程組(普通壓測設(shè)置)線程數(shù)代表起多少個線程發(fā)送請求;Ramp-up代表多少時間內(nèi)發(fā)送完成;循環(huán)次數(shù)代表每個進程循環(huán)發(fā)送多少次;對應(yīng)jmx模板實現(xiàn)代碼如下:
 1{%?if?test_group.type?==??'normal'?%}
2????<ThreadGroup?guiclass="ThreadGroupGui"?testclass="ThreadGroup"?testname="{{?test_group.group_name?}}" 3?????????????????enabled="true">
4????????<stringProp?name="ThreadGroup.on_sample_error">continuestringProp>
5????????<elementProp?name="ThreadGroup.main_controller"?elementType="LoopController"?guiclass="LoopControlPanel" 6?????????????????????testclass="LoopController"?testname="Loop?Controller"?enabled="true">
7????????????<boolProp?name="LoopController.continue_forever">falseboolProp>
8????????????<stringProp?name="LoopController.loops">{{?test_group.loopTime?}}stringProp>
9????????elementProp>
10????????<stringProp?name="ThreadGroup.num_threads">{{?test_group.thread?}}stringProp>
11????????<stringProp?name="ThreadGroup.ramp_time">{{?test_group.LastTime?}}stringProp>
12????????<boolProp?name="ThreadGroup.scheduler">falseboolProp>
13????????<stringProp?name="ThreadGroup.duration">stringProp>
14????????<stringProp?name="ThreadGroup.delay">stringProp>
15????ThreadGroup>
16{%?endif?%}
b.梯度線程組(模擬梯度加壓)線程數(shù)代表總共起多少線程;持續(xù)時間代表啟動的線程總數(shù)達到最大值之后,再持續(xù)運行60秒;初始進程代表設(shè)置最開始時啟動多少個線程;上升梯度與時間代表每隔多少時間啟動多少進程,下降梯度與時間同理對應(yīng)jmx模板實現(xiàn)如下:
 1{%?if?test_group.type?==??'step'?%}
2????<kg.apc.jmeter.threads.SteppingThreadGroup?guiclass="kg.apc.jmeter.threads.SteppingThreadGroupGui" 3???????????????????????????????????????????????testclass="kg.apc.jmeter.threads.SteppingThreadGroup" 4???????????????????????????????????????????????testname="{{?test_group.group_name?}}"?enabled="true">
5????????<stringProp?name="ThreadGroup.on_sample_error">continuestringProp>
6????????<stringProp?name="ThreadGroup.num_threads">{{?test_group.thread?}}stringProp>
7????????<stringProp?name="Threads?initial?delay">0stringProp>
8????????<stringProp?name="Start?users?count">{{?test_group.start_thread?}}stringProp>
9????????<stringProp?name="Start?users?count?burst">{{?test_group.increase_thread?}}stringProp>
10????????<stringProp?name="Start?users?period">{{?test_group.period_time?}}stringProp>
11????????<stringProp?name="Stop?users?count">{{?test_group.decrease_thread?}}stringProp>
12????????<stringProp?name="Stop?users?period">{{?test_group.decrease_period_time?}}stringProp>
13????????<stringProp?name="flighttime">{{?test_group.last_time?}}stringProp>
14????????<stringProp?name="rampUp">stringProp>
15????????<elementProp?name="ThreadGroup.main_controller"?elementType="LoopController"?guiclass="LoopControlPanel"16?????????????????????testclass="LoopController"?testname="Loop?Controller"?enabled="true">
17????????????<boolProp?name="LoopController.continue_forever">falseboolProp>
18????????????<intProp?name="LoopController.loops">-1intProp>
19????????elementProp>
20????kg.apc.jmeter.threads.SteppingThreadGroup>
21{%?endif?%}

2.Csv文件設(shè)置(非必填)

考慮到許多接口的數(shù)據(jù)會存入redis,有時候使用固定的數(shù)據(jù)對接口進行壓測時接口直接從redis讀取數(shù)據(jù)無法模型正常用戶流程,所以通過綁定csv文件去切換變量(賬號,id等)模擬不同用戶發(fā)送請求

Csv數(shù)據(jù)設(shè)置

CSV文件會上傳到服務(wù)器抱錯 并且生成壓測用例時會綁定到對應(yīng)計劃中變量名對應(yīng)jmeter從csv文件中取值時對應(yīng)列的數(shù)據(jù)對應(yīng)的參數(shù)名稱用逗號分割

Csv存儲代碼實現(xiàn)

 1try:
2????CsvFile?=?request.FILES.get("CsvFile")
3????Paraments?=?request.POST.get("paraments")
4????FilePath?=?rootPath?+?"/StressCsvStore/{}-{}-{}.csv".format(project.name,?alias,?case_id)
5????default_storage.save(FilePath,?ContentFile(CsvFile.read()))
6????CsvDb?=?StressCsvPath()
7????CsvDb.CsvPath?=?FilePath
8????CsvDb.Parement?=?Paraments
9????CsvDb.save()
10????CsvID?=?CsvDb.id
11except?Exception?as?e:
12????CsvID?=?0
Csv插件模板實現(xiàn)
 1{%?if?test_group.CsvPath?!=??''?%}
2????<CSVDataSet?guiclass="TestBeanGUI"?testclass="CSVDataSet"?testname="CSV?Data?Set?Config"?enabled="true">
3??????<stringProp?name="delimiter">,stringProp>
4??????<stringProp?name="fileEncoding">stringProp>
5??????<stringProp?name="filename">{{test_group.CsvPath}}stringProp>
6??????<boolProp?name="ignoreFirstLine">falseboolProp>
7??????<boolProp?name="quotedData">falseboolProp>
8??????<boolProp?name="recycle">trueboolProp>
9??????<stringProp?name="shareMode">shareMode.allstringProp>
10??????<boolProp?name="stopThread">falseboolProp>
11??????<stringProp?name="variableNames">{{test_group.CsvParaments}}stringProp>
12????CSVDataSet>
13????<hashTree/>
14{%?endif?%}

3.Case選擇用例列表自動篩選壓測用例目錄下的用例選擇對應(yīng)用例創(chuàng)建壓測計劃

壓測執(zhí)行

1.壓測執(zhí)行代碼實現(xiàn)

1try:
2????RunningProcess?=?subprocess.Popen(r'{}?-n?-t?"{}"?-j?"{}"'.format(jmeter_abspath,?tmp_jmx_abspath,?tmp_log_abspath))
3????RunningId?=?str(data["project_id"])?+?"-"?+?str(RunningProcess.pid)
4????RunningProcess.wait()
5????server_running.remove(ShowContent)
6except?Exception?as?Error:
7????server_running.remove(ShowContent)
8????os.remove(tmp_jmx_abspath)
9????return?JsonResponse(code="999998",?msg="發(fā)生{}錯誤".format(Error))????

2.壓測執(zhí)行前端展示

壓測實時監(jiān)控

壓測完成后從對應(yīng)服務(wù)器的grafana接口獲取服務(wù)器信息實現(xiàn)實時監(jiān)控

 1if?hostip:
2????mem_query?=?'query=(1?-?(node_memory_MemAvailable_bytes{instance=~"'?+?hostip?+?':9100"}?/?(node_memory_MemTotal_bytes{instance=~"'?+?hostip?+?':9100"})))?*?100'
3????max_mem,?average_mem?=?getInfoFromGranafa(startTime,?endTime,?mem_query)
4????cpu_query?=?'query=avg(irate(node_cpu_seconds_total{instance=~"'?+?hostip?+?':9100",mode="user"}[2m]))*100'
5????max_cpu,?average_cpu?=?getInfoFromGranafa(startTime,?endTime,?cpu_query)
6????load_query?=?'query=node_load1{instance=~"'?+?hostip?+?':9100"}'
7????max_load,?average_load?=?getInfoFromGranafa(startTime,?endTime,?load_query)
8????tr.mem_max?=?max_mem
9????tr.men_average?=?average_mem
10????tr.cpu_max?=?max_cpu
11????tr.cpu_average?=?average_cpu
12????tr.load_max?=?max_load
13????tr.load_average?=?average_load
14tr.save()????

壓測時實時數(shù)據(jù)展示

壓測時服務(wù)器性能數(shù)據(jù)實時展示

壓測報告比對結(jié)果的實現(xiàn)

壓測報告比對代碼

 1fillColor:?function(obj)?{
2if?(obj.columnIndex===2){
3????if?(obj.row.cpu_max.indexOf('/')?>=?0)?{
4????????return;
5????}
6????let?strs?=?obj.row.cpu_max.split("?");
7????if?(strs.length?3)?{
8????????return;
9????}
10????let?ratio?=?Math.abs((parseFloat(strs[0])?-?parseFloat(strs[2]))/parseFloat(strs[0]));
11????if?(ratio?0.2)?{
12????????????return;
13????}
14????if?(obj.row.cpu_max.indexOf('↑')!==-1){
15????????return?{color:'red'};
16????}?else?{
17????????return?{color:'blue'};
18????}
19}???

后端比對數(shù)據(jù)實現(xiàn)

 1if?int(left_data.get('FiftyLine'))?int(right_data.get('FiftyLine')):
2????merge_data['FiftyLine']?=?left_data.get('FiftyLine')?+?'??'?+?right_data.get('FiftyLine')?+?'?↑'
3else:
4????merge_data['FiftyLine']?=?left_data.get('FiftyLine')?+?'??'?+?right_data.get('FiftyLine')
5
6if?int(left_data.get('NintyLine'))?int(right_data.get('NintyLine')):
7????merge_data['NintyLine']?=?left_data.get('NintyLine')?+?'??'?+?right_data.get('NintyLine')?+?'?↑'
8else:
9????merge_data['NintyLine']?=?left_data.get('NintyLine')?+?'??'?+?right_data.get('NintyLine')
10
11if?int(left_data.get('NintyNineLine'))?int(right_data.get('NintyNineLine')):
12????merge_data['NintyNineLine']?=?left_data.get('NintyNineLine')?+?'??'?+?right_data.get(
13????????'NintyNineLine')?+?'?↑'
14else:
15????merge_data['NintyNineLine']?=?left_data.get('NintyNineLine')?+?'??'?+?right_data.get(
16????????'NintyNineLine')

前端判斷數(shù)據(jù)是否超過20%閾值修改顏色展示

通過結(jié)果的比對,我們可以非常清晰看到本輪技改或者優(yōu)化配置,性能提升多少還是下降,也能方便的查看到各種資源池的比對。

另外,以每次壓測的結(jié)果作為下一次比對性能基線,從而推動性能優(yōu)化工作持續(xù)進行。

本文作者

韓盛,7年測試經(jīng)驗,擅長性能測試,自動化測試。熟悉java, python。現(xiàn)任職掌門1對1測試開發(fā)工程師。

劉萬紅,多年互聯(lián)網(wǎng)大廠測試經(jīng)歷,現(xiàn)任職掌門1對1研發(fā)部測試經(jīng)理 擅長接口/性能/自動化等各種測試平臺開發(fā)。

總結(jié)

以上是生活随笔為你收集整理的压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地