2011-01-11 5 views
0

Я ищу письмо, которое должно обрабатывать в области 200 соединений/сек, и задавался вопросом, справятся ли с этим C# и .NET, или если мне нужно действительно смотреть на C++ для этого?Обработка большого количества сокетов с .NET

Похоже, что SocketAsyncEventArgs может быть способ пойти, но проверить id id, прежде чем я буду пахать к нему.

Каждая транзакция должна длиться менее секунды, но может занять до 15 секунд каждый, если это имеет значение.

+0

Какое ожидаемое количество одновременных соединений? 200/сек с некоторым количеством длительностью до 15 секунд (скажем, 5% для удовольствия) означает, что через 5 минут у вас будет около 1000/одновременных. – NotMe

+0

входящих или исходящих соединений? –

ответ

3

Если вы попытаетесь поддерживать этот уровень использования, вы столкнетесь с ограничениями операционной системы. Ваши эфемерные порты истекают довольно быстро.

Если вам просто нужно обрабатывать всплески большого количества подключений, тогда .NET должен быть таким же способным обрабатывать его как C++; вам может потребоваться настроить параметр backlog на Listen.

+0

Что такое верхний предел для IIS? –

+0

@ Давид: Я понятия не имею. Но я знаю, что IIS не может обойти ограничение операционной системы; у вас только столько эфемерных портов, и состояние 'TIME_WAIT' будет убивать любое использование 200-соединений в секунду. Вам понадобится балансировщик нагрузки, сидящий перед фермой, чтобы принять такое устойчивое насилие. –

+0

+1 справедливо. Теперь соблазн пойти написать тест, чтобы определить пределы ОС. –

1

Я писал об этом виде here.

Пока вы можете проектировать свою систему, чтобы избежать накопления сокетов в TIME_WAIT на сервере, вы должны быть в порядке с точки зрения OS на любом экране VISTA или позже. Вы можете избежать TIME_WAIT на сервере, либо закрыв сокет на сервере с выключенным выключенным, чтобы стек TCP отправил RST, а не FIN ИЛИ, если клиент выдает активное закрытие и, следовательно, переходит в TIME_WAIT, а не на сервер.

Вам нужно подумать о скорости приема, поэтому используйте асинхронные приемные вызовы и отправьте их много, также сделайте задержку прослушивания довольно большой.

Если вам нужен код для тестирования вашего сервера, у меня есть «многопроцессорный тестовый жгут», который можно скачать с here. Он использует ConnectEx() для выдачи настраиваемого количества асинхронных подключений одновременно со скоростью, управляемой командной строкой. Я говорю о его использовании немного больше here.

Если вы думаете использовать C++, а не C#, то у меня есть некоторые примеры серверов, доступных here, а также набор свободных портов ввода-вывода для завершения ввода-вывода here.

Главное, ИМХО, чтобы убедиться, что вы testing for your desired level of scalability from Day 0.

Удачи вам!

+0

Приветствия Я посмотрю, хотя все. – Dreaddan

Смежные вопросы