項目地址 : https://github.com/kelin-xycs/Socket-Vs-WebSocket-TestTool
Socket-Vs-WebSocket-TestTool
一個用 C# 寫的 Socket 和 WebSocket 性能測試工具
這個項目不是計划內的 。 我要 呵呵 了 。 因為 QQ 群里有網友提到 “WebSocket 的效率比 Socket 低” , 所以就想看一下實際情況到底怎么樣 。
解決方案 里 包含 4 個項目, SocketTest , SocketTestTool , WebSocketTest , WebSocketTestTool 。
SocketTest : Socket 測試的服務器端
SocketTestTool : Socket 並發測試工具
WebSocket : WebSocket 測試的服務器端
WebSocketTestTool : WebSocket 並發測試工具
測試原理 : 測試工具發送 2 Byte 的數據 “aa” 到 服務器端 , 服務器端收到數據后回發這 2 Byte 的數據給測試工具,測試工具接收到回發數據算一次請求完成 。 本次請求完成后才會發出下一次請求 。
測試結果 :
Socket : 每秒請求數最高可達到 25000 , CPU 占用率 : 測試工具 15% , 服務器端 22% , System進程 27%
WebSocket : 每秒請求數最高可達 7500 - 8000 , CPU 占用率 : 測試工具 30% , 服務器端 48% , System進程 7%
注 : System 進程 應該就是 Win Socket 工作線程所在的進程 。
從這組測試數據看起來 , WebSocket 的效率大概是 Socket 的 1/3 - 1/4 之間 。
有一個現象值得注意 : 在測試中 , Socket 組 的 CPU 占用率普遍低於 WebSocket 組 , 還有一點 , Socket 測試中 CPU 占用率最高的是 System 進程 , 而 WebSocket 測試中 CPU 占用率 最高的是 服務器端 進程 , 並且 System 進程的 CPU 占用率 最低 和 很低 。
好的 , 上面是測試結果 。
下面對 測試工具 和 服務器端 程序作一些說明 :
WebSocketTest.exe 需要 “以管理員身份運行” , 不然會報 “拒絕訪問” 的異常 。
測試工具 界面上有一個 文本框 “連接數” , 默認值 是 800 。
還有一個 文本框 “線程數” , 這個文本框的默認值是 4 , “線程數” 的 意思是 用於發送測試請求 的 線程數 ,通常設定為和 CPU 的 核數 相同即可 (可以把 虛擬線程(超線程) 算進去) 。 發送請求的線程數太多的話 , 會占用過多的 CPU 資源 , 同時 測試表現 會下降 。
還有一個 文本框 “發送內容” , 默認值是 “aa” , 目前 服務器端 的 程序 寫死只接收 2 Byte 的數據 , 如果要發送更長的內容 , 服務器端 程序 需要相應的作一些修改 , 不然超出 2 Byte 的數據會在 Socket 和 WebSocket 的 緩沖區 里 堆積 起來 。
這次還發現了一些有趣的東西 :
async await 有些雞肋 。 Thread , Monitor , Task , Task.Wait() 可以很好的完成 異步工作 。 async await 增加了 語言 的 復雜性 和 目標代碼 的 復雜性 。 希望通過 async 一個 關鍵字 就能使一個 普通方法 變成 異步方法 , 這個想法很好 。 通過 await 來完成 等待異步調用 的 設計也很好 。 但 async 和 await 兩者 應該可以單獨使用 , 彼此之間不必有關聯 。 這樣的話 , 用 async 關鍵字就可以很容易的使一個方法變成 異步方法 , 而用 await 也可以很方便的 等待 異步方法 的 調用 。 兩者之間不必有什么關聯 。 實際上 , async await 要解決的 ,或者說 適合解決 的 一個場景 是 AJAX 里 充滿異步調用 的 場景 。 在 AJAX 里 , 幾乎每個事件都有 異步調用 , 每個 事件函數 都 對應 回調函數 , 只要有和服務器的交互的話 。 async await 可以來解決這樣的場景 。 讓 AJAX 事件函數里訪問服務器的 WebApi 和 后端代碼里訪問 數據庫 一樣 , 同步執行 , 順序執行 。 但 async await 之間不必有關聯 。 實際上 , async 方法里 必須 有 await 正是 async await 的 敗筆 所在 。
從這個項目中 , 我們再次體會到 , 測試 是 一個 專業 , 是 和 開發 不可分割 的 一部分 , 和 開發 一起組成 軟件生產力 。 測試 是 DevOps 的 主干力量 。