1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        48張圖|手摸手教你性能監(jiān)控、壓測和調(diào)優(yōu)

        共 5302字,需瀏覽 11分鐘

         ·

        2021-06-13 02:21

        cb4ddb30e2cf7d34636c98908bdacd79.webp

        本文主要內(nèi)容

        一、何為壓力測試

        1.1、 大白話解釋

        • 性能壓測是什么:就是考察當前軟件硬件環(huán)境下,系統(tǒng)所能承受的最大負荷,并幫助找出系統(tǒng)的瓶頸所在。

        • 性能壓測的目的:為了系統(tǒng)在線上的處理能力穩(wěn)定性維持在一個標準范圍內(nèi),做到知己知彼,百戰(zhàn)不殆。還可以發(fā)現(xiàn)內(nèi)存泄漏、并發(fā)與同步的問題。

        1.2、性能指標

        • RepsonseTime - RT:響應(yīng)時間,用戶從客戶端發(fā)起一個請求開始計算,到客戶端接收到服務(wù)端的響應(yīng)結(jié)束,整個過程所耗費的時間。
        • Hits Per Second - HPS:用戶每秒點擊次數(shù),也就是每秒向后臺發(fā)送的請求次數(shù)。
        • QPS:系統(tǒng)每秒內(nèi)處理查詢的次數(shù)。
        • MaxRT:最大響應(yīng)時間,指用戶發(fā)出請求到服務(wù)端返回響應(yīng)的最大時間。
        • MiniRT:最少響應(yīng)時間,指用戶發(fā)出請求到服務(wù)端返回響應(yīng)的最少時間。
        • 90%響應(yīng)時間:將所有用戶的響應(yīng)時間進行升序排序,取 90 % 的位置。
        • 性能測試關(guān)注點:
          • 吞吐量:每秒鐘系統(tǒng)能處理的請求數(shù)、任務(wù)數(shù)。
          • 響應(yīng)時間:服務(wù)處理一個請求或一個任務(wù)的耗時。
          • 錯誤率:一批請求中結(jié)果出過錯的請求所占比例。

        二、Jmeter 壓測工具

        1、Jmeter 工具

        • 下載和安裝 Jmeter 工具

        下載地址:

        https://jmeter.apache.org/download_jmeter.cgi

        我下載的版本是 apache-jmeter-5.3

        15a629cb60815983fc54eb202c64e4ef.webp
        • 運行 JMeter 程序

        打開批處理文件:\apache-jmeter-5.3\bin\jmeter.bat。如下圖所示:

        a5f542aecf513e858710a3357a90f845.webp
        • 添加線程組,如下圖所示:
        bd9ded9d0c723cda777eed7d4c90234b.webp添加線程組
        • 1s 內(nèi)啟動 200 個線程,循環(huán)次數(shù) 100 次。2 w 個請求。如下圖所示:
        825a28192fc86ad416c9d6e1b814b186.webp
        • 測試 HTTP 請求,如下圖所示:
        635cb69e32ee0d30e810b308b7602809.webp

        配置要測試的協(xié)議、服務(wù)器地址、端口號。配置信息如下:

        協(xié)議:使用 http 協(xié)議。

        服務(wù)器名稱或 IP: www.baidu.com (只是為了演示)。

        端口號:80 端口。

        如下圖所示:

        1179752cf62fd710aca36cfe70d4fe41.webp
        • 添加查看結(jié)果樹、匯總報告和聚合報告。如下圖所示:
        bebab106bc4db2efd275585303180a74.webp
        • 開始壓力測試。

          點擊播放按鈕就開始啟動了。注意啟動之前需要先設(shè)置線程組的參數(shù)配置和 HTTP 請求的配置。如下圖所示:

        db5607740fa601f8b5af6ea21a9a229a.webp
        • 查看每個請求結(jié)果,如下圖所示:
        93ddcdc7d11cc99449b40024af743ed0.webp
        • 查看匯總報告。

          主要關(guān)心平均值和吞吐量。

          200 個線程,每個線程調(diào)用 100 次,總共 2 w 次,可以看到下圖中表格中的樣本列也是 2 w,請求所耗費的時間是 151 ms,吞吐量是 880 個請求每秒。如下圖所示:

        43ae967f73c9418afb9f7651805bf216.webp
        • 查看聚合報告。

        主要看中位數(shù)和90%百分位,

        中位數(shù)是 59 ms,說明大部分請求的響應(yīng)時間是 59 ms。

        90 % 的請求 都是在 271 ms 以內(nèi)響應(yīng)完成的。

        異常 0.41% 說明 2 w 個請求中有 82 個請求異常(20000 * 0.0041 = 82 )。

        吞吐量 880.2/sec 說明百度這個網(wǎng)站每秒能處理 880 個請求,性能一般(可能跟本地機器性能有關(guān))。

        如下圖所示:

        ffcddcd471346c829383f382a5f00f5e.webp
        • 查看匯總圖。

        查看匯總圖時,需要先勾選想要查看的信息,如下圖所示:

        97875d041fc9ea15c936275fdcc5cc87.webp

        然后查看圖形匯總:

        18d6e066a64ef39299e491ca7c631955.webp

        可以看到勾選的幾列在圖表中是用不同顏色表示的,比如綠色的柱狀條就是 90 % 百分位。

        我們來測試下 PassJava(佳必過)的管理后臺的性能,吞吐量接近 2000/s。如下圖所示:

        071b0d768f4bd9509e5521855f0af922.webp

        三、性能監(jiān)控之 jconsole

        jconsole 和 jvisualvm 是 Java JDK 的兩個小工具,用來監(jiān)控內(nèi)存泄漏、跟蹤垃圾回收、執(zhí)行時的內(nèi)存情況、對 CPU 進行分析、線程的分析。都可以通過命令行啟動,而且可以監(jiān)控本地和遠程應(yīng)用。而 jvisualvm 是升級版的 jconsole。我們先來看下 jconsole 的使用。

        首先用 cmd 命令行的方式啟動 jconsole。

        啟動 jconsole??????????????????????????????????????????????????

        678d927a28d84bf4aa4e4a209029f24c.webp命令行啟動 jconsole

        選擇監(jiān)控哪個應(yīng)用

        然后選擇 passjava 項目的 question 服務(wù)。

        f55f887d2226b1d2ba7db21ffcc90aa4.webp選擇 passjava-question 微服務(wù)

        對應(yīng)的就是下面這個微服務(wù):passjava-question。

        fed002997e93bc2f08fdc3d45634d41b.webp對應(yīng) passjava-question 微服務(wù)

        概覽

        從監(jiān)控界面上有 6 個菜單,首先看到的是概覽功能,上面有堆內(nèi)存使用量、線程數(shù)、類的使用情況、CPU 占用率,都是用趨勢圖來表示的,能很方便的看出當前性能的概覽。注意:這些監(jiān)控都是實時的。

        3fe502f0729bc9025565d702f19041c7.webp概覽

        內(nèi)存

        下面是內(nèi)存的使用情況,可以從下圖中看到有個下拉框,里面可以選擇不同的內(nèi)存維度,然后下面的圖標和柱狀圖也會跟著選擇的維度而展示不同。

        e62d50d065d6cf1d2ed3b7522a47ebb0.webp

        內(nèi)存

        下面是線程的使用情況,可以看到線程峰值和活動線程的總數(shù)量,目前看到的峰值是59,活動線程數(shù)是 57。下半部分可以看到具體是哪些線程,以及線程的堆棧信息,非常詳細。

        ee188582dbe45d5ca28ac93758abb702.webp線程使用情況

        下面是類的加載和卸載情況,已加載類總數(shù)是 10679,而已卸載的類是 1 個,所以當前已加裝當前類的總數(shù)是 10679 - 1 = 10678 個。

        cded6c47c678444ab40a3facb57cfbf1.webp類的加載和卸載情況

        VM 概要

        我們再來看下VM(虛擬機)的情況。如下圖所示,可以看到虛擬機情況,線程、類、堆的概要信息,以及 VM 的參數(shù),是不是很方便呀~

        f2ea6978e433ed5218069bfda16ebf59.webpVM 概要

        MBean 信息

        接下來我們來看下 MBean 信息。對于 MBean,可能很多同學(xué)不知道是啥,下面做個解釋:

        MBean就是一種規(guī)范的JavaBean,通過集成和實現(xiàn)一套標準的Bean接口,這種叫MBean。MBean可以用來干嘛?就是可以有一套JDK級別的對外的服務(wù)接口。比如,你寫了一個JVM允許狀態(tài)輔助查詢的Bean,你希望別人下載一個Jconsole就可以看到你寫的杰作。那你就可以考慮用MBean規(guī)范來實現(xiàn)。很多垃圾收集器算法Bean就這么干的(說的就是這個類sun.management.MemoryImpl)。

        dea91b5da5c3d29b77519e414ee5f8ff.webpMBean 信息

        四、性能監(jiān)控之 jvisualvm

        jvisualvm 比 jconsole 更強大,界面展示的信息更豐富。還可以安裝插件,太贊了。

        啟動 jvisualvm 和概述

        啟動方式和 jconsole 一樣,也是通過 cmd 命令行啟動。還是選擇 passjava-question 微服務(wù),然后選擇第一個菜單欄:概述??梢钥吹?JVM 的版本,啟動參數(shù)等信息。

        a9d3ab74da200bc3109402a321094868.webp啟動jvisualvm

        監(jiān)視

        監(jiān)視 CPU、堆、類、線程的情況。整體顯示的效果比 jconsole 更美觀。

        0398d786859f4d877158d665d78981f1.webp監(jiān)視

        線程

        再來查下線程的情況??梢钥吹接?5 種狀態(tài)的線程:

        • 運行:正在運行的線程。
        • 休眠:休眠狀態(tài)的線程。
        • 等待:等待執(zhí)行的線程。
        • 駐留:線程里面的空閑線程。
        • 監(jiān)視:阻塞的線程,正在等待鎖。
        0477d541d777f16aaeeafeb64a48ffa1.webp

        抽樣器

        另外我們也可以抽樣器對 CPU 或內(nèi)存進行抽樣。如下圖所示,對內(nèi)存進行抽樣。

        2ca2d0ed980395a6476979a3c4c282e4.webp抽樣

        插件的使用

        安裝Visual GC 插件

        安裝步驟:工具->插件->可用插件->Visual GC->安裝。安裝完成后,重啟就可以使用插件功能了。

        f175a924d9ed6962df74fab7c330c5e7.webp

        安裝完成后,就可以看到

        466eb7ab33bcddf4b0af3c43c0a59644.webpVisual GC 插件

        下圖是實時監(jiān)控垃圾回收的情況。

        d9341bce41e6e89d0557615541da734e.webpVisual GC

        五、對網(wǎng)關(guān)的性能測試

        現(xiàn)在我想對 Passjava 系統(tǒng)的 question 微服務(wù)的接口進行一個壓測,該如何進行呢?

        首先我們來看下 passjava 的架構(gòu)是怎么樣的,如下圖所示:

        53391d9a5cf9b8b289cdaeee42f7912e.webp

        客戶端分為手機端和 PC 端,http 請求先經(jīng)過 API Gateway,然后再轉(zhuǎn)發(fā)到 question 微服務(wù)。其中涉及到了中間件:Gateway 網(wǎng)關(guān)。

        我們來對 Gateway 網(wǎng)關(guān)進行壓力測試。

        網(wǎng)關(guān)的端口號是 8060,我們配置下 JMeter。如下圖所示:

        89bcb0eaf5b3b59e2ef8c160d5913e1f.webp

        配置每秒發(fā)送 200 個請求,一直循環(huán)執(zhí)行,直到手動停止壓測。如下圖所示:

        418beeac48531962d5a24fd62b828d7e.webp

        可以看下執(zhí)行結(jié)果,吞吐量在 2422 個每秒,還是比較高的。

        吞吐量:2422/s 。

        90% 響應(yīng)時間:142 毫秒。

        99% 響應(yīng)時間:281 毫秒。

        5b3c8d4fe5cbf62d79bea5da30d3be82.webp

        我們再來看看垃圾回收的情況,Eden 區(qū)垃圾回收用時 2.7 s,用時太長了吧,看看這里怎么能優(yōu)化下。

        通常的優(yōu)化方向是增大新生代堆內(nèi)存配置。

        ef50187afda72ad92e087b1ed5ab139d.webp

        六、對微服務(wù)的性能測試

        根據(jù)上面的架構(gòu)原理圖,我們知道客戶端請求都是經(jīng)過 Gateway 轉(zhuǎn)發(fā)了一次的,如果我們想單獨看下微服務(wù)的性能該怎么測試呢?下面我來演示下如何測試 passjava-question 微服務(wù)的性能。

        首先需要在 passjava-question 微服務(wù)中添加一個測試方法:

        415564feac79b9b298147964ed7c5468.webp測試方法

        有兩種方式測試這個 api 是否添加正確。

        第一種用 postman 測試下這個請求是否能正確響應(yīng),返回 “test” 則表示響應(yīng)正確。

        ead7eae2e7e3723374f8cd7f1181a2d1.webptest api 是否能正確響應(yīng)

        第二種通過瀏覽器進行測試。瀏覽器地址欄輸入以下鏈接后,回車,看下瀏覽器窗口是否顯示 “test”,是則表示響應(yīng)正確。

        然后我們需要用 Jmeter 壓測工具來測試這個微服務(wù)下的 api 的性能究竟如何。

        48bb13f13c858c5cc361f27c7969b7a1.webp單獨壓測微服務(wù)的 api的結(jié)果

        吞吐量:3542/s 。

        90% 響應(yīng)時間:100 毫秒。

        99% 響應(yīng)時間:152 毫秒。

        七、對網(wǎng)關(guān)+微服務(wù)的性能測試

        如果我們想對這個整個請求鏈路進行性能測試該怎么做?

        首先請求需要先經(jīng)過網(wǎng)關(guān),然后由網(wǎng)關(guān)轉(zhuǎn)發(fā)到微服務(wù)。在之前的文章中,我已經(jīng)將網(wǎng)關(guān)配置好了,所以要想通過網(wǎng)關(guān)轉(zhuǎn)發(fā)到 test 請求,只需要對請求路徑稍作修改即可,如下所示:

        http://localhost:8060/api/question/v1/admin/question/test

        然后在瀏覽器輸入該網(wǎng)址,返回 “test” 即表示響應(yīng)正確。

        然后我們還是用 Jmeter 壓測工具測試下 test api 的性能。測試結(jié)果如下圖所示:

        63035e76e161899c21f95ebf539a7959.webp網(wǎng)關(guān)+微服務(wù)的壓力測試結(jié)果

        從結(jié)果可以看到:

        吞吐量:982/s 。

        90% 響應(yīng)時間:437 毫秒。

        99% 響應(yīng)時間:790毫秒。

        這里做個橫向?qū)Ρ龋?/p>79dae71a2c687ba844f353a7c0d02b02.webp橫向?qū)Ρ?p>說明微服務(wù) api 經(jīng)過網(wǎng)關(guān)轉(zhuǎn)發(fā)一次后,性能至少下降了一半??梢缘贸鼋Y(jié)果:中間件越多,性能損失越大,大部分損失都是網(wǎng)絡(luò)交互導(dǎo)致的??梢酝ㄟ^增強網(wǎng)絡(luò)通信質(zhì)量來減少網(wǎng)絡(luò)的延遲。

        八、對數(shù)據(jù)庫查詢進行優(yōu)化

        一般情況下,出現(xiàn)性能問題更多的是業(yè)務(wù)中查詢數(shù)據(jù)庫的耗時。接下來看下如何優(yōu)化數(shù)據(jù)的查詢。

        下面是一個查詢問題列表的 api:通過問題類型 type 字段過濾問題列表。api 路徑如下:

        http://localhost:11000/question/v1/admin/question/list?type=5

        這個 api 的代碼如下,很容易看懂。

        3e12e80749fad84d828a39a04b6aa41a.webp查詢問題列表的 api

        我們加些測試代碼:統(tǒng)計查詢數(shù)據(jù)庫的耗時。如下所示:

        722acb600442ac34bdd4b43a3f6cc54a.webp耗時統(tǒng)計

        然后重啟 passjava-question 服務(wù),再次測試這個 api,耗時 43 ms

        b38d2bbd5f723da00d360827b4897702.webp

        怎么對查詢進行優(yōu)化呢?很容易想到加索引,我們來試下加在 question 表加索引后的效果。給 type 字段加上普通索引,如下圖所示:

        2bc384ff72345c45fd468bfee3f66fe9.webp添加索引

        我們再來看下加了索引后的耗時情況:耗時 18 ms,確實比之前的 43 ms 快了很多。

        25ace1e2cae329e6395486c761e2dbe7.webp加了索引后的情況

        九、優(yōu)化垃圾回收

        我們可以通過 jvisulavm工具查看垃圾回收的情況,Eden 區(qū)頻繁發(fā)生 GC,短時間(1分鐘)內(nèi)共造成了 480 次 stop the world。另外從壓測工具中也可以看到,吞吐量為 275/s。

        原因是 Eden 區(qū)的內(nèi)存分配得太小了,只有 32 M,我們來調(diào)大一點。

        dfc8259b4bf0094ffd9c16baea73d25f.webp32M Eden 區(qū)頻繁進行垃圾回收

        增大 Eden 區(qū)大小

        通過在 IDEA 工具中配置以下參數(shù),調(diào)整堆內(nèi)存最大為 1024 M,新生代內(nèi)存為 512 M。

        -Xmx1024m?-Xms1024m?-Xmn512m

        然后可以觀察到在相當長的短時間(1分鐘)內(nèi)只進行了 92 次垃圾回收,說明垃圾回收的頻率降低了。應(yīng)用程序的性能也提升了。另外從壓測工具中也可以看到,吞吐量為 347/s,吞吐量也有較大提升。

        faad3ae04925439ea6c9304fd9da1853.webp

        十、總結(jié)

        本文通過壓測工具 Jmeter 講解壓測如何實施,然后用性能監(jiān)控工具 jconsole 和 jvisualvm 來監(jiān)控 Java 應(yīng)用程序的性能,以及如何用工具來優(yōu)化開源項目 passjava 的性能,并且非常詳細地介紹了每一步以及執(zhí)行結(jié)果,通過對比的方式,更加清晰地知道如何做性能優(yōu)化。

        下面是對系統(tǒng)性能的常規(guī)優(yōu)化手段:

        • 中間件較多時,優(yōu)化網(wǎng)絡(luò)通信質(zhì)量。

        • 數(shù)據(jù)庫查詢耗時時,需要對查詢進行優(yōu)化,比如添加索引。

        • 模板的渲染速度,可以通過設(shè)置模板緩存。

        • 靜態(tài)資源的獲取,可以通過 Nginx 動靜分離來解決。(下期再講)

        • 日志太多,需要減少不必要的打 log 操作。

        36fe82f25efd91be43b7ba291063170e.webp

        巨人的肩膀:

        https://blog.csdn.net/u010833547/article/details/92806510
        https://www.bilibili.com/video/BV1np4y1C7Yf
        https://github.com/Jackson0714/PassJava-Platform
        www.passjava.cn


        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日女人网站 | 九九九免费在线视频 | 中文字幕++中文字幕明步 | 成人免费观看在线视频毛片 | 在线国内精品 | 亚洲嗯啊 | 干女人| 欧美激情狂野 | 99国产精品久久久久久久日本竹 | 丰满放荡岳乱妇69www |