typora-copy-images-to: assert typora-root-url: assert
概述
1.性能指標(biāo)
從外部看,性能測(cè)試主要關(guān)注如下三個(gè)指標(biāo)【量越大越好,時(shí)間越少越好】
吞吐量:每秒鐘系統(tǒng)能夠處理的請(qǐng)求數(shù)、任務(wù)數(shù)。
響應(yīng)時(shí)間:服務(wù)處理一個(gè)請(qǐng)求或一個(gè)任務(wù)的耗時(shí)。
錯(cuò)誤率:一批請(qǐng)求中結(jié)果出錯(cuò)的請(qǐng)求所占比例。
響應(yīng)時(shí)間RT(重要)
響應(yīng)時(shí)間(Response Time:RT)
響應(yīng)時(shí)間指用戶從客戶端發(fā)起一個(gè)請(qǐng)求開始,到客戶端接收到從服務(wù)器端返回的響
應(yīng)結(jié)束,整個(gè)過程所耗費(fèi)的時(shí)間。
錯(cuò)誤率(重要)
錯(cuò)誤率 一批請(qǐng)求中結(jié)果出錯(cuò)的請(qǐng)求所占比例。
HPS
HPS(Hits Per Second):
每秒點(diǎn)擊次數(shù),單位是次/秒。
TPS吞吐量(重要)
TPS(Transaction per Second):
系統(tǒng)每秒處理交易數(shù),單位是筆/秒。
QPS(重要)
**QPS(Query per Second):系統(tǒng)每秒處理查詢次數(shù),單位是次/秒。**
對(duì)于互聯(lián)網(wǎng)業(yè)務(wù)中,如果某些業(yè)務(wù)有且僅有一個(gè)請(qǐng)求連接,那么TPS=QPS=HPS,一
般情況下用 TPS來衡量整個(gè)業(yè)務(wù)流程,用QPS來衡量接口查詢次數(shù),用HPS來表
示對(duì)服務(wù)器單擊請(qǐng)求。
**無論TPS、QPS、HPS,此指標(biāo)是衡量系統(tǒng)處理能力非常重要的指標(biāo),越大越好,根據(jù)經(jīng)**
**驗(yàn),一般情況下:**
金融行業(yè):1000TPS~5000OTPS,不包括互聯(lián)網(wǎng)化的活動(dòng)
保險(xiǎn)行業(yè):100TPS~10000OTPS,不包括互聯(lián)網(wǎng)化的活動(dòng)
制造行業(yè):10TPS~5000TPS
互聯(lián)網(wǎng)電子商務(wù):1000OTPS~1000000TPS
互聯(lián)網(wǎng)中型網(wǎng)站:1000TPS~50000TPS
互聯(lián)網(wǎng)小型網(wǎng)站:50OTPS~10000TPS
最大響應(yīng)時(shí)間
最大響應(yīng)時(shí)間(MaxResponse Time):
指用戶發(fā)出請(qǐng)求或者指令到系統(tǒng)做出反應(yīng)(響應(yīng))
的最大時(shí)間。
最少響應(yīng)時(shí)間
最少響應(yīng)時(shí)間(Mininum ResponseTime):
指用戶發(fā)出請(qǐng)求或者指令到系統(tǒng)做出反應(yīng)(響應(yīng))的最少時(shí)間。
90%響應(yīng)時(shí)間
90%響應(yīng)時(shí)間(90%Response Time)**是指所有用戶的響應(yīng)時(shí)間進(jìn)行排序,第90%的響
應(yīng)時(shí)間。
2.壓測(cè)工具
Apache AB
加特林
JMeter
文檔網(wǎng)址:https://jmeter.apache.org/download_jmeter.cgi
zip安裝包:
https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.zip
JMeter
1.使用步驟
1.1.添加線程組
線程屬性值含義:
線程數(shù):200
Ramp-Up時(shí)間:1【1秒啟動(dòng)200個(gè)線程】
循環(huán)次數(shù):100【每個(gè)線程發(fā)送100個(gè)請(qǐng)求,一共200*100 = 20000個(gè)請(qǐng)求】
1.2.添加取樣器
取樣器:
表示測(cè)試何種請(qǐng)求,這里使用HTTP請(qǐng)求
1.右鍵線程組=》添加取樣器=》HTTP請(qǐng)求=》
2.指定url,端口,參數(shù),請(qǐng)求類型
1.3.添加監(jiān)聽器
察看結(jié)果樹
查看每次請(qǐng)求是否成功
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-GbninLlh-1683351987723)(/1635426441427.png)]
匯總報(bào)告
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-o6klOlB6-1683351987724)(/1635426386057.png)]
聚合報(bào)告
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Xa8EFWp9-1683351987725)(/1635426431409.png)]
2.JMeterAddress Already in use 錯(cuò)誤解決
windows幫助文檔:
https://support.microsoft.com/zh-cn/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t
windows本身提供的端口訪問機(jī)制的問題。
Windows提供給 TCP/IP鏈接的端口為1024-5000,并且要四分鐘來循環(huán)回收他們。就導(dǎo)致
我們?cè)诙虝r(shí)間內(nèi)跑大量的請(qǐng)求時(shí)將端口占滿了。
1.cmd中,用regedit命令打開注冊(cè)表
2.在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下
1.右擊parameters,添加2個(gè)新的 DWORD,名字為MaxUserPort、TCPTimedWaitDelay
2.然后雙擊MaxUserPort,輸入數(shù)值數(shù)據(jù)為65534,基數(shù)選擇十進(jìn)制(如果是分布式運(yùn)
行的話,控制機(jī)器和負(fù)載機(jī)器都需要這樣操作哦)
3.然后雙擊TCPTimedWaitDelay,輸入數(shù)值數(shù)據(jù)為30,基數(shù)選擇十進(jìn)制(如果是分布式運(yùn)
行的話,控制機(jī)器和負(fù)載機(jī)器都需要這樣操作哦)
4.修改配置完畢之后記得重啟機(jī)器才會(huì)生效
3.優(yōu)化
3.1.影響性能考慮點(diǎn)
1.影響性能考慮點(diǎn)包括:【這里可以從訪問順序來作為鏈路進(jìn)行性能調(diào)優(yōu)】
數(shù)據(jù)庫(kù)、應(yīng)用程序、中間件( tomact、gateway、Nginx、)、網(wǎng)絡(luò)(帶寬)和操作系統(tǒng)等方面
2.首先考慮自己的應(yīng)用屬于CPU密集型還是Io密集型,根據(jù)jvisualvm查看應(yīng)用健康情況
CPU:計(jì)算、排序、過濾、整合【集群】
IO:網(wǎng)絡(luò)、磁盤、數(shù)據(jù)庫(kù)、redis【內(nèi)存+緩存+固態(tài)+提高網(wǎng)卡的傳輸效率】
3.監(jiān)控執(zhí)行時(shí)中間件CPU、內(nèi)存使用量
docker stats:查看cpu占用、內(nèi)存使用量、
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-5z8AStkD-1683351987726)(/1635429437505.png)]
例如:minorGC每次都能干凈釋放eden,表示很健康
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-uhITCl4C-1683351987727)(/1635430395359.png)]
3.2.jvm內(nèi)存模型
1.主要優(yōu)化堆
避免發(fā)生fullGC
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-gjOC9iSV-1683351987727)(/1635428602937.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-PVmTCk6F-1683351987728)(/1635428629073.png)]
創(chuàng)建對(duì)象:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-DlvbxFiW-1683351987728)(/1635428752533.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-yVnwuOkX-1683351987729)(/1635429056878.png)]
jconsole和jvisualvm
jdk小工具,通過命令行啟動(dòng)可以監(jiān)控本地和遠(yuǎn)程應(yīng)用【遠(yuǎn)程應(yīng)用需要配置】
1.cmd輸入【推薦使用這個(gè)】
jvisualvm
2.安裝插件Visual GC(用于監(jiān)控垃圾回收)
如果不能安裝插件(點(diǎn)擊檢查最新版本異常):
1)進(jìn)入該鏈接:https://visualvm.github.io/pluginscenters.html
2)java -version 查看版本1.8.0_171
3)找到對(duì)應(yīng)版本復(fù)制鏈接:https://visualvm.github.io/uc/8u131/updates.xml.gz
4)點(diǎn)開設(shè)置,編輯插件中心,粘貼URL
5)安裝插件Visual GC
visual GC:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-KnGzgqEw-1683351987729)(/1635430067370.png)]
3.3.優(yōu)化步驟(重點(diǎn))
1.使用jmeter壓測(cè)nginx、網(wǎng)關(guān)、直接訪問服務(wù)、通過鏈路訪問服務(wù)
2.測(cè)nginx時(shí)使用docker stats查看CPU占用+內(nèi)存使用量,調(diào)整CPU性能
3.測(cè)網(wǎng)關(guān)時(shí),打開jvisualvm查看內(nèi)存、CPU使用量,調(diào)整CPU、內(nèi)存
增加jvm內(nèi)存:-Xmx512m
4.記錄下壓測(cè)指標(biāo)填在下表中
1)先優(yōu)化各中間件
2)使用更好的協(xié)議
3)買更好的網(wǎng)卡+網(wǎng)線+帶寬
5.壓測(cè)說明:
1)首頁(yè)渲染(全量數(shù)據(jù)獲?。? localhost:10000
選中高級(jí),從HTML文件獲取所有內(nèi)含的資源、并行下載數(shù)量
6.指標(biāo):
1)中間件越多,性能損失越大,損失在網(wǎng)絡(luò)交互
2)命中率不低于95%
3)鎖等待次數(shù)越低、時(shí)間越短越好
4)業(yè)務(wù):
DB(MYSQL優(yōu)化,加索引 parent_cid pms_category表)
在navicat中管理索引,右鍵添加
模板渲染速度(thymeleaf開啟緩存) spring.thymeleaf.cache= true
靜態(tài)資源(把靜態(tài)資源放到nginx里面)
日志級(jí)別改成error(打印日志會(huì)耗時(shí))
logging:
level:
com.atguigu.gulimall: error
5)堆內(nèi)存優(yōu)化 -Xmx1024m -Xms1024m -Xmn512m【測(cè)試gulimall全量資源時(shí),同時(shí)打開jvisualvm查看內(nèi)存GC情況】
NGINX動(dòng)靜分離:
靜態(tài)資源也會(huì)由客戶端發(fā)起請(qǐng)求,并且請(qǐng)求是gulimall.com/static/**,這個(gè)請(qǐng)求會(huì)重新經(jīng)過Nginx
1、所有項(xiàng)目的靜態(tài)資源都應(yīng)該放在Nginx里面
2、規(guī)則:/static/***所有請(qǐng)求都由Nginx直接返回
1)在nginx新建文件夾:/mydata/nginx/html/static,將product的static下的index文件夾拷過來
之前的靜態(tài)資源請(qǐng)求:gulimall.com/index/img/section_second_list_right_img.png
2)修改項(xiàng)目?jī)?nèi)部靜態(tài)資源的請(qǐng)求路徑:ctrl+R
src="index/ =》 src="/static/index/
href=" =》 href="/static/
<script src=" => <script src="/static/
<img src=" => <img src="/static/
url('/ =>
3、修改nginx配置,gulimall.conf,監(jiān)聽gulimall.com:80/static,返回root
location /static {
root /usr/share/nginx/html;
}
三級(jí)分類數(shù)據(jù)獲取【超級(jí)慢】
1)、優(yōu)化業(yè)務(wù)邏輯:
1、一次性查詢出來
小技巧:
將以下語(yǔ)句快速抽取為一個(gè)方法,選中右鍵:refacto=》extract=》Method
baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", level1.getCatId()));
全量數(shù)據(jù)獲取:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-JYGdcR9M-1683351987730)(/1635433495777.png)]
nginx動(dòng)靜分離
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ctFBLDxR-1683351987731)(/1635434764388.png)]
1.未動(dòng)靜分離,指的是靜態(tài)資源全都存儲(chǔ)在Tomcat中,所有靜態(tài)資源都要從Tomcat獲取,
會(huì)訪問 nginx->gateway->Tomcat獲取靜態(tài)資源,從而導(dǎo)致占用Tomcat很多線程來處理靜態(tài)資源
2.動(dòng)靜分離,表示將資源與web服務(wù)器分離,可存放在nginx中,靜態(tài)資源直接從nginx中返回
/static/**所有請(qǐng)求都由nginx直接返回
步驟:
1)cd /mydata/nginx/html
mkdir static
2)將product項(xiàng)目?jī)?nèi)static文件夾下的index文件夾,拖到/mydata/nginx/html/static此目錄下
3)修改index.html中靜態(tài)資源的請(qǐng)求路徑
src="index/ =》 src="/static/index/
href=" =》 href="/static/
<script src=" => <script src="/static/
<img src=" => <img src="/static/
url('/ =>
動(dòng)靜分離前下例請(qǐng)求會(huì)訪問nginx=》gateway=》product=》static...
http://gulimall.com/index/img/img_09.png
分離后使用下例請(qǐng)求直接訪問nginx中的靜態(tài)資源
http://gulimall.com/static/index/img/img_09.png
4)修改gulimall.conf配置(監(jiān)聽gulimall.com/static請(qǐng)求,使用root作為根路徑查找靜態(tài)資源):
location /static/ {
root /usr/share/nginx/html;
}
解析:/static/index/img/img_09.png會(huì)找到掛載目錄/usr/share/nginx/html
/usr/share/nginx/html/static/index/img/img_09.png
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-aBnqpMhR-1683351987731)(/1635435409426.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ljmbl6JZ-1683351987732)(/1635437211407.png)]
模擬線上崩潰
拿200個(gè)線程循環(huán)壓測(cè)+靜態(tài)資源獲取+并行下載
測(cè)試首頁(yè) gulimall.com 80
崩潰:
1.堆內(nèi)存溢出,線程池報(bào)錯(cuò)
2.gulimall-product下線無法請(qǐng)求503
加大內(nèi)存,開啟以上所有的優(yōu)化步驟
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-jn0WPwbo-1683351987733)(/1635438011851.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-fwIfVDr2-1683351987733)(/1635437878798.png)]
內(nèi)存即將溢出:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-rk0YMFyX-1683351987734)(/1635438088176.png)]
堆溢出,線程池報(bào)錯(cuò):
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Oc9XCjwV-1683351987734)(/1635438101304.png)]
實(shí)例下線:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-iNwJ7WoN-1683351987735)(/1635438178657.png)]
優(yōu)化三級(jí)分類
/**
* 查詢?nèi)?jí)分類并封裝成Map返回
*/
@Override
public Map<String, List<Catalog2VO>> getCatalogJson() {
// 1.查詢所有分類,按照parentCid分組
Map<Long, List<CategoryEntity>> categoryMap = baseMapper.selectList(null).stream()
.collect(Collectors.groupingBy(key -> key.getParentCid()));
// 2.獲取1級(jí)分類
List<CategoryEntity> level1Categorys = categoryMap.get(0L);
// 3.封裝數(shù)據(jù)
Map<String, List<Catalog2VO>> map = level1Categorys.stream().collect(Collectors.toMap(key -> key.getCatId().toString(), l1Category -> {
// 3.查詢2級(jí)分類,并封裝成List<Catalog2VO>
List<Catalog2VO> catalog2VOS = categoryMap.get(l1Category.getCatId())
.stream().map(l2Category -> {
// 4.查詢3級(jí)分類,并封裝成List<Catalog3VO>
List<Catalog2VO.Catalog3Vo> catalog3Vos = categoryMap.get(l2Category.getCatId())
.stream().map(l3Category -> {
// 封裝3級(jí)分類VO
Catalog2VO.Catalog3Vo catalog3Vo = new Catalog2VO.Catalog3Vo(l2Category.getCatId().toString(), l3Category.getCatId().toString(), l3Category.getName());
return catalog3Vo;
}).collect(Collectors.toList());
// 封裝2級(jí)分類VO返回
Catalog2VO catalog2VO = new Catalog2VO(l1Category.getCatId().toString(), catalog3Vos, l2Category.getCatId().toString(), l2Category.getName());
return catalog2VO;
}).collect(Collectors.toList());
return catalog2VOS;
}));
return map;
}
3.x.壓測(cè)指標(biāo)
吞吐量括號(hào)內(nèi)表示瓶頸,(db)表示瓶頸在db文章來源:http://www.zghlxwxcb.cn/news/detail-435140.html
壓測(cè)內(nèi)容 | 壓測(cè)線程數(shù) | 吞吐量/s | 90%響應(yīng)時(shí)間 | 99%響應(yīng)時(shí)間 |
---|---|---|---|---|
Nginx | 50 | 8788 | 2 | 200 |
Gateway localhost:88 | 50 | 32719 | 3 | 5 |
簡(jiǎn)單服務(wù) localhost:10000/hello | 50 | 5624 | 20 | 73 |
首頁(yè)渲染 localhost:10000/index.html | 50 | 850(db,thymeleaf) | 442 | 729 |
首頁(yè)渲染(開緩存) | 50 | 214 | 380 | 710 |
首頁(yè)渲染(thymeleaf開緩存+優(yōu)化數(shù)據(jù)庫(kù)+日志級(jí)別:error) | 50 | 480 | 159 | 253 |
三級(jí)分類數(shù)據(jù)獲取 localhost:10000/index/catalog.json | 50 | 2(db) | 26311 | 27335 |
三級(jí)分類數(shù)據(jù)獲?。铀饕?/td> | 50 | 5 | 9597 | 10176 |
三級(jí)分類數(shù)據(jù)獲?。▋?yōu)化業(yè)務(wù)邏輯(一次性查詢)+加索引+堆內(nèi)存) | 50 | 65 | 1150 | 1849 |
三級(jí)分類數(shù)據(jù)獲?。▋?yōu)化業(yè)務(wù)邏輯(一次性查詢)+加索引+堆內(nèi)存+redis緩存) | 50 | 390 | 155 | 296 |
三級(jí)分類數(shù)據(jù)獲取(優(yōu)化業(yè)務(wù)邏輯(一次性查詢)+加索引+堆內(nèi)存+redis緩存+分布式鎖) | 50 | 313 | 212 | 355 |
首頁(yè)渲染(全量數(shù)據(jù)獲?。?localhost:10000/index.html【廢棄】 | 50 | 13(靜態(tài)資源) | 4916 | 6954 |
首頁(yè)渲染(全量數(shù)據(jù)獲取+動(dòng)靜分離)gulimall.com | 50 | 8.2 | 8514 | 13435 |
首頁(yè)渲染(全量數(shù)據(jù)獲取+動(dòng)靜分離+堆優(yōu)化)gulimall.com | 50 | 8 | 8311 | 13411 |
Nginx+Gateway | 50 | |||
Gateway+簡(jiǎn)單服務(wù) localhost:88/hello | 50 | 1180 | 80 | 142 |
全鏈路(nginx+gateway+簡(jiǎn)單服務(wù)) gulimall.com/hello | 50 | 532 | 126 | 226 |
| 8 | 8311 | 13411 |
| Nginx+Gateway | 50 | | | |
| Gateway+簡(jiǎn)單服務(wù) localhost:88/hello | 50 | 1180 | 80 | 142 |
| 全鏈路(nginx+gateway+簡(jiǎn)單服務(wù)) gulimall.com/hello | 50 | 532 | 126 | 226 |文章來源地址http://www.zghlxwxcb.cn/news/detail-435140.html
到了這里,關(guān)于2.壓力測(cè)試+優(yōu)化(Jmeter)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!