基於epoll的壓力測試指令碼

2021-09-06 08:44:56 字數 1931 閱讀 9833

基於epoll的壓力測試指令碼 | dcshi@唐品

好吧,我們開始之前,如果我們要用多程序來做,會怎麼來設計?

1)初始化需要完成的預定請求數n(n是使用者輸入的引數)requests

2)建立c(c是使用者輸入的引數)個worker程序(這裡worker程序與主程序是父子關係,這樣worker程序可以共享第乙個步驟建立的requests變數)

3)當乙個worker程序完成乙個請求以後,requests需要減一,這裡涉及到變數安全,我們一般加乙個鎖,常用訊號量(semaphore)

3.1)可能有同學對上面有不同想法,每個worerk程序完成乙個請求要用用一次semaphore效率很低,那樣換個思路,每個worker程序都要一定的任務(例如,一共要完成10w個請求,10個worker,每個worker完成1w個請求後退出),由主程序來監控剩餘的worker程序數目,如果為0,認為是所有請求完成。3和3.1的方案各有優缺,這裡不作點評。

今天主要介紹的是用epoll來完成壓力測試工作。

基於epoll而非多執行緒多程序,對於壓力測試,除網路io以外沒有任何的磁碟io等阻塞呼叫,個人認為用epoll完全可以模擬多程序的並發行為,而且實現更簡單.但也有潛在問題,由於指令碼是單程序模型,所以有可能測試指令碼比測試物件先達到測試瓶頸(一般是cpu)

**

流程圖:

指令碼執行選項

usage: benchmark [-h ] [-p ] [-c ] [-n ] [-k ]

-h server ip (default 127.0.0.1)

-p server port (default 5113)

-c number of parallel connections (default 5)

-n total number of requests (default 50)

-k keep alive or reconnect (default is reconnect)

執行結果

server:# ./benchmark -n 100

5 parallel clients

100 completed in 0 seconds

1% <= 6 milliseconds

5% <= 11 milliseconds

15% <= 12 milliseconds

34% <= 13 milliseconds

89% <= 17 milliseconds

94% <= 18 milliseconds

99% <= 21 milliseconds

100% <= 25 milliseconds

177.936 requests per second

指令碼介紹

1)對分包(收&發)進行了處理

2)對超時進行了處理

3)keepalive機制

4)使用者自定義併發數和請求數

5)請求耗時百分比統計

擴充套件性

考慮到擴充套件性,使用者只需要重新定義下面兩個函式即可。(組包和解包函式)

int encoderequest(char* data, unsigned &len);

int decoderesponse(char* data,unsigned len);

ex:int decoderesponse(char* data,unsigned len)

else if(len > 1)

else if(cmdlen > (int)len)

else if( *(ptr + cmdlen -1) != lastx)

}return 0;

}

epoll多路復用壓力測試

epoll相對於select poll效能優越相當之多,可以說是二者結合加強版本,我們可以設想一下,假如有100w個tcp連線,那麼每次有資料過來了,select poll都需要去從第乙個到最後乙個進行依次遍歷,而epoll會講佇列排序講發生事件放在前面,後面的就不用遍歷了,所以準確的說處理幾千的連...

快取的壓力測試指令碼

貼一段coherence壓力測試指令碼,在不需要部署web應用的情況下,直接在命令列進行壓力測試 測試指令碼啟動100個thread paralleltreadcount 然後每個thread執行500次 2000次讀和100次寫 這100個thread會直接壓到集群的其中乙個 節點上 proxy ...

基於websocket協議的壓力測試

最近客戶端實現了乙個基於websocket的訊息推送功能 長連線網路開關下發開後啟動,然後保持鏈結,每隔15分鐘發一次心跳包,伺服器有資料時直接下發生效,因此需要對伺服器進行壓測。本次通過寫python指令碼的方法模擬併發進行壓力測試,相關測試方法如下 websocket是一種在單個tcp連線上進行...