У меня есть сервер .NET 2.0, который, похоже, запутывает проблемы с масштабированием, возможно, из-за плохой конструкции кода обработки сокетов, и я ищу руководство о том, как я может изменить его для повышения производительности.Советы/методы для высокопроизводительных сокетов сервера C#
Сценарий использования: 50 - 150 клиентов с высокой скоростью (до 100 с/с) небольших сообщений (по 10 с байтов каждый) от каждого клиента. Клиентские соединения долговечны - обычно часы. (Сервер является частью торговой системы. Клиентские сообщения агрегируются в группы для отправки на обмен по меньшему количеству «исходящих» соединений сокетов, а сообщения подтверждения отправляются обратно клиентам, так как каждая группа обрабатывается обменом .) ОС - Windows Server 2003, аппаратное обеспечение - 2 x 4-ядерный X5355.
Конструкция настольного сокета клиента: A TcpListener
порождает поток для чтения каждого клиентского сокета при подключении клиентов. Блок потоков на Socket.Receive
, анализирует входящие сообщения и вставляет их в набор очередей для обработки основной логикой сервера. Сообщения с подтверждением отправляются обратно через клиентские сокеты, используя асинхронные звонки Socket.BeginSend
из потоков, которые сообщают об обмене.
Наблюдаемых проблемы: Поскольку граф клиента вырос (теперь 60-70), мы начали видеть прерывистые задержки до 100s миллисекунд во время передачи и приема данных в/из клиентов. (Мы регистрируем временные метки для каждого сообщения подтверждения, и мы можем видеть случайные длинные промежутки в последовательности timestamp для пучков acks из той же группы, которые обычно выходят из общей суммы в несколько мс.)
Общее использование ЦП системы низкое (< 10%), имеется много свободной оперативной памяти, а основная логика и исходящая (обменно-обратная) сторона отлично работают, поэтому проблема, похоже, изолирована от кода сокета, обращенного к клиенту. Существует достаточная пропускная способность сети между сервером и клиентами (гигабитная сеть), и мы исключили проблемы сетевого или аппаратного уровня.
Любые предложения или указатели на полезные ресурсы будут очень признательны. Если у кого-то есть какие-либо диагностические или отладочные советы для выяснения того, что происходит не так, это будет здорово.
Примечание: У меня есть статья MSDN Magazine, статья Winsock: Get Closer to the Wire with High-Performance Sockets in .NET, и я взглянул на компонент Kodart «XF.Server» - он выглядит в лучшем случае отрывочным.
Согласен, хотя я мог бы добавить, что даже если вы «исключить» проблемы с сетью, я бы рассмотрел возможность замены различных частей (особенно на сервере nic) и убедиться, что у вас есть все новейшие прошивки и драйверы. – 2008-11-26 05:26:10