Я пытаюсь оптимизировать оболочку TCP-сокета, которая борется с большим количеством входящих соединений.Я тестирую его на обычном чат-сервере и в небольшом клиентском приложении, чтобы отправлять на него клиентов.Оба приложения находятся на отдельном сервере W2k3, подключенном гигабитным коммутатором.
Методом проб и ошибок я уточнил тестирование до 10 клиентов, подключающихся с интервалами 100 мс, затем, после того как все 10 подключены, они отправляют по одному "enterномер "сообщение на сервер, снова с интервалом 100 мс.Когда сервер получает сообщение, он отвечает отправителю со списком всех в комнате, а также отправляет сообщение всем остальным в комнате, чтобы сообщить о новом прибытии.
Каждая отправка принимает 1второй для завершения (это длится 3-4 секунды для 100+ клиентов), и с помощью регистрации я установил, что задержка находится между Socket.SendAync и соответствующим событием, которое вызывается.Использование процессора остается низким на всем протяжении.
Я перепробовал все, что мог придумать, и потратил дни на поиски подсказок в Интернете, и я в полном недоумении.Это не может быть нормальным, не так ли?
Редактировать: Код по запросу.Я немного прибрался, удалил ненужные счетчики, ведение журналов и т. Д., В настоящее время он имеет хак поверх kludge и хакерских, поскольку я пытаюсь сузить проблему.
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();
}