最近筆者繼續(xù)研究性能測(cè)試領(lǐng)域楞黄,發(fā)現(xiàn)了一款性能神器wrk。大家可能都比較熟悉的是Loadrunner和Jmeter抡驼,但其實(shí)wrk也相當(dāng)好用。
什么是wrk肿仑?
這里有一段是來(lái)自GitHub的wrk項(xiàng)目的介紹英文原話:
wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scalable event notification systems such as epoll and kqueue.
大概意思就是wrk是一個(gè)基于HTTP的基準(zhǔn)測(cè)試工具致盟,可以用來(lái)跑單個(gè)的多核CPU,可以形成很有效的負(fù)載尤慰。它將多線程設(shè)計(jì)與可伸縮的事件通知系統(tǒng)馏锡,比如epoll和kQueue,結(jié)合在一起伟端。
wrk的安裝
首先介紹一下wrk的安裝杯道,在windows上安裝會(huì)比較麻煩,建議用Linux系統(tǒng)上安裝使用會(huì)非常簡(jiǎn)便责蝠。筆者就以自己的騰訊云服務(wù)器為例党巾,進(jìn)行了一次安裝。
我們可以在全球最大同性交友網(wǎng)站找到wrk的源碼和地址霜医, 然后復(fù)制上面的地址齿拂,拷貝到我們的Linux系統(tǒng)上。
在命令行上輸入命令:$git clone?https://github.com/wg/wrk.git
這樣就在我們的系統(tǒng)上拷貝了一份安裝和源碼備份肴敛,接著我們進(jìn)入到新創(chuàng)建的wrk目錄署海。
輸入:$ cd wrk
然后我們可以從GitHub的wrk的使用說(shuō)明上面可以看到:
wrk should build on most UNIX-like operating systems and architectures that have GNU make and are supported by LuaJIT and OpenSSL. Some systems may require additional CFLAGS or LDFLAGS, see the top of the Makefile for examples, in many cases simply running `make` (often `gmake` on *BSD) will do the trick.
其實(shí)安裝開(kāi)啟的核心非常簡(jiǎn)單吗购,只需要一個(gè)make命令就足夠了,是不是足夠簡(jiǎn)單砸狞?
輸入:$ make
接下來(lái)就是漫長(zhǎng)的編譯過(guò)程捻勉,編譯完后我們可以查看一下。
編譯完成后就是要安裝刀森,最簡(jiǎn)單的方式是拷貝到bin目錄來(lái)使用踱启。
輸入:$ cp wrk/usr/local/bin/
但是我的系統(tǒng)說(shuō)不允許這樣操作,有可能是騰訊云的服務(wù)器不允許我這樣操作撒强。但接著他推薦了另一個(gè)方式禽捆,我們來(lái)試試。
輸入: $ sudo apt install wrk
看起來(lái)是成功執(zhí)行了飘哨,等穩(wěn)定下來(lái)之后我們來(lái)檢查下是否安裝成功了胚想。
輸入:$ wrk
OK!安裝成功了芽隆!
簡(jiǎn)述wrk的工作原理
wrk實(shí)際是用了一種叫做多路復(fù)用IO(IO multiplexing)的技術(shù)浊服。IO multiplexing這個(gè)詞可能大家有點(diǎn)陌生,但是如果我說(shuō)select/epoll胚吁,可能大家就沒(méi)那么陌生牙躺。有些地方也稱(chēng)這種IO方式為事件驅(qū)動(dòng)IO(event driven IO)。select/epoll的好處就在于單個(gè)process就可以同時(shí)處理多個(gè)網(wǎng)絡(luò)連接的IO腕扶。它的基本原理就是select/epoll這個(gè)function會(huì)不斷的輪詢所負(fù)責(zé)的所有socket孽拷,當(dāng)某個(gè)socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程半抱。
當(dāng)用戶進(jìn)程調(diào)用了select脓恕,那么整個(gè)進(jìn)程會(huì)被block,而同時(shí)窿侈,kernel會(huì)“監(jiān)視”所有select負(fù)責(zé)的socket炼幔,當(dāng)任何一個(gè)socket中的數(shù)據(jù)準(zhǔn)備好了,select就會(huì)返回史简。這個(gè)時(shí)候用戶進(jìn)程再調(diào)用read操作乃秀,將數(shù)據(jù)從kernel拷貝到用戶進(jìn)程。
要注意的是圆兵,如果處理的連接數(shù)不是很高的話跺讯,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延遲還更大衙傀。select/epoll的優(yōu)勢(shì)并不是對(duì)于單個(gè)連接能處理得更快抬吟,而是在于能處理更多的連接。在多路復(fù)用模型中统抬,對(duì)于每一個(gè)socket火本,一般都設(shè)置成為non-blocking危队。
select的優(yōu)勢(shì)在于可以處理多個(gè)連接,不適用于單個(gè)連接钙畔。
wrk在實(shí)際案例中的運(yùn)用
wrk最主要有以下的三種命令用法:
-c: 表示總共的連接數(shù)
-d: 表示要運(yùn)行的測(cè)試時(shí)間
-t: 表示線程數(shù)
接下來(lái)我們進(jìn)行一個(gè)小小的案例展示茫陆,首先創(chuàng)建一個(gè)index.html文件,往里面寫(xiě)一些內(nèi)容擎析,形成一個(gè)簡(jiǎn)單的網(wǎng)站簿盅,我用以下的命令實(shí)現(xiàn):
小網(wǎng)站創(chuàng)建完成后,查看一下我們的Linux系統(tǒng)的Python版本是多少揍魂,筆者的是2.x版本桨醋,所以要用以下命令,來(lái)啟動(dòng)Python服務(wù):
如果是3.x版本现斋,則要輸入以下命令:
$ python -m http.server 8888
同樣可以啟動(dòng)Python服務(wù)喜最。接下來(lái)我們另開(kāi)一個(gè)終端,輸入以下命令:
這樣就成功訪問(wèn)到了我們服務(wù)器下創(chuàng)建的index.html文件庄蹋。接下來(lái)我們嘗試來(lái)用wrk來(lái)壓測(cè)這個(gè)服務(wù)器文件瞬内,輸入命令:
$ wrk -c20 -t2 -d10s http://localhost:8888/index.html
由于筆者的服務(wù)器是比較低端入門(mén)級(jí)的,所以不敢壓太狠限书,所以只建立了20個(gè)連接數(shù)虫蝶,2個(gè)線程數(shù),壓10秒倦西,之后就可以在我們之前啟動(dòng)Python服務(wù)那個(gè)終端看到壓測(cè)的過(guò)程能真。
壓測(cè)完成后,我們回到前一個(gè)終端扰柠,就可以看到測(cè)試數(shù)據(jù)已經(jīng)形成了:
我們可以看看這份迷你報(bào)告來(lái)進(jìn)行分析:
Latency是表示時(shí)延舟陆,Avg是它的平均值,Stdev是一個(gè)標(biāo)準(zhǔn)差耻矮,Max是最大值,+/- Stdev是標(biāo)準(zhǔn)差范圍忆谓,一般來(lái)說(shuō)標(biāo)準(zhǔn)差的百分比越高裆装,表示值和平均值的差不大,離散的也不會(huì)很大倡缠,表示Avg平均值還是相當(dāng)可信哨免。
數(shù)據(jù)里主要看到QPS的值,這個(gè)核心數(shù)據(jù)昙沦,我壓出來(lái)的結(jié)果是有點(diǎn)壓垮服務(wù)器了琢唾,1558.86應(yīng)該不算高的值,實(shí)在是硬件條件不高的服務(wù)器盾饮。那QPS就是通過(guò)requests/sec運(yùn)算來(lái)得出采桃。
關(guān)于wrk的基本用法就介紹完了懒熙,更高級(jí)的玩法我們下次分解。
讀更多的好書(shū)普办,拍更美的照片工扎,寫(xiě)更酷的代碼,遇見(jiàn)更有趣的人衔蹲,愿望是實(shí)現(xiàn)從IT菜鳥(niǎo)到全棧工程師的蛻變肢娘。