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