我想優化TCP套接字包裝物,有很多的入站連接的掙扎。我在一個基本的聊天服務器和一個小客戶端應用程序中測試它,以便將客戶端發送給它。這兩個應用程序都位於由千兆交換機連接的單獨的W2k3服務器上。Socket.SendAsync服用幾秒鐘完成
通過試驗和錯誤,我改進我的測試,以10個客戶在100周毫秒的時間間隔連接,那麼一旦所有10個連接它們每一個發送達到100MS間隔「入室」消息給服務器,再一次。當服務器收到一條消息時,它會向房間中的每個人列表回覆發件人,並向房間中的其他人發送消息,告訴他們新的到來。
每個發送都需要1秒鐘才能完成(這對於100多個客戶端來說會持續3-4秒),並且通過日誌記錄,我已經確定延遲在Socket.SendAync和相應的事件發生之間。整個Cpu使用率始終很低。
我用盡了一切我能想到的,並花了幾天尋找線索在線和我在一個完全喪失。這不可能是正常的嗎?
編輯:代碼按要求。我已經整理了一下,刪除了不相關的計數器和日誌記錄等,現在它已經在黑客攻擊之上破解了,因爲我試圖縮小這個問題的範圍。
private void DoSend(AsyncUserToken token, String msg)
{
SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
writeEventArgs.Completed += ProcessSend;
writeEventArgs.UserToken = token;
Byte[] sendBuffer = Encoding.UTF8.GetBytes(msg + LineTerminator);
writeEventArgs.SetBuffer(sendBuffer, 0, sendBuffer.Length);
Interlocked.Add(ref m_totalBytesAttemptedSend, sendBuffer.Length);
Logger2.log(Logger2.Debug5, token.ConnectionId, "Total Bytes attempted: " + m_totalBytesAttemptedSend);
bool willRaiseEvent = true;
try
{
willRaiseEvent = token.Socket.SendAsync(writeEventArgs);
}
catch (Exception e)
{
Logger2.log(Logger2.Debug2, token.ConnectionId, e.Message);
writeEventArgs.Dispose();
}
if (!willRaiseEvent)
{
ProcessSend(null, writeEventArgs);
}
}
private void ProcessSend(Object sender, SocketAsyncEventArgs e)
{
AsyncUserToken token = (AsyncUserToken)e.UserToken;
Logger2.log(Logger2.Debug5, token.ConnectionId, "Send Complete");
if (e.SocketError == SocketError.Success)
{
Interlocked.Add(ref m_totalBytesSent, e.BytesTransferred);
Logger2.log(Logger2.Debug5, ((AsyncUserToken)e.UserToken).ConnectionId, "Total Bytes sent: " + m_totalBytesSent);
}
else
{
if (token.Connected)
{
CloseClientSocket(token);
}
}
e.Dispose();
}
你能發表一些相關的代碼嗎?猜測套接字問題是非常困難的。 – 2010-10-01 16:37:40
你有一個SocketAsyncEventArgs池嗎? – 2010-10-01 19:59:28
埃裏克 - 我目前沒有彙集SocketAysncEventArgs,但計劃稍後添加。不過,我在創建SocketAysncEventArgs並填充其緩衝區並將結束時間記錄爲回調中的第一個操作之後記錄了開始時間,因此,雖然我知道它的低效率,但它不應該影響此部分執行? – Adster 2010-10-04 09:24:44