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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...