|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.07.2008, 23:44 | #1 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Сколько клиентов может одновремнно подключиться к серверу?
Новая тема - так новая тема хотя речь о той же проге.
Попытался протестировать на максимум входящих подключений к серверу, а их теоритически может быть до 100 000. Написал программку со списком клиентов, которые согласно указанному количеству создаються динамически... Попытка создать 2048 сокетов - дает число сокетов в пределах 1400 - 1800 штук на один порт. Причем! подключиться к другому порту удаётся, но обмена данными нет уже не по одному сокету. Попытки создать большее число сокетов приводит к заморозке программки со списком клиентов, после чего она закрывается без каких либо сообщений об ошибке. Весь день рылся в и-нете, но вразумительного ответа так и не нашёл. Вопросы: 1. На что распростроняется это ограничение, на входящие или исходящие соединения, или и те и другие суммарно? 2. Можно ли это ограничение снять, например в реестре? Использую: Delphi 7, IdTCPServer из Indy 10, Windows XP Pro Sp2, Pentium M64, RAM 2048Gb, без файла подкачки. После запуска сервера и тестовой программки с клиентами: свободной памяти - полно, процессор загружен менее чем на 1% |
02.07.2008, 11:37 | #2 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
А под отладчиком сервер говорит out of memory...
|
02.07.2008, 11:48 | #3 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
vynt, как организовано копирование сокета? Если по потоку на клиент, то очень много потоков создать не получится. Плюс расходы пула на сокеты и сами потоки и т.д.
|
02.07.2008, 12:53 | #4 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Так ведь Indy же... конечно, поток на каждого клиента.
Похоже придётся таки создовать свой движок для сокетов. Через ..IoCompletionPort наверное. Примерчик бы какой посмотреть, знает кто и где, а? Очень нужно чтобы была возможность подключения такого количества сокетов, и без разрыва соединений т.к. прием/передача происходит редко, но, может неожиданно потребоваться связь с клиентом... |
02.07.2008, 23:38 | #5 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Я никогда не работал с Indy, поэтому и уточняю. Очень много потоков создать не выйдет, арифметика простая - 2Гб памяти на мегабайт стэка на поток по умолчанию выходит около 2000 потоков максимум. Это без учёта TEB'ов, кода, данных и т.д. Completion ports - самое разумное решение, в крайнем случае completion routines. Посмотрите "Network Programming for Microsoft Windows" (Anthony Jones и Jim Ohlund, MS Press). Там примеры по всем способам ввода-вывода через сокеты и краткое рассмотрение ограничений, вроде тех, в которые Вы и "упёрлись", плюс глава с соображениями по созданию мощных сереров под NT.
--------------- P.S. Не знаю, правда, как это стыкуется с Indy... |
03.07.2008, 14:10 | #6 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
А можно вместо Thread использовать Fiber? Там можно явно указать размер стека, в отличии от первого...Правда работать с "нитями" мне пока не приходилось.
Indy - на данный момент обеспечивает наибольшую стабильность, количество и качество, из уже 5-7 испытанных альтернативных компонентов... Есть в Indy и безпоточный сервер (только принимает подключения). Хотелось бы конечно найти/иметь готовый компонент с необходимой функциональностью |
03.07.2008, 14:35 | #7 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
А это ничего особенного не даст, только добавит головной боли, например, с синхронизацией. К тому же для "обычных" потоков тоже можно указывать размер стэка. Только ни к чему это всё, Вы же сами уже нашли лучшее решение. Работайте в направлении completion ports. Да и зачем Вам какие-то компоненты искать? Там кода получитсястрок на сто максимум.... Ещё раз повторю, не работал с Indy и не могу сказать, возможно там всё это уже реализовано...
|
03.07.2008, 18:01 | #8 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Попробовал через select() - те же яйца только в профиль!
Щас попытаюсь с completion ports. (Знал бы мой шеф, чем я занимаюсь с компьюетром...) А на счёт сокетов в потоке - значит ли то, что они "привязаны" к объёму памяти, что с её увеличением можно будет создать большее количество сокетов? Перекладывать на плечи юзеров свои проблемы не красиво, но временно можно |
03.07.2008, 18:34 | #9 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
|
03.07.2008, 21:44 | #10 |
Пользователь
Регистрация: 16.05.2008
Сообщений: 17
|
Таааак. Вот проблема, с completion ports, а как определить что клиент отключился? (или лучше уже в новую тему?)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите оценить, сколько может стоить проект. Его покупают - сколько взять? | grenles | Свободное общение | 4 | 16.07.2008 09:38 |
Помогите подключиться к серверу. | КривойПрограммист | Помощь студентам | 1 | 27.10.2007 23:41 |
Сервер и несколько клиентов | Andr | Работа с сетью в Delphi | 10 | 17.09.2007 09:24 |
Как подключиться к серверу используя API функции? | BR17UY | Win Api | 3 | 16.04.2007 02:12 |
Создать список клиентов банка | Klyan | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 15.01.2007 12:45 |