前段時間本着練習angularJS+requireJS的目的寫了一個基於nodeJS和socket.io的聊天室,github地址為:https://github.com/towersxu/node-socketIO-angular-require-chatroom。當時沒有考慮性能方面的問題,本着功能實現的目的就好。最近剛好有空,打算測試一下這個聊天室的性能。
測試工具我使用的是JMeter,版本為2.11。這個是同事拷貝給我的綠色版本。只要有Java環境就可以運行(下載地址:apache-jmeter-2.11)。點擊bin目錄下的jmeter.bat就可以運行了。我這個版本本身是不支持websocket測試的,於是需要下載一個插件叫做JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar,這個插件需要下載6個依賴包,如下圖所示:
在插件安裝好了后,就可以使用jmeter來模擬socket.io的通信了。首先打開chrome控制台,查看network。進入含有socket.io的頁面時,我們可以看到如下圖所示的幾個鏈接。
我們只需要把這幾個鏈接用jmeter實現了,就可以模擬瀏覽器和服務器的通信了。首先我們模擬前兩個請求。點擊請求我們可以看到這個請求的詳細信息,從header上我們可以發現其實這兩個請求還是HTTP請求,只不過帶的參數不一樣。第二個請求比第一個請求多帶一個參數叫sid,他的值是第一個請求所相應的。這兩個請求我們可以看做是TCP中的1次握手過程(我不懂TCP的三次握手,感覺這個應該和它差不多)或者說是一次認證,這個sid就是通信的唯一標識。下面我要使用jmeter模擬這兩個請求。在線程組的sampler里面選擇HTTP請求。如下圖所示:
第一個請求(注意,上面圖片路徑應該為/socket.io/?EIO=3&transport=polling 少了個問號==!)
第二個請求注意,上面圖片路徑應該為/socket.io/?EIO=3&transport=polling 少了個問號==!
注意第二個請求中的${sid},這個是在第一個請求里面獲取的,所有需要在第一個請求里面增加一個后置處理器-->正則表達式提取器。
現在我到chrome里面查看第3個請求的詳細信息,我們可以發現,第三個請求的URL變成了ws,參數transport也變成了websocket。並且多了一個frames欄目。Frames如下圖所示:
現在我們新建一個Websocket sampler來模擬socket鏈接。並發送2probe給服務器:
添加一個觀察結果樹,運行就可以看到請求的結果,相應數據為3probe
后面我們繼續模擬socket.io的后續鏈接,也就是Frams里面的綠色部分,而白色部分就是服務器的響應。注意,最后要使用循環控制器間隔發送2給服務器保持連接。我的整個流程如下(上面下載的jmeter的example文件夾中的room-chat-test-010.jxm):
當然最后的測試結果就不說了,同時加入300個用戶就掛了。話說有沒有人知道怎么模擬1秒鍾加入100個人?我想測試加入5000人,分為50秒加入。求留言,地址為:http://www.cnblogs.com/towersxu/p/4568254.html