У меня есть сервер .NET 2.0, который, похоже, сталкивается с проблемами масштабирования, вероятно, из-за плохого дизайна кода обработки сокетов, и я ищу руководство по тому, как я мог бы его перепроектировать для повышения производительности.
Сценарий использования: 50 - 150 клиентов, высокая скорость (до 100 с/с) небольших сообщений (по 10 с байтов каждый) от каждого клиента. Клиентские соединения долговечны - обычно часы. (Сервер является частью торговой системы. Клиентские сообщения агрегируются в группы для отправки на обмен по меньшему количеству "исходящих" соединений сокетов, а сообщения подтверждения отправляются обратно клиентам, так как каждая группа обрабатывается обменом.) ОС - Windows Server 2003, аппаратное обеспечение - 2 x 4-ядерный X5355.
Конструкция текущего клиентского сокета: A TcpListener
создает поток для чтения каждого клиентского сокета при подключении клиентов. Блоки потоков на Socket.Receive
, анализируя входящие сообщения и вставляя их в набор очередей для обработки основной логикой сервера. Сообщения с подтверждением отправляются обратно через клиентские сокеты, используя асинхронные вызовы Socket.BeginSend
из потоков, которые говорят на стороне обмена.
Наблюдаемые проблемы: По мере роста количества клиентов (теперь 60-70) мы начали наблюдать прерывистые задержки до 100 мс в миллисекундах при отправке и получении данных от клиентов. (Мы регистрируем временные метки для каждого сообщения подтверждения, и мы можем видеть случайные длинные промежутки в последовательности времени для группировок из одной группы, которые обычно выходят за несколько мсек.)
Потребление центрального процессора низкое (< 10%), есть много свободной ОЗУ, а основная логика и исходящая (обратная сторона) работают отлично, поэтому проблема, кажется, изолирована от клиента -файковый код сокета. Существует достаточная пропускная способность сети между сервером и клиентами (гигабитная сеть), и мы исключили проблемы сетевого или аппаратного уровня.
Приветствуются любые предложения или указатели на полезные ресурсы. Если у кого-то есть какие-либо диагностические или отладочные советы для выяснения того, что происходит не так, это будет здорово.
Примечание. У меня есть статья MSDN Magazine Winsock: ближе к проводке с высокопроизводительными сокетами в .NET, и я заглянул в компоненте Kodart "XF.Server" - он выглядит в лучшем случае отрывочным.