一、前言linux
最近工做須要測試nginx反向代理的性能,因而找了一些http測試工具,例如經典的Apache的ab、siege、wrk。wrk使用多線程事件驅動方式,支持lua腳本擴展。關於wrk介紹能夠參考:https://github.com/wg/wrk。測試http的性能,主要關注的是QPS(每秒處理的請求數目),QPS越高說明web站點的性能越好。測試這個參數,就須要工具可以發生多個鏈接。涉及到網絡編程的一些知識,如何同時使用connect創建多個鏈接,如何控制connect超時,如何判斷fd可讀仍是可寫。linux網絡套接字默認都是阻塞的,使用阻塞的套接字很難實現大量的請求,須要使用非阻塞,快速建立鏈接,輪詢鏈接的狀態來出來網絡事件。nginx
本身對這些地方不求甚解,若有藉此機會分析一下wrk的源碼,如何發送大量的併發鏈接,學習一下常見的網絡編程框架。git
二、wrk的基本介紹github
wrk支持多線程,每一個線程之間是獨立的,線程中使用經典的事件驅動模型來建立鏈接、處理鏈接,wrk支持參數配置,主要是參數以下:web
wrk使用以下:redis
三、wrk使用技術介紹編程
wrk是一個典型的linux客戶端網絡程序,可以建立和處理大量的併發鏈接,使用的技術有多線程,網絡編程、http協議解析、ssl協議,lua腳本引擎。wrk使用了redis的事件驅動庫,關於事件驅動模型(通常是由事件收集器、事件發送器和事件處理器三部分組成基本單元組成),能夠參考:https://gist.github.com/jcouyang/9914091服務器
事件驅動模型是爲了解決傳統服務器與網絡工做負載的需求的不匹配,實現高度可伸縮服務器,並下降內存開銷。事情驅動模型更改了鏈接到服務器的方式。全部的鏈接都由事件循環管理,每一個鏈接觸發一個在事件循環進程中運行的事件,而不是爲每一個鏈接生成一個新的 OS 線程,併爲其分配一些配套內存。所以不用擔憂出現死鎖,並且不會直接調用阻塞資源,而採用異步的方式來實現非阻塞式I/O。經過事件驅動模型是的在相同配置的服務器能接受更多的併發請求,實現可伸縮的服務器。網絡
接下來須要深刻學習這個地方。多線程