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
  • 隨著Aspire發佈preview5的發佈,Microsoft.Extensions.ServiceDiscovery隨之更新, 服務註冊發現這個屬於老掉牙的話題解決什麼問題就不贅述了,這裡主要講講Microsoft.Extensions.ServiceDiscovery(preview5)以及如何 ...
  • 概述:通過使用`SemaphoreSlim`,可以簡單而有效地限制非同步HTTP請求的併發量,確保在任何給定時間內不超過20個網頁同時下載。`ParallelOptions`不適用於非同步操作,但可考慮使用`Parallel.ForEach`,儘管在非同步場景中謹慎使用。 對於併發非同步 I/O 操作的數量 ...
  • 1.Linux上安裝Docken 伺服器系統版本以及內核版本:cat /etc/redhat-release 查看伺服器內核版本:uname -r 安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2 設置阿裡雲鏡像源:y ...
  • 概述:WPF界面綁定和渲染大量數據可能導致性能問題。通過啟用UI虛擬化、非同步載入和數據分頁,可以有效提高界面響應性能。以下是簡單示例演示這些優化方法。 在WPF中,當你嘗試綁定和渲染大量的數據項時,性能問題可能出現。以下是一些可能導致性能慢的原因以及優化方法: UI 虛擬化: WPF提供了虛擬化技術 ...
  • 引言 上一章節介紹了 TDD 的三大法則,今天我們講一下在單元測試中模擬對象的使用。 Fake Fake - Fake 是一個通用術語,可用於描述 stub或 mock 對象。 它是 stub 還是 mock 取決於使用它的上下文。 也就是說,Fake 可以是 stub 或 mock Mock - ...
  • 為.net6在CentOS7上面做準備,先在vmware虛擬機安裝CentOS 7.9 新建CentOS764位的系統 因為CentOS8不更新了,所以安裝7;簡單就一筆帶過了 選擇下載好的操作系統的iso文件,下載地址https://mirrors.aliyun.com/centos/7.9.20 ...
  • 經過前面幾篇的學習,我們瞭解到指令的大概分類,如:參數載入指令,該載入指令以 Ld 開頭,將參數載入到棧中,以便於後續執行操作命令。參數存儲指令,其指令以 St 開頭,將棧中的數據,存儲到指定的變數中,以方便後續使用。創建實例指令,其指令以 New 開頭,用於在運行時動態生成並初始化對象。方法調用指... ...
  • LiteDB 是一個輕量級的嵌入式 NoSQL 資料庫,其設計理念與 MongoDB 類似,但它是完全使用 C# 開發的,因此與 C# 應用程式的集成非常順暢。與 SQLite 相比,LiteDB 提供了 NoSQL(即鍵值對)的數據存儲方式,並且是一個開源且免費的項目。它適用於桌面、移動以及 We ...
  • 1 開源解析和拆分文檔 第三方的工具去對文件解析拆分,去將我們的文件內容給提取出來,並將我們的文檔內容去拆分成一個小的chunk。常見的PDF word mark down, JSON、HTML。都可以有很好的一些模塊去把這些文件去進行一個東西去提取。 優勢 支持豐富的文檔類型 每種文檔多樣化選擇 ...
  • OOM是什麼?英文全稱為 OutOfMemoryError(記憶體溢出錯誤)。當程式發生OOM時,如何去定位導致異常的代碼還是挺麻煩的。 要檢查OOM發生的原因,首先需要瞭解各種OOM情況下會報的異常信息。這樣能縮小排查範圍,再結合異常堆棧、heapDump文件、JVM分析工具和業務代碼來判斷具體是哪 ...