由於興趣自己業餘時間一直在搞.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團隊在下個版本做得更出色.