項目地址 : https://github.com/kelin-xycs/Socket-Vs-WebSocket-TestToolgit
一個用 C# 寫的 Socket 和 WebSocket 性能測試工具github
這個項目不是計劃內的 。 我要 呵呵 了 。 由於 QQ 羣裏有網友提到 「WebSocket 的效率比 Socket 低」 , 因此就想看一下實際狀況到底怎麼樣 。數據庫
解決方案 裏 包含 4 個項目, SocketTest , SocketTestTool , WebSocketTest , WebSocketTestTool 。後端
SocketTest : Socket 測試的服務器端服務器
SocketTestTool : Socket 併發測試工具併發
WebSocket : WebSocket 測試的服務器端異步
WebSocketTestTool : WebSocket 併發測試工具async
測試原理 : 測試工具發送 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 的 主幹力量 。