基於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連線上進行...