2015-02-08 5 views
-3

У меня есть приложение на C#, которое является сервером TCP, слушая порт. GPS-устройства подключаются к этому порту. Приложение принимает клиент TCP и создает новый поток для каждого клиента. Идентификатор клиента поддерживается в хеш-таблице, которая обновляется при подключении клиента. все это работало до 400 единиц. Как только количество единиц увеличилось, сервер не смог обработать все соединения. Соединения постоянно отбрасываются и через некоторое время приводят к выходу серверного процессора и памяти и снижают его. Работа над ним заключалась в том, чтобы открыть еще один экземпляр сервера TCP, который прослушивает другой порт, и отвлек некоторые единицы к этому порту. В настоящее время около 1800 единиц как-то работают в 8 разных портах. Сервер крайне нестабилен, и устройства по-прежнему не могут оставаться на связи. Слишком много проблем ежедневно. Также, используя удаленный доступ для отправки настроек через удаленный порт - это работает только иногда.Обработка TCP-соединения

Пожалуйста, помогите, предложив решение для сокета TCP/потоковой передачи/объединения потоков и т. Д., Которое является масштабируемым и надежным и может использоваться в одном порту.

Этот сервер TCP работает в Windows Server 2008 R2 Enterprise с IIS7 и SQL Server 2008.
Процессор: Intel Xenon CPU E3-1270 V2 @ 3.50GHz
Оперативная память: 32GB система: 64-разрядная операционная система

Благодаря Джонатан

+0

Один-на-клиент просто не будет масштабироваться в Windows. Вам нужно использовать одну из нескольких асинхронных моделей API для создания сетей в .NET. Обратите внимание, что независимо от того, у вас всегда будет предел. Но с базовыми асинхронными вводами-выводами ('BeginXXX()' или методами 'XXXAsync()' в классе NetworkStream' вы должны легко обрабатывать до десятков тысяч подключений, а если вы используете больше эффективные методы 'XXXAsync()' в классе 'Socket' (который отличается от методов async stream), вы должны иметь возможность обрабатывать 100 тысяч. –

+0

Обратите также внимание на то, что вышесказанное предполагает, что остальная часть вашего собственного кода написана хорошо. Существует множество способов, которыми вы можете управлять масштабируемостью на сетевом сервере.Вы не предоставили достаточной информации для тех, кто знает, что такое ваша проблема _actual_, но мы можем с уверенностью сказать, что ваша текущая реализация имеет хотя бы одну известную проблему масштабируемости. –

+0

@PeterDuniho может использовать этот сценарий сокета для настольных ОС Windows, например, Windows 7 Pro x64. При запуске сервера сокетов на настольных ОС тысячи подключений по-прежнему разумны? – khargoosh

ответ

2

в принципе, не использовать поток для каждого сокета; используйте один из асинхронных API (BeginReceive/ReceiveAsync) или какой-либо сокет-опрос (например, Socket.Select, хотя обратите внимание, что это реализовано очень неудобно, когда я использую это, я на самом деле использую P/Invoke для доступа к необработанный базовый API). В данный момент у меня есть> 30k сокеты за процесс, разговаривающий с нашим сервером веб-сокетов (который реализован через Socket). Обратите внимание, что по причинам OS мы разделились, что в течение нескольких различных портов - главным образом из-за ограничения нашей балансировки нагрузки:

enter image description here

+0

@Mark Я уверен, что ваша среда намного больше, чем я работаю. Возможно ли, чтобы вы пришли на мой уровень и помогли мне? Как отправить код? Мне нужна помощь в разных местах моего кода. – Jonathan

+0

@ Jonathan за пределами шкалы «нить на сокет не работает» (что уже относится к вам), масштаб в значительной степени не имеет значения - проблема в том, что вам нужно переключиться на async IO –

+0

@Mark Gravell - я переключился на asynch IO ... am revamping мой TCP-сервер ....... – Jonathan

0

Один поток для каждого соединения не очень хорошая идея, особенно когда у вас есть одновременно обрабатывать 100 клиентов. Асинхронность - это способ управления несколькими пулами. Если вы ищете что-то, чтобы начать с асинхронных сокетов, посмотрите на this basic implementation, если вы ищете что-то полное. Посмотрите на this (пояснение: Here) Если вы тоже желаете check this out.

В C# вы можете пойти с классическими методами BeginXXX/EndXXX. Microsoft также имеет High Performance Socket API, который можно использовать с использованием методов XXXAsync. Несколько статей, которые объясняют API высокопроизводительных сокетов Here и Here

+0

Спасибо, что дали мне правильное направление. Спасибо Абдулле за конкретные ссылки на коды. Работая над реализацией этого на моем конце ... сообщит вам, как это происходит ... – Jonathan

+0

Привет всем, У меня есть серверное и клиентское приложение, запущенное в моей тестовой среде. Нам еще многое предстоит сделать, пока я не смогу принять его в реальном времени. – Jonathan

+0

У меня нет контроля над тем, как работает мой фактический клиент. Он устанавливает соединение с сервером, затем он отправляет данные в любое время в течение следующих 2 минут. Этот код основан на том, как работает входящая клиентская программа. При отладке с другим простым клиентом, где клиент просто подключается (еще не отправлено данных), он получает исключение Out of Memory при полученииSendToken.theDataHolder.dataMessageReceived = новый байт [receiveSendToken.lengthOfCurrentIncomingMessage]; и dataMessageReceived отображается как null. Что я могу сделать? – Jonathan

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