![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Господа! Ситуация такая: есть сервер с базой данных, есть несколько тысяч клиентов, которые коннектятся к нему и ждут. Клиенты работают с БД ч/з сервер, при изменении базы данных сервер информирует клиентов об изменениях.
Сейчас сервер сделан на TWSocketServer из пакета FPiette (ICS). Есть проблемы: при числе клиентов порядка тысячи перестает принимать соединения. Подскажите, пожалуйста, как лучше реализовать подобный сервер. Нужна ли многопоточность, если клиенты в основном не проявляют сетевой активности, разве что при редактировании и когда принимают изменения. Это сообщение отредактировал(а) Mikel - 10.10.2009, 21:12 -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
Virtuals |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 2 Всего: 11 |
Mikel, на какой операционке сервер? есть подозрение что ограничение самих виндов...
|
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Сервер на Windows'e. Пробовал на XP x64 и на серверной 2003
Может стоит переписать на многопоточный сервер на Indy? Это сообщение отредактировал(а) Mikel - 10.10.2009, 22:44 -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Не стоит. Несколько тысяч потоков - это не очень хорошо для ОС. Вряд ли. Сейчас совершенно спокойно создал 2000 соединений вместе с сопутствующими структурами для приема/передачи данных (в смысле - 2000 исходящих и соответственно 2000 входящих) на основе TClient|TServerSocket (обертки работы с ними где-то здесь уже выкладывал). Вернее, не совсем спокойно - после первой тысячи соединений машинка поднапряглась на создании, но в процессе сетевого обмена со всеми клиентами вела себя более чем адекватно. (Vista Home Premium). Добавлено через 2 минуты и 25 секунд А вот отфутболивать соединения может из-за ограничения на количество полуоткрытых соединений (в TCPView от Sysinternals такие соединения идут под флагом SYN_SENT). Afair, их по умолчанию разрешается не более 100. |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
В Indy 10 в одном потоке с помощью 'fibers' можно работать с несколькими сокетами, т.е. например открыть 1000 потоков в которых могут работать 2000 клиентских сокетов, по 2 на поток.
Вообще тест проводил так- соединяются несколько сотен клиентов, но они у меня находятся в одном потоке, т.е. сначала идет соединение всех сокетов, потом отправка регистрационных данных и т.д. Так вот получается что если пытаться подсоединить, например 300 клиентов разом, то сервер выдает ошибку о перегрузке стека. -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
имхо стоит почитать про порты завершения... где-то даже толковая статейка попадалась.
искать по: "порты завершение" "IO Completion Port" "IOCP" -------------------- There are always someone smarter than you... |
|||
|
||||
kami |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
Не работаю с Indy, у меня на них аллергия ![]()
Ошибся - в интернете говорят, что WinServer2003 не имеет этого ограничения.
Раз в одном потоке - не пробовал перед/после каждого Connect делать Application.ProcessMessages (или аналог, если это доп.поток)? В проведенном мной тесте без ProcessMessages подключения "загнулись" на сто_каком_то с ошибкой WSAECONNREFUSED. |
||||||
|
|||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
ага... вот и статейка на gamedev
-------------------- There are always someone smarter than you... |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
MetalFan, благодарю, ознакомлюсь
![]() kami, я думаю как раз в этом то и проблема, то что он не выполнив до конца обработчик одного сокета берется за другой и из-за этого и происходит переполнение стека... -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Сделал на Indy- вообще не катит
![]() Поставил ProcessMessages в обработчики старого сервера на ICS, теперь 100%ый коннект. Ограничения на соединения кстати есть, но не на сервер- с одного компьютера почти 4000 соединения на сервер можно открыть, потом не соединяется, после чего можно законнектиться еще 4000 сокетов с другого компьютера. В общем 8к соединений держит точно. Но есть еще вопрос, оповещение об изменении происходит в цикле, где в каждый сокете высылается пакет информации об изменении. Так вот когда их много, опять перегружается стек. Может где-то еще впихнуть ProcessMessages? ![]() Кстати еще один вопрос- компьютер под сервер все же двухядерник, а в ICS, как я понимаю, все обрабатывается в одном потоке, нужно ли как-то оптимизировать его под систему с несколькими процессорами? Это сообщение отредактировал(а) Mikel - 22.10.2009, 07:41 -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
ээээ... я может чего не понял. но при чем тут потоки и ProcessMessages????
-------------------- There are always someone smarter than you... |
|||
|
||||
Mikel |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Прошу прощения, наверное не совсем корректно выразился, первое предложение относилось к Indy, а остальное- вернулся к старому серверу, на ICS, который работает на асинхронных сокетах.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
а создавать руками тысячами потоки - по-любому плохая, негодная идея. и теперь ошибки старой реализации замаскированы ценой тормозов у клиентов.
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |