Страница: 1 |
Страница: 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
Номер ответа: 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
В целях эксперимента запустил сервер на порту 3387 и установил 5 локальных соединений. Вот, что добавилось в netstat:
Как видно, 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
Номер ответа: 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 строчки, включая все { и }. И там нет ничего интересного.