由於興趣自己業余時間一直在搞.net下面的通訊應用,mono的存在得以讓.NET程序輕松運行在Linux之下.不過經過多嘗試Socket相關功能在Mono下的表現並不理想.不管性能還是吞吐能力方面離我想要的有比較大的差距.最后一次在2.10.x下測試情況下也比失望,主要是在連接數多數據交互量大的情況下會導致異步send操作雖然成功但會存在數據發送不出去的情況,這情況在應用中顯然是不允許發生的;雖然發送可以用同步解決,但連接多的情況同步顯然容易導致其他連接處理上存在延時,最終打消了在Mono做通訊的想法.
最近Mono發布了新的版3.2.3看了一下感覺不錯,順便也下載了mono的源代碼下來看了一下
// Actual send() done in the runtime if (result.error == 0) { UpdateSendValues (result.Total); if (result.Sock.disposed) { result.Complete (); return; } if (result.Size > 0) { Socket.socket_pool_queue (Worker.Dispatcher, result); return; // Have to finish writing everything. See bug #74475. } result.Total = send_so_far; send_so_far = 0; } result.Complete ();
發現早期版本SocketAsyncEventArgs存在發送不完整需要自己處理的情況在現有版本代碼已經解決,於是就又提起對mono的興趣.
這次裝了mono 3.2.3進行了一個簡單的持久壓力測試,的確之前碰到有個別情況數據沒發送出去的問題已經解決了.雖然性能和WINDOWS下比起來還有段距離,不過總的來說還可以接受.以下是測試截圖.
測試大概是在1K個連接的基礎上進行了大概2億次的數據交互,每秒的請求交互量大概在1w左右. 測試服務端配置:
cpu:一個核的虛機 操作系統:Centos 6.5 64 內存:1G mono 3.2.3
在整個測試過程CPU大概占用了60-70之間.從測試結果來看,mono這版的socket處理能力還算可以接受的,希望mono團隊在下個版本做得更出色.