<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          48張圖告訴你,如何優(yōu)化微服務(wù)的性能

          共 5797字,需瀏覽 12分鐘

           ·

          2021-04-09 11:50

          這是悟空的第 85 篇原創(chuàng)文章

          作者 | 悟空聊架構(gòu)

          來(lái)源 | 悟空聊架構(gòu)(ID:PassJava666)

          轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:PassJava)
          本文主要內(nèi)容

          本文的開(kāi)源實(shí)戰(zhàn)項(xiàng)目:https://github.com/Jackson0714/PassJava-Platform

          本文已收錄至:www.passjava.cn

          一、何為壓力測(cè)試

          1.1、 大白話(huà)解釋

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

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

          1.2、性能指標(biāo)

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

          二、Jmeter 壓測(cè)工具

          1、Jmeter 工具

          • 下載和安裝 Jmeter 工具

          下載地址:

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

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

          • 運(yùn)行 JMeter 程序

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

          • 添加線(xiàn)程組,如下圖所示:
          添加線(xiàn)程組
          • 1s 內(nèi)啟動(dòng) 200 個(gè)線(xiàn)程,循環(huán)次數(shù) 100 次。2 w 個(gè)請(qǐng)求。如下圖所示:
          • 測(cè)試 HTTP 請(qǐng)求,如下圖所示:

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

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

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

          端口號(hào):80 端口。

          如下圖所示:

          • 添加查看結(jié)果樹(shù)、匯總報(bào)告和聚合報(bào)告。如下圖所示:
          • 開(kāi)始?jí)毫y(cè)試。

            點(diǎn)擊播放按鈕就開(kāi)始啟動(dòng)了。注意啟動(dòng)之前需要先設(shè)置線(xiàn)程組的參數(shù)配置和 HTTP 請(qǐng)求的配置。如下圖所示:

          • 查看每個(gè)請(qǐng)求結(jié)果,如下圖所示:
          • 查看匯總報(bào)告。

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

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

          • 查看聚合報(bào)告。

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

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

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

          異常 0.41% 說(shuō)明 2 w 個(gè)請(qǐng)求中有 82 個(gè)請(qǐng)求異常(20000 * 0.0041 = 82 )。

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

          如下圖所示:

          • 查看匯總圖。

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

          然后查看圖形匯總:

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

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

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

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

          首先用 cmd 命令行的方式啟動(dòng) jconsole。

          啟動(dòng) jconsole??????????????????????????????????????????????????

          命令行啟動(dòng) jconsole

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

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

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

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

          對(duì)應(yīng) passjava-question 微服務(wù)

          概覽

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

          概覽

          內(nèi)存

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

          內(nèi)存

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

          線(xiàn)程使用情況

          類(lèi)

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

          類(lèi)的加載和卸載情況

          VM 概要

          我們?cè)賮?lái)看下VM(虛擬機(jī))的情況。如下圖所示,可以看到虛擬機(jī)情況,線(xiàn)程、類(lèi)、堆的概要信息,以及 VM 的參數(shù),是不是很方便呀~

          VM 概要

          MBean 信息

          接下來(lái)我們來(lái)看下 MBean 信息。對(duì)于 MBean,可能很多同學(xué)不知道是啥,下面做個(gè)解釋?zhuān)?/p>

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

          MBean 信息

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

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

          啟動(dòng) jvisualvm 和概述

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

          啟動(dòng)jvisualvm

          監(jiān)視

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

          監(jiān)視

          線(xiàn)程

          再來(lái)查下線(xiàn)程的情況。可以看到有 5 種狀態(tài)的線(xiàn)程:

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

          抽樣器

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

          抽樣

          插件的使用

          安裝Visual GC 插件

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

          安裝完成后,就可以看到

          Visual GC 插件

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

          Visual GC

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

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

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

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

          我們來(lái)對(duì) Gateway 網(wǎng)關(guān)進(jìn)行壓力測(cè)試。

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

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

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

          吞吐量:2422/s 。

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

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

          我們?cè)賮?lái)看看垃圾回收的情況,Eden 區(qū)垃圾回收用時(shí) 2.7 s,用時(shí)太長(zhǎng)了吧,看看這里怎么能優(yōu)化下。

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

          六、對(duì)微服務(wù)的性能測(cè)試

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

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

          測(cè)試方法

          有兩種方式測(cè)試這個(gè) api 是否添加正確。

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

          test api 是否能正確響應(yīng)

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

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

          單獨(dú)壓測(cè)微服務(wù)的 api的結(jié)果

          吞吐量:3542/s 。

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

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

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

          如果我們想對(duì)這個(gè)整個(gè)請(qǐng)求鏈路進(jìn)行性能測(cè)試該怎么做?

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

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

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

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

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

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

          吞吐量:982/s 。

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

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

          這里做個(gè)橫向?qū)Ρ龋?/p>

          橫向?qū)Ρ?/figcaption>

          說(shuō)明微服務(wù) api 經(jīng)過(guò)網(wǎng)關(guān)轉(zhuǎn)發(fā)一次后,性能至少下降了一半??梢缘贸鼋Y(jié)果:中間件越多,性能損失越大,大部分損失都是網(wǎng)絡(luò)交互導(dǎo)致的??梢酝ㄟ^(guò)增強(qiáng)網(wǎng)絡(luò)通信質(zhì)量來(lái)減少網(wǎng)絡(luò)的延遲。

          八、對(duì)數(shù)據(jù)庫(kù)查詢(xún)進(jìn)行優(yōu)化

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

          下面是一個(gè)查詢(xún)問(wèn)題列表的 api:通過(guò)問(wèn)題類(lèi)型 type 字段過(guò)濾問(wèn)題列表。api 路徑如下:

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

          這個(gè) api 的代碼如下,很容易看懂。

          查詢(xún)問(wèn)題列表的 api

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

          耗時(shí)統(tǒng)計(jì)

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

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

          添加索引

          我們?cè)賮?lái)看下加了索引后的耗時(shí)情況:耗時(shí) 18 ms,確實(shí)比之前的 43 ms 快了很多。

          加了索引后的情況

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

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

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

          32M Eden 區(qū)頻繁進(jìn)行垃圾回收

          增大 Eden 區(qū)大小

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

          -Xmx1024m -Xms1024m -Xmn512m

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

          十、總結(jié)

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

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

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

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

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

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

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

          巨人的肩膀:

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

          - END -

          作者簡(jiǎn)介:悟空,8年一線(xiàn)互聯(lián)網(wǎng)開(kāi)發(fā)和架構(gòu)經(jīng)驗(yàn),用故事講解分布式、架構(gòu)設(shè)計(jì)、Java 核心技術(shù)。《JVM性能優(yōu)化實(shí)戰(zhàn)》專(zhuān)欄作者,開(kāi)源了《Spring Cloud 實(shí)戰(zhàn) PassJava》項(xiàng)目,自主開(kāi)發(fā)了一個(gè) PMP 刷題小程序。


          往期推薦



          韓信大招:一致性哈希

          用太極拳講分布式理論,真舒服!

          用三國(guó)殺講分布式算法,舒適了吧?

          阿里終面:怎么用 UDP 實(shí)現(xiàn) TCP?

          5w 字 | 172 圖 | 超級(jí)賽亞級(jí) Spring Cloud 實(shí)戰(zhàn)


          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月婷婷第四色 | 老司机你懂的在线观看 | 免费看黄色一级视频 | 放荡少妇三p黄色毛片 | 夜夜骚AV一二三区无码 |