Форум: "Сети";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
ВнизНасколько мощен TServerSocket !!!??? Найти похожие ветки
← →
NET_MAN (2003-02-14 13:53) [0]Доброго Вам времени суток !
Недавно у меня возникла потребность в написании мощного сервера, который способен обслуживать запросы как минимум 100 юзеров и максимум 10000 !!!Когда то мне приходилось писать сервак для максимум 5-ти одновременно работающих пользователей, его я писал именно на TServerSocket . А щас проблема несколько выросла, хотелось бы прокансультироваться у знающих людей по этому вопросу...
Как Вы думаете стоит ли использовать TServerSocket или же
использовать что-либо еще !
Заранее спасибо за ответ !!!
← →
Reindeer Moss Eater (2003-02-14 14:07) [1]Он мощен просто до безобразия. А если еще усиленное питание подвести......
← →
Digitman (2003-02-14 14:08) [2]Какие сомнения у тебя ? Конкретно - по поводу использования TServerSocket ?
← →
NET_MAN (2003-02-14 18:05) [3]Reindeer Moss Eater >>
а как представляется усиленное питание ?
Digitman >>
Сможет ли он держать одновременно открытыми 10000 сокетов, и при таком большом числе клиентов сообщения могут приходить со скоростью стремящейся к (пропускной способности сети)/8 => а это не просто быстро, а очень быстро ! Сможет ли мой PIII-600 отработать все эти запросы, а если какой клиент случайно отвалится->exeption, а ее отловки еще более тормозят ...
Есть ли какие-нибудь особенности программирования TServerSocket для большого числа клиентов ?
Еще как-то был случай вызова системной ошибки - недозволенное обращение к памяти по xxxx.xxxx адресу, это скорей всего из-за таких же отвалившехся юзеров, которые и вызывают exeption или ???
← →
Anatoly Podgoretsky (2003-02-14 18:29) [4]NET_MAN (14.02.03 13:53)
Одновременно?
← →
NET_MAN (2003-02-14 20:30) [5]Anatoly Podgoretsky © (14.02.03 18:29) >>
уточняю...
может ли TServerSocket держать открытыми одновременно более 100 сокетов и обрабатывать интенсивно поступающие данные от них( одновременно принять данные невозможно-физическая организация сети не позволит !)
а вопрос в накопительной способности этого компонента - сколько максимум он может сбуффиризировать сообщений от сетевой карты, ведь клиентов много, получив запрос его нужно как-то отработать на что уйдет определенное время(сравнительно немалое), а сообщения от других юзеров будут в системной очериди сообщений или накапливаться в ServerSocket ? Может ли наступить такой момент, когда эти сообщения начнут теряться ? Если да, то как это можно предотвратить при большой нагрузке на сервер ?
← →
Anatoly Podgoretsky (2003-02-14 21:00) [6]100 может
Но меня интересовал ответ про 10000 тут есть проблемы, но не с TServerSocket, а с системой, количество коннектов ограничено, да и диапазон выделяемых портов в системе где то 5000, подробности есть в MS SDK/MSDN
← →
Malder (2003-02-15 00:20) [7]Насколько я помню в семействах win9x ограничение было в 255 одновременно открытых сокетов. А в линейке НТ это число, по моему, очень велико. Думаю, 10000 сокетов открыть можно, хотя не пробовал и не ручаюсь, что получится
Anatoly Podgoretsky
>да и диапазон выделяемых портов в системе где то 5000
что вы имеете в виду ?
← →
Malder (2003-02-15 15:59) [8]Anatoly Podgoretsky ?
← →
Anatoly Podgoretsky (2003-02-15 16:20) [9]Функция АПИ то выделению номеров портов, там диапазон состовляет не то 4000 не то 5000 номеров, поищи сам в справке или если получится в архиве форума, этот вопрос несколько раз рассматривали в контексте как узнать порт.
← →
NET_MAN (2003-02-15 18:07) [10]спасибо за консультацию !...
... значит эксперимент провести нужно !...?
... подумаю как это сделать... как проведу обязательно результат в форум выкладу !...
← →
Digitman (2003-02-16 12:50) [11]
> NET_MAN
Сам TServerSocket по сути не вносит никаких ограничений на число одновременнных коннектов и размеры буферов / списков кэшируемых объектов. Единственное, что можно назвать "ограничением" - предельный диапазон целочисленных значений, которые может хранить Integer-переменная (переменные такого типа применяются в большинстве реализаций спискообразующих объектов VCL, на которых базируется этот компонент), используемая для хранения индексов в различного назначения списках в составе SerevrSocket-объекта.
Все прочие ограничения - это ограничения, вносимые Win32-ядром, Winsock-ядром и TCP-стеком
← →
Apple11 (2003-02-17 07:54) [12]Насколько я понимаю- TServerSocket построен на модели Асинхронных сообщений и использует Winsock1.1.
Для максимальной производительности лучше использовать Winsock2 и модель портов завершения.
← →
Digitman (2003-02-17 09:56) [13]
> Apple11
> TServerSocket построен на модели Асинхронных сообщений и
> использует Winsock1.1.
В режиме stThreadBlocking модель асинхронных сообщений не задействуется. Можно включить любую иную альтернативную модель - порты завершения и механизм нотификации через events.
Жестко "прошитая" в коде TCustomWinSocket инициализация Winsock 1.1 никак не мешает выбору любой из 3-х доступных моделей.
← →
Alex Konshin (2003-02-18 02:36) [14]И где ты в Winsock 1.x увидел event"ы? Ты имеешь в виду WSAAsyncSelect и т.п.? И где же тут нотификация? Там же все в конце концов к очереди сообщений окна сводится!
Однозначно нужно использовать Winsock2 - меньше проблем и головной боли будет. В WS2 все намного прозрачнее и понятнее. Делаешь нити и пусть они ждут событий, а операции запускай overlapped. При таком кол-ве клиентов очевидно, что нельзя создавать по одной нити на каждый коннект - помни об этом.
← →
Digitman (2003-02-18 08:52) [15]
> Alex Konshin
ws2_32.dll экспортирует ф-ции WSACreateEvent, WSAEventSelect, WSAEnumNetworkEvents, WSAWaitForMultipleObjects и т.п.
Библиотека эта грузится в модуле scktcomp, но, поскольку в non-blocking-режиме Борландом использована модель именно асинхр. оконных нотификаций, эти вызовы попросту не декларированы в winsock.pas, не импортируются и не используются. Но ничто не мешает задействовать эту event-модель (взамен async-модели), объявив и импортировав нужные event-ф-ции. Даже если SAStartup($0101, ..) !
В событии OnClientConnect для существующего хэндла гнезда (CustomWinSocket.WindowHandle) достаточно будет выполнить WSACreateEvent, WSAEventSelect - и winsock переключит гнездо в режим event-нотификаций
← →
Digitman (2003-02-18 09:25) [16]
> Alex Konshin
Да, и еще ..
При таком кол-ве одновременных коннектов, разумеется, по одной нити на коннект не удастся реализовать. Но поскольку даже при таком кол-ве соединений вероятность одновременно исполняемых клиентских запросов не столь велика, ничто не мешает попробовать организовать трэд-пул (скажем, например, установить размер трэд-пула в 100 раз меньшьшим числа коннектов) и исполнять запросы, выбирая из пула первый же свободный от исполнения запроса трэд и передавая ему параметры запроса на исполнение. Такой подход даст оптимальный результат параллельной обработки множества запросов при значительном числе коннектов.
Схема эта оч похожа на схему функц-я АТС(К, ДШ), где, скажем, на каждую сотню абон.комплектов (потенц.клиенты) установлен всего десяток-другой СЛ (трэд-пул). Т.е. только десяток-другой абонентов АТС могут одновременно быть обслужены в своих запросах на коннект и разговор, все остальные абоненты вынуждены ждать, пока не освободится хотя бы одна СЛ для обслуживания очер.запросов на коннект.
← →
Alex Konshin (2003-02-19 03:44) [17]ws2_32.dll это и есть Winsock2, wsock32.dll - это Winsock 1.2
Юнит winsock.pas, который поставляется Борландом, описывает Winsock 1.2 (wsock32.dll) и ИМЕННО поэтому там нет указанных тобой функций. И где ты увидел загрузку ws2_32.dll?
Winsock 2 API определен в юните idWinsock2.pas, который идет в поставке Indy (не помню начиная с какой версии, но в той, что идет вместе с Delphi7 он уже есть). Но я советую все-таки использовать мой юнит: в нем есть полезные фичи, которые не включены в idWinsock2 (например, трассировка вызовов ws2_32.dll и возможность выбора между статической и динамической линковкой).
Чтоб отпали сомнения - загляни в копирайт idWinsock2.pas
Для тех, кто еще не знает, мой сайт - http://home.earthlink.net/~akonshin/
← →
$hade (2003-02-19 07:36) [18]Я пытался на IdTCPServer делать около 2.5т соединений....работает...правда все это не для моего Duron 800/128 RAM....:-) и желательно не выводить всякие сведения о соединениях куда нить типа ListView...не поймет...:-))
← →
Digitman (2003-02-19 09:37) [19]>Alex Konshin
да все ты верно говоришь)
да, winsock.pas декларирует/импортирует ф-ции из wsock32.dll.
но ! если у тебя установлен именно winsock2, не поленись посмотреть любыми средствами стат.зависимости модуля wsock32.dll
среди них ты увидишь зависимость от модуля ws2_32.dll в части ф-ций WSARecv, WSARecvFrom, GetSockOpt, SetSockOpt
о чем это говорит ? да о том, что если в системе присутствует именно winsock2, то при загрузке неким процессом модуля wsock32.dll будет автоматически загружен и модуль ws2_32.dll
для доступа к нужным ф-циям (относящимся к event-модели) автоматически загруженного модуля ws2_32.dll заинтересованному процессу остается только получить его хэндл и адреса этих ф-ций
← →
Alex Konshin (2003-02-19 20:35) [20]Ну так, естественно, поддержка старого winsock 1.x реализована как враппер для winsock2, об этом даже в документации говорится:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/changes_from_windows_sockets_1_1_2.asp
И также очевидно, что хендл сокета и в Африке хендл сокета, и не важно из какого winsock"а он получен.
← →
Digitman (2003-02-20 08:31) [21]
> Alex Konshin
Видишь ли, я просто хотел всем этим сказать, что функциональность стандартных объектов из модуля scktcomp.pas достаточно просто расширить (практически - без переделки), самостоятельно задействовав интерфейс winsock2 из ws2_32.dll
В одном ранних проектов (за неимением того же Indy на тот момент) я именно так и поступил - отказался от модели асинхр.оконной нотификации в пользу модели event-нотификации. Не думаю, что последняя чем-то уступает модели портов завершения. Более того, поскольку для использования модели портов завершения как правило приходится использовать станд.ф-ции файлового ввода/вывода (Read/WriteFile), я склонен с достаточным основанием предполагать, что функц."оболочка" файловых операций ввода/вывода отнюдь не способствует увеличению производительности транспортных алгоритмов с использованием гнезд (разумеется, не во всех случаях - в отдельных)
← →
Digitman (2003-02-20 08:37) [22]> Alex Konshin
В догонку :
наиболее значимым можно, скажем, отметить, что при изложенном подходе (база=scktcomp.pas + ws2_32.dll) удается достаточно просто реализовать true-conditional acceptance на платформенных winsoсk2-реализациях, дающих такую возможность в принципе.
Например, в Винтукее это делается оч и оч просто, при этом требуется минимальная надстройка над классами TServerSocket и TServerWinSocket.
← →
Alex Konshin (2003-02-20 09:31) [23]Я активно использую completion routine и НЕ использую Read/WriteFile. И как-то особой необходимости в их использовании не вижу. Я в чем-то неправ?
Надо как-то на досуге хоть посмотреть, что же эти TServerSocket"ы такого делают, что люди так стремятся его использовать. Никогда не использовал.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c