新聞中心
在上篇文章 每個(gè)后端都應(yīng)該了解的OpenResty入門以及網(wǎng)關(guān)安全實(shí)戰(zhàn) 中,我向大家介紹了 OpenResty 的入門使用是 WAF 防御實(shí)戰(zhàn),這篇文章將給大家繼續(xù)介紹 OpenResty 入門之性能測(cè)試 篇。

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),錫林浩特網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:錫林浩特等地區(qū)。錫林浩特做網(wǎng)站價(jià)格咨詢:18980820575
性能測(cè)試是軟件開發(fā)中不可或缺的一環(huán),它可以幫助我們?cè)u(píng)估系統(tǒng)的性能、穩(wěn)定性、可擴(kuò)展性等指標(biāo),為優(yōu)化和改進(jìn)提供依據(jù)。但是性能測(cè)試也是最容易失準(zhǔn)的一種測(cè)試,因?yàn)樗艿胶芏嘁蛩氐挠绊懀缇W(wǎng)絡(luò)環(huán)境、服務(wù)器配置、壓測(cè)工具、壓測(cè)場(chǎng)景等。如果我們選擇了不合適的壓測(cè)工具或者沒有設(shè)計(jì)好壓測(cè)場(chǎng)景,那么我們得到的結(jié)果可能會(huì)與實(shí)際情況相差甚遠(yuǎn),甚至導(dǎo)致錯(cuò)誤的判斷和決策。
俗話說(shuō)工欲善其事必先利其器,那么如何選擇一款合適的壓測(cè)工具呢?首先 OpenResty 是 fork 自 Nginx 開發(fā),基于 Nginx 原有的強(qiáng)悍性能(協(xié)程 + IO 多路復(fù)用 Epoll),其性能也很高。所以我們需要的是一款自身性能足夠強(qiáng)悍,可以最大程度榨干 OpenResty 程序性能、服務(wù)端 cpu 資源的壓測(cè)工具。
這里給大家介紹一款壓測(cè)工具界的“悍馬” —— wrk。wrk 是一款針對(duì) HTTP 協(xié)議的基準(zhǔn)測(cè)試工具,它能夠在單機(jī)多核 CPU 的條件下,使用系統(tǒng)自帶的高性能 I/O 機(jī)制,如 epoll,kqueue 等,通過(guò)多線程和事件模式,對(duì)目標(biāo)機(jī)器產(chǎn)生大量的負(fù)載。wrk 支持 Lua 腳本來(lái)創(chuàng)建復(fù)雜的測(cè)試場(chǎng)景(這一點(diǎn)與 OpenResty 支持 Lua 腳本相同),也可以輸出詳細(xì)的響應(yīng)時(shí)間統(tǒng)計(jì)信息。wrk 的優(yōu)點(diǎn)有以下幾點(diǎn):
- 高性能:wrk 可以利用多核 CPU 的并行計(jì)算能力,同時(shí)使用多個(gè)線程和連接來(lái)發(fā)送請(qǐng)求,并且使用高效的 I/O 模型來(lái)處理響應(yīng)。這樣 wrk 可以在單機(jī)上產(chǎn)生高達(dá)數(shù)十萬(wàn)甚至數(shù)百萬(wàn)級(jí)別的 QPS(每秒請(qǐng)求數(shù)),遠(yuǎn)超過(guò)其他常見的壓測(cè)工具,如 ab、siege、jmeter 等。
- 靈活:wrk 支持使用 Lua 腳本來(lái)定制壓測(cè)場(chǎng)景,例如自定義 HTTP 方法、動(dòng)態(tài)生成請(qǐng)求參數(shù)、修改請(qǐng)求頭等。這樣我們可以模擬各種復(fù)雜和真實(shí)的用戶行為和業(yè)務(wù)邏輯,使得壓測(cè)結(jié)果更加貼近實(shí)際情況。
- 簡(jiǎn)潔:wrk 的安裝和使用都非常簡(jiǎn)單,只需要幾條命令就可以完成。wrk 的輸出也非常清晰和直觀,可以顯示每個(gè)線程和總體的響應(yīng)時(shí)間和每秒請(qǐng)求數(shù),并且可以打印出響應(yīng)時(shí)間的分布情況,方便我們分析系統(tǒng)的性能瓶頸。
wrk 的安裝
wrk 只能被安裝在類 Unix 系統(tǒng)上,所以我們需要一個(gè) Linux 或者 MacOS 環(huán)境。Windows 10 安裝需要開啟自帶的 Ubuntu 子系統(tǒng)。
Linux 安裝
對(duì)于 Ubuntu/Debian 系統(tǒng),可以通過(guò)以下命令安裝 wrk:
sudo apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 將可執(zhí)行文件移動(dòng)到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin對(duì)于 CentOS / RedHat / Fedora 系統(tǒng),可以通過(guò)以下命令安裝 wrk:
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 將可執(zhí)行文件移動(dòng)到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin
MacOS 安裝
Mac 系統(tǒng)也可以通過(guò)先編譯的方式來(lái)安裝,但是更推薦使用 brew 的方式來(lái)安裝, 步驟如下:
- 安裝 Homebrew,安裝方式參考官網(wǎng) https://brew.sh (也就一行命令的事);
- 安裝 wrk: brew install wrk;
Windows 10 安裝
Windown 10 需要在 Windows 功能 里勾選 適用于 Linux 的 Windows 子系統(tǒng), 然后通過(guò) bash 命令切換到 Ubuntu 子系統(tǒng)。接下來(lái),參考 Linux 安裝 的操作步驟,安裝 wrk。
壓測(cè)前準(zhǔn)備
在開始?jí)簻y(cè)前,我們還需要對(duì)測(cè)試環(huán)境進(jìn)行一番調(diào)整,已配合壓測(cè)工具 wrk 榨干 OpenResty 程序的性能。
單進(jìn)程最大文件數(shù)
Linux 系統(tǒng)默認(rèn)對(duì)每個(gè)進(jìn)程能夠打開的文件數(shù)有一個(gè)限制,通常是 1024 個(gè)。這個(gè)限制會(huì)影響到服務(wù)器能夠同時(shí)處理的連接數(shù),因此需要增加這個(gè)限制。增加的方法是修改 /etc/security/limits.conf 文件,添加如下內(nèi)容:
* soft nofile 65535
* hard nofile 65535其中 * 號(hào)表示修改所有用戶的限制,soft 或 hard 指定要修改軟限制還是硬限制,65536 則指定了想要修改的新的限制值,即最大打開文件數(shù)(請(qǐng)注意軟限制值要小于或等于硬限制)。修改完后保存文件。
這樣就可以將所有用戶的單進(jìn)程最大打開文件數(shù)限制設(shè)為 65535 個(gè)。如果還不夠,可以繼續(xù)增大這個(gè)值,但要注意不要超過(guò)系統(tǒng)級(jí)的最大打開文件數(shù)限制,可以通過(guò) cat /proc/sys/fs/file-max 命令查看這個(gè)限制。
最大打開文件數(shù)
查看 Linux 系統(tǒng)級(jí)的最大打開文件數(shù)限制,使用如下命令:
[root@VM-16-5-centos ~]# cat /proc/sys/fs/file-nr
2112 0 369508這里的最后一個(gè)數(shù)字,就是最大打開文件數(shù)。如果你的機(jī)器中這個(gè)數(shù)字比較小,那就需要修改 /etc/sysctl.conf 文件來(lái)增大:
fs.file-max = 1020000
net.ipv4.ip_conntrack_max = 1020000
net.ipv4.netfilter.ip_conntrack_max = 1020000修改完以后,還需要重啟系統(tǒng)服務(wù)來(lái)生效:
sysctl -p /etc/sysctl.conf
Nginx 工作進(jìn)程數(shù)量以及連接數(shù)
最后,我們還需要對(duì) Nginx 的配置文件做一些修改,如下:
# 配置工作進(jìn)程數(shù)量
worker_processes 1;
...
events {
# 單個(gè)工作進(jìn)程處理連接數(shù)量
worker_connections 1024;
}默認(rèn)情況下 Nginx 有 master 和 worker 兩種進(jìn)程,master 進(jìn)程用于管理 worker 進(jìn)程,worker 進(jìn)程用于處理外部請(qǐng)求也就是對(duì)外提供服務(wù)。
worker_processes 1 的配置說(shuō)明工作進(jìn)程數(shù)默認(rèn)為 1。在多核機(jī)器上我們可以設(shè)置為服務(wù)器 CPU 的核數(shù)以提升 Nginx 的連接處理數(shù)。
worker_connections 1024 的配置說(shuō)明單個(gè)進(jìn)程能處理的連接數(shù)量是 1024,在大壓力場(chǎng)景下,我們可以提升這個(gè)值,改為 10240。
最后,優(yōu)化的 Nginx 配置文件如下:
# 根據(jù)cpu核數(shù)自動(dòng)設(shè)置工作進(jìn)程數(shù)量
worker_processes auto;
...
events {
# 單個(gè)工作進(jìn)程處理連接數(shù)量
worker_connections 10240;
}
wrk 的使用
wrk 的基本用法是:
wrk 常用參數(shù)
wrk 支持以下常用參數(shù):
- -c, --connections
:指定要保持打開的連接數(shù); - -d, --duration
:指定壓測(cè)的持續(xù)時(shí)間; - -t, --threads
:指定要使用的線程數(shù); - -s, --script
:指定要加載的 Lua 腳本文件; - -H, --header
:指定要添加到請(qǐng)求中的 HTTP 頭; - --latency:指定要打印響應(yīng)時(shí)間統(tǒng)計(jì)信息;
- --timeout
:指定套接字/請(qǐng)求超時(shí)時(shí)間;
其中,數(shù)字參數(shù)可以使用 SI 單位(1k, 1M, 1G),時(shí)間參數(shù)可以使用時(shí)間單位(2s, 2m, 2h)。
壓測(cè)示例
現(xiàn)在我們要對(duì) OpenResty 程序的 hello 接口進(jìn)行壓測(cè),我們可以使用以下命令:
wrk -c 100 -d 30s -t 4 --latency http://121.4.xxx.xx/hello這條命令表示,利用 wrk 發(fā)起壓力測(cè)試,連接數(shù)為 100,線程數(shù)為 4,持續(xù) 10 秒,并打印響應(yīng)時(shí)間統(tǒng)計(jì)信息。
運(yùn)行后,我們可以看到以下輸出:
Running 30s test @ http://121.4.xxx.xx/hello
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 60.74ms 94.62ms 1.82s 88.81%
Req/Sec 710.91 118.29 1.02k 69.08%
Latency Distribution
50% 26.22ms
75% 32.99ms
90% 176.28ms
99% 475.41ms
84967 requests in 30.02s, 15.40MB read
Socket errors: connect 0, read 0, write 0, timeout 2
Requests/sec: 2829.91
Transfer/sec: 525.08KB我們可以從輸出中看到以下信息:
- 壓測(cè)的配置和目標(biāo)網(wǎng)址,
Running 30s test @ http://121.4.xxx.xx/hello
4 threads and 100 connections
- 每個(gè)線程的平均、標(biāo)準(zhǔn)差、最大和正負(fù)一個(gè)標(biāo)準(zhǔn)差占比的響應(yīng)時(shí)間(Latency),
Latency 60.74ms 94.62ms 1.82s 88.81%這個(gè)數(shù)據(jù)和 QPS 一樣重要,表示系統(tǒng)的響應(yīng)速度,這個(gè)值越小越好。
- 響應(yīng)時(shí)間的分布情況:即有多少比例的請(qǐng)求在某個(gè)時(shí)間內(nèi)完成,延時(shí)的分布百分比詳細(xì)打印也就是下面展示信息,
Latency Distribution
50% 26.22ms
75% 32.99ms
90% 176.28ms
99% 475.41ms
- 總的請(qǐng)求數(shù),
Requests/sec: 2829.91這個(gè)數(shù)據(jù)表示服務(wù)端每秒鐘處理了多少請(qǐng)求,這個(gè)值越大越好。
從這些信息中,我們可以看出 OpenResty 程序的性能還是很不錯(cuò)的,響應(yīng)時(shí)間都在幾毫秒級(jí)別,QPS 也很高。
鑒于我的 OpenResty 服務(wù)器配置只有 2核4g內(nèi)存5MB 帶寬,測(cè)試結(jié)果大家理性看待,歡迎大家自己測(cè)試。
Lua 腳本
wrk 支持使用 Lua 腳本來(lái)定制壓測(cè)場(chǎng)景,例如自定義 HTTP 方法、動(dòng)態(tài)生成請(qǐng)求參數(shù)、修改請(qǐng)求頭等。這樣,我們可以模擬各種復(fù)雜和真實(shí)的用戶行為和業(yè)務(wù)邏輯,使得壓測(cè)結(jié)果更加貼近實(shí)際情況。wrk 的源碼中提供了一些示例腳本,可以參考 https://github.com/wg/wrk/tree/master/scripts。
要使用 Lua 腳本,我們需要在命令行中指定 -s 參數(shù),并給出腳本文件的路徑。例如我們可以使用 post.lua 腳本來(lái)發(fā)送 POST 請(qǐng)求:
wrk -c 100 -d 10s -t 4 -s post.lua http://121.4.xxx.xx/hellopost.lua 的內(nèi)容如下:
wrk.method = "POST"
wrk.body = "name=tom"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"這樣,我們就可以模擬發(fā)送 POST 請(qǐng)求攜帶表單數(shù)據(jù)的場(chǎng)景。
一些常見問(wèn)題
如何選擇合適的參數(shù)?
wrk 的參數(shù)會(huì)影響壓測(cè)的結(jié)果,因此我們需要根據(jù)實(shí)際情況選擇合適的參數(shù)。一般來(lái)說(shuō),我們可以參考以下步驟:
- 先使用單線程不斷增加連接數(shù),直到 QPS(每秒請(qǐng)求數(shù))保持穩(wěn)定或響應(yīng)時(shí)間超過(guò)業(yè)務(wù)要求限制。在當(dāng)前數(shù)值取得單線程最優(yōu)連接數(shù)。
- 單個(gè)連接線程數(shù)保持不變,不斷增加線程數(shù)(建議到 CPU 核心數(shù)為止即可),直到整體出現(xiàn) QPS 水平。
- 如果 QPS 沒有出現(xiàn)隨著線程數(shù)增長(zhǎng)則是目標(biāo)服務(wù)器性能已經(jīng)達(dá)到瓶頸,wrk 單線程即可壓測(cè)出目標(biāo)機(jī)器最優(yōu) QPS 值。
- 如果 QPS 隨著線程數(shù)增長(zhǎng)則是 wrk 本機(jī)性能達(dá)到瓶頸,需要增加 wrk 機(jī)器數(shù)或者更換更高性能的 wrk 機(jī)器。
如何解決壓測(cè)過(guò)程中出現(xiàn)的錯(cuò)誤?
wrk 在壓測(cè)過(guò)程中可能會(huì)出現(xiàn)一些錯(cuò)誤,例如連接超時(shí)、連接拒絕、連接重置等。這些錯(cuò)誤可能是由于目標(biāo)服務(wù)器的性能不足、網(wǎng)絡(luò)環(huán)境不穩(wěn)定、防火墻限制等原因造成的。我們可以嘗試以下方法來(lái)解決或減少錯(cuò)誤:
- 調(diào)整 wrk 的參數(shù),例如減少連接數(shù)、增加超時(shí)時(shí)間等;
- 檢查目標(biāo)服務(wù)器的資源使用情況,例如 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等,優(yōu)化服務(wù)器的配置或擴(kuò)容服務(wù)器;
- 檢查網(wǎng)絡(luò)環(huán)境,例如帶寬、延遲、丟包等,優(yōu)化網(wǎng)絡(luò)設(shè)備或更換網(wǎng)絡(luò)線路;
- 檢查防火墻設(shè)置,例如端口開放、流量限制等,放開 wrk 的訪問(wèn)權(quán)限或關(guān)閉防火墻;
總結(jié)
wrk 在對(duì) OpenResty 程序的壓測(cè)過(guò)程中,不失所望表現(xiàn)出了強(qiáng)大壓測(cè)性能。希望通過(guò)本篇文章能讓大家對(duì) wrk 性能測(cè)試工具有一個(gè)較為全面的認(rèn)識(shí)。
分享名稱:壓測(cè)工具界的“悍馬”:wrk使用
分享地址:http://www.fisionsoft.com.cn/article/cdhdpho.html


咨詢
建站咨詢
