在上篇文章 每個后端都應(yīng)該了解的OpenResty入門以及網(wǎng)關(guān)安全實戰(zhàn) 中,我向大家介紹了 OpenResty 的入門使用是 WAF 防御實戰(zhàn),這篇文章將給大家繼續(xù)介紹 OpenResty 入門之性能測試 篇。
性能測試是軟件開發(fā)中不可或缺的一環(huán),它可以幫助我們評估系統(tǒng)的性能、穩(wěn)定性、可擴展性等指標(biāo),為優(yōu)化和改進(jìn)提供依據(jù)。但是性能測試也是最容易失準(zhǔn)的一種測試,因為它受到很多因素的影響,例如網(wǎng)絡(luò)環(huán)境、服務(wù)器配置、壓測工具、壓測場景等。如果我們選擇了不合適的壓測工具或者沒有設(shè)計好壓測場景,那么我們得到的結(jié)果可能會與實際情況相差甚遠(yuǎn),甚至導(dǎo)致錯誤的判斷和決策。
俗話說工欲善其事必先利其器,那么如何選擇一款合適的壓測工具呢?首先 OpenResty 是 fork 自 Nginx 開發(fā),基于 Nginx 原有的強悍性能(協(xié)程 + IO 多路復(fù)用 Epoll),其性能也很高。所以我們需要的是一款自身性能足夠強悍,可以最大程度榨干 OpenResty 程序性能、服務(wù)端 cpu 資源的壓測工具。
這里給大家介紹一款壓測工具界的“悍馬” —— wrk。wrk 是一款針對 HTTP 協(xié)議的基準(zhǔn)測試工具,它能夠在單機多核 CPU 的條件下,使用系統(tǒng)自帶的高性能 I/O 機制,如 epoll,kqueue 等,通過多線程和事件模式,對目標(biāo)機器產(chǎn)生大量的負(fù)載。wrk 支持 Lua 腳本來創(chuàng)建復(fù)雜的測試場景(這一點與 OpenResty 支持 Lua 腳本相同),也可以輸出詳細(xì)的響應(yīng)時間統(tǒng)計信息。wrk 的優(yōu)點有以下幾點:
wrk 只能被安裝在類 Unix 系統(tǒng)上,所以我們需要一個 Linux 或者 MacOS 環(huán)境。Windows 10 安裝需要開啟自帶的 Ubuntu 子系統(tǒng)。
對于 Ubuntu/Debian 系統(tǒng),可以通過以下命令安裝 wrk:
sudo apt-get install build-essential libssl-dev git -ygit clone https://github.com/wg/wrk.git wrkcd wrkmake# 將可執(zhí)行文件移動到 /usr/local/bin 位置sudo cp wrk /usr/local/bin
對于 CentOS / RedHat / Fedora 系統(tǒng),可以通過以下命令安裝 wrk:
sudo yum groupinstall 'Development Tools'sudo yum install -y openssl-devel gitgit clone https://github.com/wg/wrk.git wrkcd wrkmake# 將可執(zhí)行文件移動到 /usr/local/bin 位置sudo cp wrk /usr/local/bin
Mac 系統(tǒng)也可以通過先編譯的方式來安裝,但是更推薦使用 brew 的方式來安裝, 步驟如下:
Windown 10 需要在 Windows 功能 里勾選 適用于 Linux 的 Windows 子系統(tǒng), 然后通過 bash 命令切換到 Ubuntu 子系統(tǒng)。接下來,參考 Linux 安裝 的操作步驟,安裝 wrk。
在開始壓測前,我們還需要對測試環(huán)境進(jìn)行一番調(diào)整,已配合壓測工具 wrk 榨干 OpenResty 程序的性能。
Linux 系統(tǒng)默認(rèn)對每個進(jìn)程能夠打開的文件數(shù)有一個限制,通常是 1024 個。這個限制會影響到服務(wù)器能夠同時處理的連接數(shù),因此需要增加這個限制。增加的方法是修改 /etc/security/limits.conf 文件,添加如下內(nèi)容:
* soft nofile 65535* hard nofile 65535
其中 * 號表示修改所有用戶的限制,soft 或 hard 指定要修改軟限制還是硬限制,65536 則指定了想要修改的新的限制值,即最大打開文件數(shù)(請注意軟限制值要小于或等于硬限制)。修改完后保存文件。
這樣就可以將所有用戶的單進(jìn)程最大打開文件數(shù)限制設(shè)為 65535 個。如果還不夠,可以繼續(xù)增大這個值,但要注意不要超過系統(tǒng)級的最大打開文件數(shù)限制,可以通過 cat /proc/sys/fs/file-max 命令查看這個限制。
查看 Linux 系統(tǒng)級的最大打開文件數(shù)限制,使用如下命令:
[root@VM-16-5-centos ~]# cat /proc/sys/fs/file-nr2112 0 369508
這里的最后一個數(shù)字,就是最大打開文件數(shù)。如果你的機器中這個數(shù)字比較小,那就需要修改 /etc/sysctl.conf 文件來增大:
fs.file-max = 1020000net.ipv4.ip_conntrack_max = 1020000net.ipv4filter.ip_conntrack_max = 1020000
修改完以后,還需要重啟系統(tǒng)服務(wù)來生效:
sysctl -p /etc/sysctl.conf
最后,我們還需要對 Nginx 的配置文件做一些修改,如下:
# 配置工作進(jìn)程數(shù)量worker_processes 1;...events { # 單個工作進(jìn)程處理連接數(shù)量 worker_connections 1024;}
默認(rèn)情況下 Nginx 有 master 和 worker 兩種進(jìn)程,master 進(jìn)程用于管理 worker 進(jìn)程,worker 進(jìn)程用于處理外部請求也就是對外提供服務(wù)。
worker_processes 1 的配置說明工作進(jìn)程數(shù)默認(rèn)為 1。在多核機器上我們可以設(shè)置為服務(wù)器 CPU 的核數(shù)以提升 Nginx 的連接處理數(shù)。
worker_connections 1024 的配置說明單個進(jìn)程能處理的連接數(shù)量是 1024,在大壓力場景下,我們可以提升這個值,改為 10240。
最后,優(yōu)化的 Nginx 配置文件如下:
# 根據(jù)cpu核數(shù)自動設(shè)置工作進(jìn)程數(shù)量worker_processes auto;...events { # 單個工作進(jìn)程處理連接數(shù)量 worker_connections 10240;}
wrk 的基本用法是:
wrk <options> <url>
<options> 是一些可選的參數(shù),用來控制壓測的配置,<url> 是要壓測的目標(biāo)網(wǎng)址。
wrk 支持以下常用參數(shù):
其中,數(shù)字參數(shù)可以使用 SI 單位(1k, 1M, 1G),時間參數(shù)可以使用時間單位(2s, 2m, 2h)。
現(xiàn)在我們要對 OpenResty 程序的 hello 接口進(jìn)行壓測,我們可以使用以下命令:
wrk -c 100 -d 30s -t 4 --latency http://121.4.xxx.xx/hello
這條命令表示,利用 wrk 發(fā)起壓力測試,連接數(shù)為 100,線程數(shù)為 4,持續(xù) 10 秒,并打印響應(yīng)時間統(tǒng)計信息。
運行后,我們可以看到以下輸出:
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 2Requests/sec: 2829.91Transfer/sec: 525.08KB
我們可以從輸出中看到以下信息:
Running 30s test @ http://121.4.xxx.xx/hello 4 threads and 100 connections
Latency 60.74ms 94.62ms 1.82s 88.81%
這個數(shù)據(jù)和 QPS 一樣重要,表示系統(tǒng)的響應(yīng)速度,這個值越小越好。
Latency Distribution 50% 26.22ms 75% 32.99ms 90% 176.28ms 99% 475.41ms
Requests/sec: 2829.91
這個數(shù)據(jù)表示服務(wù)端每秒鐘處理了多少請求,這個值越大越好。
從這些信息中,我們可以看出 OpenResty 程序的性能還是很不錯的,響應(yīng)時間都在幾毫秒級別,QPS 也很高。
鑒于我的 OpenResty 服務(wù)器配置只有 2核4g內(nèi)存5MB 帶寬,測試結(jié)果大家理性看待,歡迎大家自己測試。
wrk 支持使用 Lua 腳本來定制壓測場景,例如自定義 HTTP 方法、動態(tài)生成請求參數(shù)、修改請求頭等。這樣,我們可以模擬各種復(fù)雜和真實的用戶行為和業(yè)務(wù)邏輯,使得壓測結(jié)果更加貼近實際情況。wrk 的源碼中提供了一些示例腳本,可以參考 https://github.com/wg/wrk/tree/master/scripts。
要使用 Lua 腳本,我們需要在命令行中指定 -s 參數(shù),并給出腳本文件的路徑。例如我們可以使用 post.lua 腳本來發(fā)送 POST 請求:
wrk -c 100 -d 10s -t 4 -s post.lua http://121.4.xxx.xx/hello
post.lua 的內(nèi)容如下:
wrk.method = "POST"wrk.body = "name=tom"wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
這樣,我們就可以模擬發(fā)送 POST 請求攜帶表單數(shù)據(jù)的場景。
wrk 的參數(shù)會影響壓測的結(jié)果,因此我們需要根據(jù)實際情況選擇合適的參數(shù)。一般來說,我們可以參考以下步驟:
wrk 在壓測過程中可能會出現(xiàn)一些錯誤,例如連接超時、連接拒絕、連接重置等。這些錯誤可能是由于目標(biāo)服務(wù)器的性能不足、網(wǎng)絡(luò)環(huán)境不穩(wěn)定、防火墻限制等原因造成的。我們可以嘗試以下方法來解決或減少錯誤:
wrk 在對 OpenResty 程序的壓測過程中,不失所望表現(xiàn)出了強大壓測性能。希望通過本篇文章能讓大家對 wrk 性能測試工具有一個較為全面的認(rèn)識。
本文鏈接:http://www.tebozhan.com/showinfo-26-14121-0.html壓測工具界的 “悍馬” :wrk 使用
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com