Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Windows 7 - лимит соединений на 1 TCP порт? Добавлено: 30.05.12 20:41  

Автор вопроса:  Programmer
Запускаю TCP сервер и клиент на Windows 7 Ultimate. Клиент создает до 1000 соединений. За секунду устанавливается и авторизируется (создание RSAProvider, DESProvider, обмен ключами и получение id сессии) 8 клиентов.

Нагрузка на ЦП у клиента - 40%, у сервера - 1%.

Приблизительно после 500 установленных соединений скорость установки новых соединений к данному серверу падает до 1-2 в секунду.

На XP же у меня удавалось установить 30к соединений (но там была просто установка соединений без авторизации).

Если запустить второго клиента, он начнет соединятся с той же скоростью 1-2 соединений в секунду.

Если одновременно запустить такой же сервер на другом порту, к нему можно будет подключаться на нормальной скорости (до ~500 первых соединений).

Как оказалось, сервер получает запросы на соединение с запаздыванием, т.е. дело в винде. При этом в реестре у меня прописано TcpNumConnections = 60000, MaxUserPort = 65534, EnableConnectionRateLimiting = false, т.е. никаких ограничений быть не должно.

Вопрос: как такое вообще может быть?

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #1 Добавлено: 30.05.12 20:42
  1. EnableConnectionRateLimiting = false
Эээ в смысле EnableConnectionRateLimiting = 0

Ответить

Номер ответа: 2
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #2 Добавлено: 30.05.12 21:17
Вопрос решен. Перестарался с количеством потоков :)

И, все же, на ХР шустрее коннектилось. Не меньше 30 соединений в секунду.

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 31.05.12 02:28
Учитывая кол-во подключений на которых падает, могу предположить что работа с сокетами идет в синхронном режиме, на каждого клиента явно или неявно запускается по 1 потоку, и лимиты достигаются потоками а не соединениями.

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

Ответить

Номер ответа: 4
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #4 Добавлено: 03.06.12 23:53
Да, я в курсе. Мне удавалось дойти до этого лимита. Объединил обработку сообщений внутри клиентов в один поток и все нормализовалось.

Вообще, этот лимит зависит от количества IP адресов на сервере. На каждый IP можно принимать 65к подключений.

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 04.06.12 07:32
Programmer покажи код как ты сделал.

Если я правильно помню, лимит есть на локальные порты, т.е. клиент может открыть 65К подключений после чего кончатся локальные порты. Сервер же может теоритически принять любое кол-во клиентов

Ответить

Номер ответа: 6
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #6 Добавлено: 05.06.12 18:03
Если я правильно помню, лимит есть на локальные порты, т.е. клиент может открыть 65К подключений после чего кончатся локальные порты. Сервер же может теоретически принять любое кол-во клиентов
Получается так.
В целях эксперимента запустил сервер на порту 3387 и установил 5 локальных соединений. Вот, что добавилось в netstat:
  1.  
  2.          Local                  Remote
  3.   TCP    NEW:3387               localhost:53320        ESTABLISHED
  4.   TCP    NEW:3387               localhost:53321        ESTABLISHED
  5.   TCP    NEW:3387               localhost:53322        ESTABLISHED
  6.   TCP    NEW:3387               localhost:53323        ESTABLISHED
  7.   TCP    NEW:3387               localhost:53324        ESTABLISHED
  8.   ................................................................
  9.   TCP    NEW:53320              localhost:3387         ESTABLISHED
  10.   TCP    NEW:53321              localhost:3387         ESTABLISHED
  11.   TCP    NEW:53322              localhost:3387         ESTABLISHED
  12.   TCP    NEW:53323              localhost:3387         ESTABLISHED
  13.   TCP    NEW:53324              localhost:3387         ESTABLISHED


Как видно, 53320-53324 - порты, выделенные системой. Т.е. 64к локальных соединений - вполне возможно.

У меня solution - сетевой движок. Что конкретно показать?

Пользуюсь BeginReceive/EndReceive, при этом запускаю их по флагу ("чтение данных завершено";) из отдельного потока, который обслуживает все TCPClient-оболочки. Важный момент - BeginReceive НЕ должен запускаться внутри AsyncCallback, иначе количество потоков растет до беспредела. При завершении приема данных устанавливается флаг, а следующая обработка запускается из другого потока...

Количество потоков на сервере держится в районе 28-30 для 1500 клиентов, время отклика (до сервера и обратно, с буферизацией) 30-65 мс, нагрузка на ЦП до 10%.

Кстати, на Windows XP, при активном использовании сокетов, ЦП начинает загружать один из процессов System. На Windows 7 больше 1500 клиентов не пробовал запускать.

Ответить

Номер ответа: 7
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #7 Добавлено: 05.06.12 18:05
Вообще, этот лимит зависит от количества IP адресов на сервере. На каждый IP можно принимать 65к подключений.
Т.е. здесь я ошибался.

Ответить

Номер ответа: 8
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #8 Добавлено: 05.07.12 23:08
Похвастаюсь 35к подключениями :)
http://bbhost.org.ua/serv1.PNG
http://bbhost.org.ua/serv2.PNG

7 клиентов по 5000 подключений, передают пакет каждые 5 секунд.

Пытался вытянуть больше, но в районе 45к вылетают уже установленные соединения. Причину установить не удалось. Возможно, таймаут сессии - сервер занят приемом новых клиентов и "молчит" в сторону уже открытых подключений.

А вообще, на скрине обыкновенный чат без комнат. Каждый клиент занят тем, что пишет сам себе в приват 20-байтные сообщения.

Как видно - запускал ХР. На Win 7 (другой комп) получил BSOD BAD_POOL_CALLER в районе 3к клиентов. Перезагрузил, попробовал еще раз - завис намертво. Счас тестирую память - ошибок нет.

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 06.07.12 00:39
Написать что ли TCP сервер на C# 5.0

Ответить

Номер ответа: 10
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #10 Добавлено: 06.07.12 00:48
Давай, пиши :) А насчет BSOD-а нет идей - почему так произошло?

Ответить

Номер ответа: 11
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #11 Добавлено: 06.07.12 19:25
Великий программер на VB, если он такое говорит, знай, что он УЖЕ написал этот код. Код занимает 22 строчки, включая все { и }. И там нет ничего интересного.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам