【技術(shù)筆記】簡述性能神器wrk的原理和實(shí)際案例中的運(yùn)用

最近筆者繼續(xù)研究性能測試領(lǐng)域,發(fā)現(xiàn)了一款性能神器wrk。大家可能都比較熟悉的是Loadrunner和Jmeter,但其實(shí)wrk也相當(dāng)好用。

什么是wrk?

這里有一段是來自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)測試工具,可以用來跑單個(gè)的多核CPU,可以形成很有效的負(fù)載。它將多線程設(shè)計(jì)與可伸縮的事件通知系統(tǒng),比如epoll和kQueue,結(jié)合在一起。

wrk的安裝

首先介紹一下wrk的安裝,在windows上安裝會比較麻煩,建議用Linux系統(tǒng)上安裝使用會非常簡便。筆者就以自己的騰訊云服務(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的使用說明上面可以看到:

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í)安裝開啟的核心非常簡單,只需要一個(gè)make命令就足夠了,是不是足夠簡單?

輸入:$ make

接下來就是漫長的編譯過程,編譯完后我們可以查看一下。

編譯完成后就是要安裝,最簡單的方式是拷貝到bin目錄來使用。

輸入:$ cp wrk/usr/local/bin/

但是我的系統(tǒng)說不允許這樣操作,有可能是騰訊云的服務(wù)器不允許我這樣操作。但接著他推薦了另一個(gè)方式,我們來試試。

輸入: $ sudo apt install wrk

看起來是成功執(zhí)行了,等穩(wěn)定下來之后我們來檢查下是否安裝成功了。

輸入:$ wrk

OK!安裝成功了!

簡述wrk的工作原理

wrk實(shí)際是用了一種叫做多路復(fù)用IO(IO multiplexing)的技術(shù)。IO multiplexing這個(gè)詞可能大家有點(diǎn)陌生,但是如果我說select/epoll,可能大家就沒那么陌生。有些地方也稱這種IO方式為事件驅(qū)動IO(event driven IO)。select/epoll的好處就在于單個(gè)process就可以同時(shí)處理多個(gè)網(wǎng)絡(luò)連接的IO。它的基本原理就是select/epoll這個(gè)function會不斷的輪詢所負(fù)責(zé)的所有socket,當(dāng)某個(gè)socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。

當(dāng)用戶進(jìn)程調(diào)用了select,那么整個(gè)進(jìn)程會被block,而同時(shí),kernel會“監(jiān)視”所有select負(fù)責(zé)的socket,當(dāng)任何一個(gè)socket中的數(shù)據(jù)準(zhǔn)備好了,select就會返回。這個(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)勢并不是對于單個(gè)連接能處理得更快,而是在于能處理更多的連接。在多路復(fù)用模型中,對于每一個(gè)socket,一般都設(shè)置成為non-blocking。

select的優(yōu)勢在于可以處理多個(gè)連接,不適用于單個(gè)連接。

wrk在實(shí)際案例中的運(yùn)用

wrk最主要有以下的三種命令用法:

-c: 表示總共的連接數(shù)

-d: 表示要運(yùn)行的測試時(shí)間

-t: 表示線程數(shù)

接下來我們進(jìn)行一個(gè)小小的案例展示,首先創(chuàng)建一個(gè)index.html文件,往里面寫一些內(nèi)容,形成一個(gè)簡單的網(wǎng)站,我用以下的命令實(shí)現(xiàn):

小網(wǎng)站創(chuàng)建完成后,查看一下我們的Linux系統(tǒng)的Python版本是多少,筆者的是2.x版本,所以要用以下命令,來啟動Python服務(wù):

如果是3.x版本,則要輸入以下命令:

$ python -m http.server 8888

同樣可以啟動Python服務(wù)。接下來我們另開一個(gè)終端,輸入以下命令:

這樣就成功訪問到了我們服務(wù)器下創(chuàng)建的index.html文件。接下來我們嘗試來用wrk來壓測這個(gè)服務(wù)器文件,輸入命令:

$ wrk -c20 -t2 -d10s http://localhost:8888/index.html

由于筆者的服務(wù)器是比較低端入門級的,所以不敢壓太狠,所以只建立了20個(gè)連接數(shù),2個(gè)線程數(shù),壓10秒,之后就可以在我們之前啟動Python服務(wù)那個(gè)終端看到壓測的過程。

壓測完成后,我們回到前一個(gè)終端,就可以看到測試數(shù)據(jù)已經(jīng)形成了:

我們可以看看這份迷你報(bào)告來進(jìn)行分析:

Latency是表示時(shí)延,Avg是它的平均值,Stdev是一個(gè)標(biāo)準(zhǔn)差,Max是最大值,+/- Stdev是標(biāo)準(zhǔn)差范圍,一般來說標(biāo)準(zhǔn)差的百分比越高,表示值和平均值的差不大,離散的也不會很大,表示Avg平均值還是相當(dāng)可信。

數(shù)據(jù)里主要看到QPS的值,這個(gè)核心數(shù)據(jù),我壓出來的結(jié)果是有點(diǎn)壓垮服務(wù)器了,1558.86應(yīng)該不算高的值,實(shí)在是硬件條件不高的服務(wù)器。那QPS就是通過requests/sec運(yùn)算來得出。

關(guān)于wrk的基本用法就介紹完了,更高級的玩法我們下次分解。


讀更多的好書,拍更美的照片,寫更酷的代碼,遇見更有趣的人,愿望是實(shí)現(xiàn)從IT菜鳥到全棧工程師的蛻變。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2018-11-06 這一塊操作系統(tǒng)主要分為兩個(gè)部分,一個(gè)部分是書本上操作系統(tǒng)的知識,還有一部門是linux的相關(guān)...
    zuoerfeng閱讀 2,389評論 0 1
  • 本文摘抄自linux基礎(chǔ)編程 IO概念 Linux的內(nèi)核將所有外部設(shè)備都可以看做一個(gè)文件來操作。那么我們對與外部設(shè)...
    VD2012閱讀 1,069評論 0 2
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口,提供良好的抽象接口。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對硬件...
    drfung閱讀 3,769評論 0 5
  • python之路——IO模型 IO模型介紹 為了更好地了解IO模型,我們需要事先回顧下:同步、異步、阻塞、非阻塞 ...
    go以恒閱讀 596評論 0 2
  • IO概念 Linux的內(nèi)核將所有外部設(shè)備都可以看做一個(gè)文件來操作。那么我們對與外部設(shè)備的操作都可以看做對文件進(jìn)行操...
    消失er閱讀 2,057評論 0 5

友情鏈接更多精彩內(nèi)容