壓力測試及效能優化一
影響效能的因素
影響效能的因素包括:資料庫、應用程式(編碼能否優化)、中介軟體(tomcat、nginx等(本人專案是訪問nginx->SpringCloudGateway->tomcat))、網路頻寬、作業系統等
首先考慮自己的應用是CPU密集型(大量計算)還是IO密集型(記憶體佔用高、磁碟讀寫多、網路流量大)
優化的方式
我們主要是要優化執行時資料區(方法區、堆、虛擬機器棧、本地方法棧、程式計數器),再詳細一點即最主要優化 堆(新生代、老年代)
儘量避免fullGC,因為fullGC會比YGC慢很多
記憶體觀察
為了方便對壓力測試期間,觀察jvm記憶體的變化我們使用如下操作來更方便觀察jvm
開啟cmd命令 使用 jvisualvm命令對執行的程式進行分析
點選選單欄 工具-》外掛。點選更新,如果有503錯誤則繼續如下操作,沒有則忽略
1、開啟連結 https://visualvm.github.io/pluginscenters.html
2、cmd命令列,java -version 檢視自己jdk版本 ,在連結中找到自己版本對應的jdk,點選對應jdk版本下方的連結,複製開啟的新頁面頂部的連結
3、回到jvisualvm的圖形化介面,點選設定,點選編輯,將url替換
4、重啟jvisualvm
開啟visual GC,對對應的資訊進行檢視
在圖上,我們可以看到在新生代發生了2106次gc,僅6.288s,而在老年代僅發生3次gc就用了0.419312s,故我們要儘量避免fullgc
壓力測試
中介軟體對效能的影響
Nginx壓測
1、測試Nginx的效能
新增執行緒組,50個執行緒,不斷請求,永不停止
因我nginx使用docker容器部署,故在docker容器中使用docker stats 檢視nginx的cpu及io佔用
2、啟動JMeter
3、在容器中檢視nginx的相關資源佔用,發現nginx使用的CPU比較多
SpringCloud Gateway壓測
啟動JMeter後使用jvisualvm對閘道器應用進行資源佔用分析,發現gateway也是對cpu資源佔用較高
商品服務壓測
首先單測簡單服務(使用控制器直接返回hello,不做運算也不對資料庫操作),發現即使記憶體分配的很低的情況下,效能也是十分高的
從閘道器到簡單服務壓測
使用閘道器(吞吐量1w/s左右)轉發至商品服務(吞吐量1w/s左右)的壓力測試,此時吞吐量是3k左右,效能損失較大,簡單得出中介軟體越多,效能損失越大,大多損失在網路互動
從nginx到gateway到商品服務全鏈路壓測
此時的吞吐量只到了800左右
資料庫、渲染資料等對效能影響
直接訪問商品服務首頁一級選單渲染壓測
一級選單需要訪問資料庫進行查詢,並對結果進行封裝,此時只有270左右的吞吐量
直接訪問商品服務首頁三級選單渲染壓測
此時需要去資料庫查詢的資料較多,吞吐量只有2了
上表可以反應效能損失,但因為我是在同一臺機器上進行壓測,執行緒間有競爭,故結果僅供參考,但也能反應出各類問題
商品首頁全量壓測(js,css,img)
首先設定Jmeter,壓測後發現吞吐量只有7左右,新生代及老年代的記憶體太小
優化後全量壓測
中介軟體越多,效能損失越大,大多損失在網路互動
業務: DB(MySQL優化)、模板的渲染速度(快取,CPU)、靜態資源
優化
動靜分離
計劃:
1、將所有專案的靜態資源都放在nginx中
2、規則:/static/***所有請求都有nginx直接返回
行動:
1、將服務中的/static資料夾複製到nginx中html/static 資料夾
2、刪除專案中的static資料夾
3、更改前端頁面請求資源的路徑,所有請求靜態資源的連結前(圖片,css,js等)加上/static,(由/index/css/a.css 改為 /static/index/css/a.css)
4、再在nginx配置檔案中修改 cd /mydata/nginx/conf/ vi對應的conf, 修改配置
server{
listen 80;
server_name amal.com;
location /static/ {
root /usr/share/nginx/html;
}
location / {
proxy_set_header Host $host;
proxy_pass http://amall;
}
}
5、訪問原來商城中的頁面:訪問成功
此時再進行全量壓測,吞吐量從之前的7變成了11左右,再看看堆記憶體佔用情況,發現老年代幾乎要滿,新生代也在不停gc,時間大多花在gc上
調優
1、調大jvm記憶體,從100m調至1024m -Xmx1024m(最大可佔用記憶體) -Xms1024m(啟動時佔用記憶體) -Xmn512m(新生代大小)
2、業務邏輯調優
2.1將資料庫的多次查詢變成一次 吞吐量變成130左右