Go 性能壓測工具之wrk介紹與使用

来源:https://www.cnblogs.com/taoxiaoxin/p/18108730
-Advertisement-
Play Games

在項目正式上線之前,我們通常需要通過壓測來評估當前系統能夠支撐的請求量、排查可能存在的隱藏bug;壓力測試(壓測)是確保系統在高負載情況下仍能穩定運行的重要步驟。通過模擬高併發場景,可以評估系統的性能瓶頸、可靠性和穩定性,進而優化系統架構和資源配置。 目錄一、壓力測試相關術語二、安裝wrk2.1 使 ...


在項目正式上線之前,我們通常需要通過壓測來評估當前系統能夠支撐的請求量、排查可能存在的隱藏bug;壓力測試(壓測)是確保系統在高負載情況下仍能穩定運行的重要步驟。通過模擬高併發場景,可以評估系統的性能瓶頸、可靠性和穩定性,進而優化系統架構和資源配置。

目錄

一、壓力測試相關術語

  • 響應時間 (RT):指系統對請求作出響應的時間。

  • 吞吐量 (Throughput):指系統在單位時間內處理請求的數量。

  • QPS(每秒查詢率,Query Per Second):“每秒查詢率”,是一臺伺服器每秒能夠響應的查詢次數,是對一個特定的查詢伺服器在規定時間內所處理流量多少的衡量標準。

  • TPS(Transaction Per Second):每秒鐘系統能夠處理的交易或事務的數量。

  • 併發連接數:某個時刻伺服器所接受的請求總數。

二、安裝wrk

2.1 使用Homebrew 安裝

brew install wrk

2.2 編譯安裝

使用Git 下載源碼

# 1. 切換到待安裝的目錄
cd /usr/local/src

# 2. 免提示(-y), 安裝 git
yum install git -y

# 3. 下載 wrk 源碼
git clone https://github.com/wg/wrk.git

克隆完成後,進入wrk目錄並執行make命令進行編譯。這個命令會編譯wrk並生成可執行文件:

# 4. 進入安裝文件夾
cd wrk

# 5. 下載 gcc 編譯器, 並編譯
yum -y install gcc
make

編譯成功後,你會得到一個名為wrk的可執行文件。為了能夠在任何目錄下運行wrk,你可以將其移動到系統的PATH環境變數中的某個目錄,或者直接將wrk的目錄添加到PATH環境變數中。如果你不確定如何操作,可以查閱相關的操作系統文檔。

在Linux系統中,你可以使用以下命令將wrk添加到PATH環境變數(假設你的當前用戶是user):

# 6. 創建軟連接, 方便全局調用
ln -s /usr/local/src/wrk/wrk /usr/local/bin

2.3 測試是否安裝成功

在使用 wrk 之前,你可以通過 wrk --help 命令來查看所有可用的命令行選項。這個命令會輸出 wrk 的使用說明和所有支持的參數。

三、wrk 命令基本使用

3.1 常用命令參數

  • -c, --connections: 每個線程建立的連接數(併發數)。預設值為 200。
  • -d, --duration: 測試持續時間,例如 2s2m2h。預設值為 10 秒。
  • -t, --threads: 用於執行測試的線程數。預設值為 2。
  • -s, --script: 指定一個 Lua 腳本來處理自定義請求或響應。
  • -H, --header: 添加 HTTP 請求頭,可以多次使用此參數來添加多個頭部。
  • --latency: 列印詳細的延遲統計信息。
  • --timeout: 設置請求超時時間,預設為無窮大。
  • --body: 指定請求體,可以是一個文件路徑或直接的數據。
  • --rate: 限制請求速率(每秒請求數),預設不限速。

3.2 執行測試

執行如下命令:

wrk -t1 -d1s -c2 -s ./scripts/wrk/signup.lua http://localhost:8080/users/signup

這個命令是使用 wrk 這個 HTTP 壓力測試工具來對本地主機上的一個用戶註冊介面進行測試。下麵是命令中每個部分的解釋:

  • wrk: 命令的名稱,表示執行 wrk 工具。
  • -t1: -t 選項後面跟著的 1 表示使用 1 個線程來進行測試。
  • -d1s: -d 選項後面跟著的 1s 表示測試的持續時間是 1 秒。
  • -c2: -c 選項後面跟著的 2 表示每個線程保持 2 個連接打開。
  • -s ./scripts/wrk/signup.lua: -s 選項後面跟著的路徑 ./scripts/wrk/signup.lua 表示載入一個 Lua 腳本,這個腳本用於自定義請求或處理響應。在這個例子中,腳本可能是用來模擬用戶註冊的請求。
  • http://localhost:8080/users/signup: 這是測試的目標 URL,即本地主機上的用戶註冊介面,監聽在 8080 埠。
    綜合來看,這個命令會使用 1 個線程在 1 秒內對 http://localhost:8080/users/signup 介面發起壓力測試,每個線程保持 2 個連接,並且使用 ./scripts/wrk/signup.lua 腳本來自定義請求的內容,可能是模擬用戶註冊的行為。

3.3 輸出結果

輸出結果如下:

Running 1s test @ http://localhost:8080/users/signup
  1 threads and 2 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    64.63ms  711.72us  67.28ms   90.00%
    Req/Sec    29.80     10.76    40.00     80.00%
  30 requests in 1.01s, 3.78KB read
Requests/sec:     29.81
Transfer/sec:      3.76KB

這個輸出是 wrk 執行完壓力測試後的統計結果。下麵是對每個部分的解釋:

  • Running 1s test @ http://localhost:8080/users/signup: 這行顯示的是測試的配置,包括測試持續時間(1秒)和測試的目標 URL(本地主機的用戶註冊介面)。
  • 1 threads and 2 connections: 這行顯示的是測試使用的線程數(1個線程)和每個線程建立的連接數(2個連接)。
  • Thread Stats: 這部分顯示的是線程級別的統計信息,包括平均延遲、延遲的標準差、最大延遲以及延遲分佈在平均值正負一個標準差內的百分比。
    • Avg: 平均延遲,這裡是 64.63 毫秒。
    • Stdev: 延遲的標準差,這裡是 711.72 微秒。
    • Max: 最大延遲,這裡是 67.28 毫秒。
    • +/- Stdev: 延遲分佈在平均值正負一個標準差內的百分比,這裡是 90.00%。
  • Req/Sec: 這部分顯示的是每秒請求數的統計信息,包括平均請求數、請求數的標準差、最大請求數以及請求數分佈在平均值正負一個標準差內的百分比。
    • Avg: 平均每秒請求數,這裡是 29.80。
    • Stdev: 每秒請求數的標準差,這裡是 10.76。
    • Max: 最大每秒請求數,這裡是 40.00。
    • +/- Stdev: 每秒請求數分佈在平均值正負一個標準差內的百分比,這裡是 80.00%。
  • 30 requests in 1.01s, 3.78KB read: 這行顯示的是在測試期間總共完成了 30 個請求,耗時 1.01 秒,讀取了 3.78KB 的數據。
  • Requests/sec: 這顯示的是平均每秒完成的請求數,這裡是 29.81。
  • Transfer/sec: 這顯示的是平均每秒讀取的數據量,這裡是 3.76KB。
    總結來說,這個測試在 1 秒內使用 1 個線程和 2 個連接對本地主機的用戶註冊介面進行了壓力測試,平均每秒可以完成大約 29.81 個請求,平均延遲大約為 64.63 毫秒。
分享是一種快樂,開心是一種態度!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 枚舉好用嗎? 數據字典型欄位,枚舉比Integer好: 限定值,只能賦值枚舉的那幾個實例,不能像Integer隨便輸,保存和查詢的時候特別有用 含義明確,使用時不需要去查數據字典 顯示值跟存儲值直接映射,不需要手動轉換,比如1在頁面上顯示為啟用,0顯示禁用,枚舉定義好可以直接顯示 基於enum可 ...
  • 本文基於 OpenJDK17 進行討論 在 JDK NIO 針對堆外記憶體的分配場景中,我們經常會看到 System.gc 的身影,比如當我們通過 FileChannel#map 對文件進行記憶體映射的時候,如果 JVM 進程虛擬記憶體空間中的虛擬記憶體不足,JVM 在 native 層就會拋出 OutOf ...
  • 問題描述 問題和 unordered_set 有關,相關代碼如下: //列印unordered_set的所有值 void printSet(const std::unordered_set<std::string> &data) { int index = 0; auto it = data.beg ...
  • 本文介紹在Anaconda環境下,安裝Python讀取.xls格式表格文件的庫xlrd的方法。 xlrd是一個用於讀取Excel文件的Python庫,下麵是xlrd庫的一些主要特點和功能: 讀取Excel文件:xlrd可以打開和讀取Excel文件,並提取其中的數據和元數據。 支持多種數據類型:xlr ...
  • 很長時間沒做,忙於考研和實習,久違的的拾起了演算法。做了很長時間,其實總體思路還是很簡單的,但滿分不知道為什麼就是到不了,又因為網上很多答案包括柳神的都是c++,無法參透,姑且只能這樣了。 Given a pair of positive integers, for example, 6 and 11 ...
  • 目錄log 日誌庫標準簡單示例使用方法庫的開發者應用開發者日誌庫開發者使用 log4rs添加依賴配置文件運行項目參考文章 log 日誌庫標準 log 是 Rust 的日誌門面庫,由官方積極維護可以放心使用。它是Rust的日誌門面,相應的日誌 API 已成為事實上的標準被其它日誌框架所使用,有了日誌門 ...
  • 當我們的項目中引入了 Shiro 後,帶有中文的請求路徑會被攔截並返回 400 的錯誤。一般我們的請求路徑是不會帶有中文字元,但當我們訪問靜態資源時那些文件是有可能是中文名稱的。 ...
  • 拓展閱讀 RSS 一種簡潔優雅的數據訂閱方式 RSSHub Everything is RSSible 開源、易於使用且可擴展的 RSS 提要生成器 RSS 介紹 RSS(Really Simple Syndication)是一種用於發佈網站更新的標準格式。 它允許用戶獲取網站內容的最新更新,而無需 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...