Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.01 c
14-44373
QUE
2003-03-24 19:09
2003.04.14
Как работать с Clipboard на API ???


4-44516
BPK
2003-02-09 13:48
2003.04.14
Объединение меню (не MDI) через DLL


14-44380
Феликс
2003-03-26 15:54
2003.04.14
Протеин, чтобы типа мыщцы росли...:)


1-44247
Tayfun
2003-04-02 13:08
2003.04.14
Как из сроки S вырезать символы


6-44322
ККВ
2003-02-20 10:41
2003.04.14
Клиент для Novell





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский