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

最近筆者繼續(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)到全棧工程師的蛻變肢娘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舆驶,隨后出現(xiàn)的幾起案子橱健,更是在濱河造成了極大的恐慌,老刑警劉巖沙廉,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拘荡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蓝仲,警方通過(guò)查閱死者的電腦和手機(jī)俱病,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袱结,“玉大人亮隙,你說(shuō)我怎么就攤上這事」讣校” “怎么了溢吻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)果元。 經(jīng)常有香客問(wèn)我促王,道長(zhǎng),這世上最難降的妖魔是什么而晒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任蝇狼,我火速辦了婚禮,結(jié)果婚禮上倡怎,老公的妹妹穿的比我還像新娘迅耘。我一直安慰自己,他們只是感情好监署,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布颤专。 她就那樣靜靜地躺著,像睡著了一般钠乏。 火紅的嫁衣襯著肌膚如雪栖秕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天晓避,我揣著相機(jī)與錄音簇捍,去河邊找鬼只壳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垦写,可吹牛的內(nèi)容都是我干的吕世。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梯投,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼命辖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起分蓖,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尔艇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后么鹤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體终娃,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蒸甜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棠耕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柠新,死狀恐怖窍荧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恨憎,我是刑警寧澤蕊退,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站憔恳,受9級(jí)特大地震影響瓤荔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钥组,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一输硝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧程梦,春花似錦腔丧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砾医。三九已至拿撩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間如蚜,已是汗流浹背压恒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工影暴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤吹,地道東北人犬第。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吝梅,于是被迫代替她去往敵國(guó)和親伦吠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妆兑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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