1. 程式人生 > 其它 >壓力測試及效能優化一

壓力測試及效能優化一

影響效能的因素

影響效能的因素包括:資料庫、應用程式(編碼能否優化)、中介軟體(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左右