5. 堪比JMeter的.Net壓測工具 - Crank 實戰篇 - 介面以及場景壓測

来源:https://www.cnblogs.com/MASA/archive/2022/04/15/16149817.html
-Advertisement-
Play Games

1. 前言 通過之前的學習,我們已經掌握了crank的配置以及對應http基準工具bombardier、wrk、wrk2的用法,本篇文章介紹一下如何將其用於實戰,在實際的項目中我們如何使用crank來完成壓測任務。 2. 項目背景 目前有一個項目,我們希望通過壓測來瞭解其QPS、吞吐量、以及臨界值, ...


1. 前言

通過之前的學習,我們已經掌握了crank的配置以及對應http基準工具bombardier、wrk、wrk2的用法,本篇文章介紹一下如何將其用於實戰,在實際的項目中我們如何使用crank來完成壓測任務。

2. 項目背景

目前有一個項目,我們希望通過壓測來瞭解其QPS、吞吐量、以及臨界值,並通過壓測來分析出其瓶頸在哪裡?並通過解決瓶頸問題以提高QPS、吞吐量等指標

先看下我們手頭掌握了什麼:

  • 項目信息
    • 項目中的介面基本都需要登錄
    • 通過與開發溝通可以得到每個頁面的介面信息以及參數信息
  • 環境信息
    • 壓測項目有單獨的環境部署應用、Redis、資料庫等基礎配置

此處項目名我們暫定為ProjectA。

3. 如何開展

首先我們先回顧一下Agent、Controller的職責以及特點

  • Controller
    • 做任務調度以及結果輸出
    • 無需單獨伺服器,可以在本機執行發送命令,需要與Agent相通
  • Agent
    • 任務的實際執行者
    • 單任務執行,不能做到接收到多個任務並同時執行,先收到哪個任務,哪個任務會先執行
    • 相同一個任務可以被多個Agent同時執行,最終指標結果會自動累加,可以通過提升Agent來模擬更高的併發能力

3.1. 思路

  • 先做好單獨介面的壓測,大概掌握每個介面的指標情況
  • 同時壓測多個介面,完成對場景的壓測
  • 通過壓測觀察應用伺服器、基礎伺服器的CPU、帶寬、記憶體等指標,觀察Redis、資料庫、消息隊列等基礎組件情況,根據壓測的返回結果得到每個場景的基礎指標
  • 通過分析發現瓶頸、然後再考慮如何突破瓶頸,提升QPS、吞吐量等

3.2. 如何做?

瞭解到單個Agent同時執行多個任務會進行排隊,無法做到多任務同時執行,那麼我們可以通過多個Agent同時執行不同的任務來模擬用戶訪問頁面。

3.2.1. 構建Agent

之前與開發溝通得到每個頁面最多可發送的請求是6個,那麼我們準備6個Agent,分別為Agent1、Agent2、Agent3、Agent4、Agent5、Agent6

我們這裡使用Docker來啟動Agent、Agent對內開放埠: 5010、對外埠隨機,鏡像使用我們自建的: doddgu/crankagent:net5.0

並新建load.yml為之後壓測使用:

profiles:
  crankAgent1:
    jobs:
      load:
        endpoints:
          - http://localhost:5010
  crankAgent2:
    jobs:
      load:
        endpoints:
          - http://localhost:5011
  crankAgent3:
    jobs:
      load:
        endpoints:
          - http://localhost:5012
  crankAgent4:
    jobs:
      load:
        endpoints:
          - http://localhost:5013
  crankAgent5:
    jobs:
      load:
        endpoints:
          - http://localhost:5014
  crankAgent6:
    jobs:
      load:
        endpoints:
          - http://localhost:5015

load.yml 中記錄了所有的壓測機信息,其信息一般不做修改,我們可以作為公共的配置來使用無需每個項目都單獨維護一份新的

3.2.2. 構建壓測腳本

在這裡我們選擇wrk2作為本次基準測試工具,選擇wrk2的原因是:

  • 支持隨機參數
  • 可支持設置恆定的吞吐量負載
  • 具備wrk的所有功能

此時我們針對ProjectA項目新建配置:project.profiles.yml,作為本次壓測的環境配置來使用,其配置如下

imports:
  - https://raw.githubusercontent.com/doddgu/crank/sample/samples/wrk2/common/load.profiles.yml # 這邊建議使用遠程load.profiles.yml地址。(如果輸入的是本地路徑、則需輸入與當前命令所在路徑的相對路徑)

profiles:

  local: # 本地環境
    variables:
      serverAddress: localhost # 應用服務域
      serverPort: 80 # 應用服務埠
      connections: 256 # 每個線程處理時保持打開的 HTTP 連接總數 N = 連接數/線程數
      threads: 32 # 線程數
      warmup: 3 # 預熱時間: 3s
      duration: 180 # 測試時長: 3分鐘
      rate:  # 吞吐量參數(每秒總請求數)

project.profiles.yml中記錄了指定項目的各環境的配置,項目自己獨立維護即可

除了項目信息、壓測機配置之外,我們還需要有地方維護我們壓測的介面信息,這邊我的做法是將api獨立拆分出來,每個yml只配置一個介面的壓測信息,至於為什麼不放到一塊,而要單獨拆分開呢?

這塊考慮到我們壓測的最小單元是API介面,如果把API介面獨立拆分開,那麼可以對單介面壓測,而如果我們需要場景壓測,也可以通過組合介面完成多介面同時壓測,並且一旦我們完成了某個介面的壓測編寫,後續不需要再改動這個配置,如果我們按照場景拆分成不同的yml,在yml中再根據定義不同的scenario來做,那麼後續場景新增加介面,還需要再更改這個場景的yml,並且scenario中的場景實際上也是根據介面維度區分的,目前crank並不能完成單個場景任務同時處理,基於以上原因,這邊我們新調整好的配置格式為:

新增load.benchmarks.yml

imports:
  - https://raw.githubusercontent.com/doddgu/crank/sample/src/Microsoft.Crank.Jobs.Wrk2/wrk2.yml
  - https://raw.githubusercontent.com/doddgu/crank/sample/samples/wrk2/common/project.profiles.yml

jobs:
  server:
    source:
      repository: https://github.com/doddgu/crank
      branchOrCommit: sample
      project: samples/hello/hello.csproj
    readyStateText: Application started.

scenarios:
  api:
    application: # 實際壓測項目時可移除此節點,此處是為模擬應用服務啟動
      job: server
      variables:
        duration: 1
    load:
      job: wrk2
      variables:
        serverPath: /user/get
        script: request.lua
        duration: 1

profiles:
  defaultParamLocal: # 本地環境的參數信息
    variables: 
      serverQueryString: ?id={1}
      serverQueryParameter: 1||2 # 隨機請求/get?id=1、/get?id=2

按照此格式保存,後續新增介面也可以快速複製,簡單修改即可快速完成壓測工作的編寫,這樣一來,如果我們希望對localhost:5000/user/get這個介面做壓測,僅需要在crank控制端輸入:

crank --config load.benchmarks.yml --scenario api --load.framework net5.0 --application.framework net5.0 --profile local --profile crankAgent1 --description "獲取用戶詳情" --profile defaultParamLocal

3.2.3. 構建批處理命令

但作為一個開發人員,總是希望事情能更簡單一點,每次輸入命令太麻煩了,所以就想到了通過批處理快速完成任務的發送,最終的項目結構就變成了

benchmarks
├─ defaultTitle              介面名稱( Description )
└─ load.bat                  最終執行的腳本,其中指定了要指定的yml配置、場景、以及任務環境是.net 5.0
└─ load.benchmarks.yml       yml配置
└─ load.local.bat            測試本地環境時要執行的腳本、格式:load.{環境}.bat
└─ README.md                 幫助文檔

每次通過雙擊load.{環境}.bat就完成了對當前介面的壓力測試,然後就是等待結果輸出……

| application           |                |
| --------------------- | -------------- |
| CPU Usage (%)         | 1              |
| Cores usage (%)       | 10             |
| Working Set (MB)      | 85             |
| Private Memory (MB)   | 278            |
| Build Time (ms)       | 3,469          |
| Start Time (ms)       | 352            |
| Published Size (KB)   | 93,323         |
| .NET Core SDK Version | 5.0.404        |
| ASP.NET Core Version  | 5.0.13+55738ff |
| .NET Runtime Version  | 5.0.13+b3afe99 |


| load                  |                |
| --------------------- | -------------- |
| Build Time (ms)       | 3,281          |
| Start Time (ms)       | 0              |
| Published Size (KB)   | 74,276         |
| .NET Core SDK Version | 5.0.404        |
| ASP.NET Core Version  | 5.0.13+55738ff |
| .NET Runtime Version  | 5.0.13+b3afe99 |
| First Request (ms)    | 86             |
| Requests/sec          | 2              |
| Requests              | 2              |
| Mean latency (ms)     | 2.68           |
| Max latency (ms)      | 2.68           |
| Bad responses         | 0              |
| Socket errors         | 0              |
| Latency 50th (ms)     | 2.68           |
| Latency 75th (ms)     | 2.68           |
| Latency 90th (ms)     | 2.68           |
| Latency 99th (ms)     | 2.68           |
| Latency 99.9th (ms)   | 2.68           |
| Latency 99.99th (ms)  | 2.68           |
| Latency 99.999th (ms) | 2.68           |

3.2.4. 構建場景壓測批處理命令

通過上面的一番操作,我們已經可以很容易的對單介面進行壓測,但目前想模擬完成多介面同時壓測,還需要再改造一下,之前我們想到,crank目前只能完成單獨壓測任務,那是不是有多個Agent,每個Agent單獨壓測一個介面,並同時啟動多個Agent同時壓測是不是可以模擬出來場景壓測,那我通過批處理任務多點幾次不同的介面壓測不就可以了,基於以上考慮,又做了一個批處理腳本,用於調用多個介面的壓測任務啟動,最後的結構如下所示:

Crank
├─ benchmarks                壓測腳本
│  ├─ api                   介面壓測腳本               
│  │  ├─ add               
│  │  └─ get                  
│  ├─ scipts               lua腳本             
│  │  ├─ common            lua公共腳本
│  │  │  ├─ oauth.lua     認證lua腳本
│  │  │  ├─ util.lua      lua工具類腳本
│  │  ├─ request.lua       封裝請求lua腳本   
│  ├─ scripts.tar           lua腳本壓縮包
├─ common                            
│  ├─ load.profiles.yml     agent 負載機配置
│  ├─ project.profiles.yml  項目配置
│  ├─ scripts.profiles      crank 執行script配置,用於對輸出結果的二次處理
│  ├─ project.profiles.yml  項目配置
├─ scripts                   場景壓測腳本
│  ├─ 用戶.bat              用戶壓測     
└─ env                       環境配置,標記當前需要壓測的環境在哪個配置文件中存儲
└─ env.local                 本地環境,存儲本地環境的配置信息
└─ README.md                 幫助文檔

4. 結尾

通過上面的操作我們已經完成了對單介面以及單場景的壓測,通過控制台可以清晰的看到每個介面的壓測結果,我們只需要耐心等待壓測任務結束,並整理壓測結果數據,最後進行彙總我們的任務就完成了,但壓測結果的收集也是一個費事費力的工作,作為一個開發,是不想把時間花費到這些整理表格的事情上,那我們如何做可以把整理表格數據的工作節省下來讓我們可以歇會兒呢……

源碼地址:https://github.com/doddgu/crank/tree/sample/samples/wrk2

參考鏈接:

開源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你對我們的 MASA Framework 感興趣,無論是代碼貢獻、使用、提 Issue,歡迎聯繫我們

16373211753064.png


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在工作中面向社群玩家組織了一場活動,需要進行隨機抽獎,參考之前小明大佬的案例,再結合自己的需求,做了一個簡單的隨機抽獎小工具。 今天我就來順便介紹一下這個小工具的製作過程吧! 1. 核心功能設計 針對隨機抽獎的小工具,需要可以導入參與抽獎的人員名單,然後選擇不同的獎勵類型進行隨機抽取獲獎名單並導 ...
  • 大家在Debug程式的時候,是否遇到過因為“下一步”按太快,而導致跳過了想要深入分析的那段代碼?是不是很想要有“回到上一步”這樣的操作呢? 在IDEA中就提供了一個幫助你回退代碼的機會,但這個方法並不是萬能的。好了,下麵就來具體說說這個功能的使用! 使用Reset Frame回退操作 不知道你在De ...
  • 修飾類只有public和default(也就是是不寫訪問修飾符) 修飾成員變數或成員方法時有四種 public 可以被任意包中的類訪問 protected 可以被同一包下的其他類訪問(包括同一包下的子類),其他包的子類可以訪問 default(也就是什麼都不寫) 可以被同一包下的其他類訪問(包括同一 ...
  • 來源:juejin.im/post/5d026212f265da1b8608828b IDEA是Java開發利器,springboot是Java生態中最流行的微服務框架,docker是時下最火的容器技術,那麼它們結合在一起會產生什麼化學反應呢? 一、開發前準備 1.Docker安裝 可以參考: ht ...
  • 之前用.net5.0寫webapi,自動集成swagger,非常方便。asp.net mvc沒有自動集成swagger,但是手動配置swagger也很簡單。 1、nuget引用Swashbuckle庫,安裝完後,App_Start下自動多了一個SwaggerConfig.cs; 2、打開Swagge ...
  • 1. DevOps的一些介紹 DevOps(Development和Operations的組合詞)是一組過程、方法與系統的統稱,用於促進開發(應用程式/軟體工程)、技術運營和質量保障(QA)部門之間的溝通、協作與整合。 它是一種重視“軟體開發人員(Dev)”和“IT運維技術人員(Ops)”之間溝通合 ...
  • 工具 這裡用到兩個工具分別為Procdump+Windbg Procdump:ProcDump是一個命令行實用工具,主要目的是監視應用程式,以便在管理員或開發人員可用於確定峰值的原因期間監視 CPU 峰值和生成故障轉儲。 ProcDump 還包括使用視窗掛起 (使用相同的視窗掛起定義,Windows ...
  • 在實際的軟體開發過程中,我們通常會採用一種前後端分離的開發模式,在這種模式下一般會由前後端兩類開發人員協同開發,在這種情況下後端開發人員則需要提供API文檔去與前端人員進行對接,這樣才能保障後續的工作能夠順利開展。 並且當前項目在與外部系統進行業務往來或者數據交互的時候,我們通常會作為“介面方”對外 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...