Сервер сокетов C # - максимальная емкость и общие вопросы - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть серверное приложение, которое отслеживает различные компьютеры в сети.Иногда в сети может быть до 6000 компьютеров, которые необходимо отслеживать.Отслеживание включает в себя только знание того, что компьютер включен.Иногда сервер отправляет обратно клиенту сообщения, которые необходимо обработать и обработать.

Я пробовал WCF, но, похоже, он не справляется с большой нагрузкой очень изящно (высокая загрузка ЦП довольно распространенапри приближении к 1200-2000 диапазону клиентов);плюс, с WCF я должен сделать его своего рода механизмом «тяги» вместо «толчка» для получения сообщений клиенту (т. е. клиент запрашивает сообщения у сервера).Я думаю о переключении на низкоуровневую связь через сокет TCP, но я не уверен, чего ожидать, о чем этот вопрос.

Итак:

1 - Сколько клиентов я могу ожидать, чтобы иметь возможность подключаться и оставаться на связи с моим сервером?2 - Предполагая, что это соединение используется в основном для того, чтобы просто сообщить серверу, если клиент все еще в сети, и для отправки очень редкого сообщения с сервера, я могу увидеть много использования ресурсов (с точки зрения CPU / RAM / tcpпорты / etc) на сервере?

Спасибо

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

1 - Сколько клиентов я могу ожидать, чтобы иметь возможность подключаться и оставаться на связи с моим сервером?

5000 не должно быть никаких проблем.

2 - Предполагая, что это соединение используется в основном для того, чтобы просто сообщить серверу, если клиент все еще в сети, и для отправки очень редкого сообщения с сервера, я могу увидеть много использования ресурсов (с точки зрения CPU / ОЗУ / порты tcp / etc) на сервере?

Определите "много". Открытые соединения TCP занимают ресурсы. Но самым большим ресурсом будет буфер byte[], который вы используете в своем BeginReceive. Но давайте предположим, что это 32768 байт. Это в общей сложности около 163 МБ. Память дешева, не правда ли?

Что касается использования процессора, нет. Свободные соединения не используют процессор.

0 голосов
/ 20 декабря 2011

Вам действительно нужно, чтобы было открыто столько соединений?

Не потому, что вам нужно отслеживать рабочие станции, необходимо постоянное соединение. Вы можете подключить клиентов и опросить, как вы предложили, с интервалом. Который архитектурно имеет некоторое сходство с HTTP. Таким образом, веб-сервер может даже соответствовать потребностям вашего сервера: все клиенты, которые опрашивают, могут считаться up , и ваш сервер может что-то сказать или нет На самом деле это не имеет значения, если вы сохраняете соединение максимально коротким. Использование этого подхода в сочетании с упрощенным тайм-аутом опроса, скорее всего, легко охватит вышеупомянутые 6000 рабочих станций, «отслеживаемых» одним сервером.

Другим вариантом может быть рассмотрение инфраструктуры обмена сообщениями. Сервер отправляет команды в очередь команд , а клиенты, принимающие команды, отвечают по очереди ответов .

Полагаю, UDP можно считать возможным способом реализации последнего. Но вам придется больше работать ...

0 голосов
/ 20 декабря 2011

Взгляните на этот вопрос bytes.com относительно теоретического максимального количества соединений, допустимого в аналогичной ситуации.

Ответ, который представляется наиболее актуальным:

The magic setting you're looking for is "MaxUserPort". You can google this,
then make the appropriate registry change.

The value is typically set at 5000, and if you want lots and lots of client
connections then you need to bump the value up.

При этом вы, вероятно, выиграете от использования UDP поверх TCP в среде локальной сети, если он хорошо сочетается с вашим проектом.Я лично не выполнил никаких тестов по этому вопросу в C #, но успешно поддержал более 10 000 UDP-клиентов в C ++ с небольшими проблемами (и ОГРОМНЫМ блоком).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...