Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор архитектуры для нагруженного сервера 
:(
    Опции темы
loginrl103
Дата 19.2.2009, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.9.2008

Репутация: нет
Всего: нет



Серверный чат. Подключений - порядка 2-3к юзверей.
Linux/pthread/C.

Какую архитектуру сервера стоит выбрать?

Итак. Если берём архитектуру "один поток - одно соединение" получаем большую растрату ресурсов, производительность не самая лучшая. 

Если возьмём ту же архитектуру, но по принципу "один поток - несколько соединений". Как в этом случае будет идти расход памяти и процессора? Как в потоке возможно будет обрабатывать одновременно несколько сокетов?

Если берём событийную архитектуру...Какие библиотеки есть для решения этой задачи (ace для c++).

Вообще, что подскажите при выборе архитектуры? 
PM MAIL   Вверх
Comm
Дата 19.2.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Я в Linux пока не селен,но думаю это пригодится!
Цитата

4.4.    Выбор модели I/O для приложения
Семь моделей ввода/вывода WinSock в окружении оконных и консольных приложений и сервисов, различные требования протоколов верхнего (пользовательского) уровня, однопоточность и многопоточность, однопроцессорные хосты и многопроцессорные – весь этот набор ставит программиста перед очень непростым выбором, какую модель избрать для решения данных конкретных задач. Ниже перечислены наиболее очевидные варианты, рассмотренные нами в том или ином объеме: 
1.    "Обычные" блокирующие сокеты – "родное" состояние любого сокета – блокирующее, и вызов операции на нем не вернет управление, пока она не закончится. 
2.    "Чисто" неблокирующие сокеты – Вызов на таких сокетах возвращает управление немедленно, даже если операция еще будет продолжаться. Хотя принципиально до момента возврата программа может производить некоторые действия, этот метод требует постоянного опроса для определения момента завершения операции – обычно с помощью select(). 
3.    Мультиплексирование с помощью select(). Функция select() блокирует родительский поток до тех пор, пока на одном из сокетов не произойдет некоторое сетевое событие. Обычная практика – использование select() на неблокирующих сокетах во избежание опроса. 
4.    Асинхронные сокеты – это тоже неблокирующие сокеты (WSAAsyncSelect()), за исключением того, что не требуется производить опрос – модуль стекового протокола посылает специальное оконное сообщение, когда на сокете произойдет нечто интересующее программу. 
5.    Объекты-события – Используется WSAEventSelect(), механизм похож на метод мультиплексирование с помощью select(), но более эффективный. Кроме того, не стоит забывать, что select() работает с Беркли-сокетами, а WSAEventSelect() работает в среде WinSock. 
6.    I/O с перекрытием – Одна из наиболее примечательных особенностей WinSock 2, которая дает возможность обобщить на сокетные операции унифицированный I/O-механизм Win32 API и дает существенный выигрыш в производительности по сравнению с предыдущими моделями. 
7.    I/O Сompletion Port – наибольший эффект от применения этой модели может быть достигнут для серверных приложений на многопроцессорных аппаратных платформах.
Следует отметить, что применение любого из упомянутых методов в многопоточной среде может привести к существенным модификациям того или иного избранного механизма I/O, так как потоки существенно влияют на его природу.
Конечно же, при выборе в первую очередь следует обратить внимание на операционную систему, для которой пишется приложение, ибо все системы обладают различными сетевыми характеристиками. 
К примеру, Windows 9x не содержат в своем ядре механизма I/O с перекрытием, и если даже метод работает, то только за счет эмуляции на уровне API, и сокетная операция ReadFile() в Windows 9x будет неудачной. В UNIX механизм, аналогичный I/O с перекрытием, отсутствует. Как было уже отмечено выше, в некоторых UNIX-like системах введено понятие "чистых" асинхронных операций aio_*(), но они не соотносятся с WinSock-идеологией и не так широко распространены. 
Далее, хотя практически все современные UNIX-like системы поддерживают так называемые "потоки Posix – Posix threads", API для создания многопоточных приложений и техника программирования в UNIX и Windows различны. 
Из перечисленных методов функция select() для неблокирующих сокетов считается наименее эффективной из-за больших накладных расходов на ее исполнение, и эти расходы растут линейно при увеличении числа обслуживаемых соединений. Вместе с тем она хороша по причине портабельности кода, потому что все системы ее поддерживают.
Асинхронная модель с WSAAsyncSelect() также не принадлежит к числу очень эффективных, и она хороша для небольших объемов данных, к тому же она работает только в оконном окружении.
Модель с WSAEventSelect() обладает несколько большей эффективностью по сравнению с моделью WSAAsyncSelect(), плюс хорошая совместимость с "безоконными" приложениями. Она рекомендуется для серверов, получающих до 100 запросов на соединение и их обработку. Проблема лишь в том, что можно запустить "в дело" не более 64 объектов (в одном потоке) одновременно, и если будет создано 1024 сокета, это потребует 16–ти потоков!
Небольшой трафик – 1-100 запросов на соединение - может практически без ущерба обслуживаться любой из этих моделей.
Для высокопроизводительных и достаточно загруженных по количеству запросов серверов безусловно рекомендуется модель I/O с перекрытием – ни одна прежде рассмотренная модель не может себя с ней сравнить. Она позволяет справиться с нагрузкой десятков тысяч запросов на соединение (при условии достаточного объема быстродействующей оперативной памяти на сервере), и  еще более производительная модель порта завершения.
Следующие рекомендации могут быть отнесены к среде исполнения. Например, не рекомендуется программировать блокирующие вызовы в однопоточной среде с графическим интерфейсом (GUI), в этом случае лучше работать с асинхронными сокетами. В клиентских программах "усиленное" использование многопоточности редко оправдано, к тому же надо принимать во внимание вопросы синхронизации и отладки.
Многопоточность оправдана для FTP-серверов, для веб-броузеров, позволяющих закачку файлов в фоновом режиме, для посылки писем в email-клиенте без прерывания работы пользователя и так далее – программа должна применять многопоточность грамотно и уместно. Возможно также применение многопоточных клиентских приложений для задач тестирования серверов.
(С) Олег2005


Это сообщение отредактировал(а) Comm - 19.2.2009, 08:36


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Lazin
Дата 19.2.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(loginrl103 @  19.2.2009,  08:18 Найти цитируемый пост)
Если возьмём ту же архитектуру, но по принципу "один поток - несколько соединений". Как в этом случае будет идти расход памяти и процессора? Как в потоке возможно будет обрабатывать одновременно несколько сокетов?

с помощью асинхронного I/O smile 
как это сделать в *nix я не знаю, на твоем месте я бы использовал готовую библиотеку, например boost.asio, либо ACE Framework, еще можно сходить в гугл с запросами: "Reactor pattern", "Proactor pattern" smile 
PM MAIL Skype GTalk   Вверх
loginrl103
Дата 19.2.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.9.2008

Репутация: нет
Всего: нет



boost/ace для с++, у меня С (писал об этом в первом посте)
PM MAIL   Вверх
Comm
Дата 19.2.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Цитата

Итак. Если берём архитектуру "один поток - одно соединение" получаем большую растрату ресурсов, производительность не самая лучшая. 

Может в два потока,первый подготавливает и отправляет информацию,второй(с более высоким приоритетом) принимает соединения и собственно получает информацию.


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
MAKCim
Дата 19.2.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата(loginrl103 @  19.2.2009,  08:18 Найти цитируемый пост)
Какую архитектуру сервера стоит выбрать?

тут
извините за саморекламу  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
kolobok0
Дата 16.3.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(MAKCim @ 19.2.2009,  18:10)
..извините за саморекламу  smile

Извините, но прочитав Ваш форум - не совсем согласен..

Лично для меня ХардКод - это разработка и процессорного ядра и ОСи - САМОСТОЯТЕЛЬНО... а не юзанья готовых решений. Именно это направление даст 
а) больший гимор
б) большую скорострельность
всё остальное - от лукавого. - чиссо моё ИМХО.

отвечаю тут, потому как регистрироваться на вашем чудо сайте НЕВОЗМОЖНО. я лично видать полный даун и не смог ответить на вопрос кода BUIR (вроде)...первый раз такую фигню вижу...(надеюсь в последний) smile

Добавлено через 10 минут и 14 секунд
Цитата(loginrl103 @ 19.2.2009,  08:18)
Серверный чат. Подключений - порядка 2-3к юзверей.

к сожалению на мой скромный взгляд литературы по клиент-серверным решениям около нуля. когда был бум этого сочетания то данными словами что только не называли smile 

возвращаясь к баранам...
понятное дело что чем больше параллельность и больше "мозгов" готовых обрабатывать эту параллельность - тем лучше. к сокетам это так же относится. Т.е. ваша дорога не PP соединения а дайтаграмный. Т.е. уровень UDP и свой аля TCP протокол. Всё остальное - жор ресурсов на стороне сервака при пике нагрузок. Это если свои клиенты. Если стандартные броузеры - то тут либо более тесная интеграция в ядро (что собственно трудности) либо увеличение мощностей на стороне сервака и всё таки TCP соединения. "Уменьшить" нагрузку на сервак мона подключением "стаи" серверов работающих параллельно но с разными IP, при этом перебрасывая на них ридиректы (гляньте например любой поисковик, обратите внимание на его IP адреса - они меняются smile при пингах).

если клиенты свои - ну тут поле для творчества. саму обработку на серваке мона делать "по клиентно" или скажем "по задачно" или смешанные варианты. PP соединение - это "по клиентная" обработка. Никто не мешает сдалть и по задачно. И то и то решение можно масштабировать в узких местах.


удачи Вам
(круглый)
PM MAIL   Вверх
fry
Дата 11.4.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Я думаю прокатит вариант с порождением задач - некоторый класс с функцией exec() - для каждого соединения и некоторого количества потоков для запуска этого самого exec() для всех задач которые должны выполняться. Каждый вызов данного метода не должен блокироваться. При данном применении (чат) это должно сработать. Соответственно можно развить данную идею и сделать например динамическое изменение количества потоков соответственно достигая этим эффективной работы сервера. Ну вот, вкратце как то так.
PM MAIL   Вверх
J0ker
Дата 13.4.2009, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



IO completion ports, паттерн "реактор"


--------------------
user posted image
PM MAIL   Вверх
Lazin
Дата 13.4.2009, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(fry @  11.4.2009,  13:13 Найти цитируемый пост)
достигая этим эффективной работы сервера

этим можно достигнуть чего угодно, кроме эффективной работы сервера =)
PM MAIL Skype GTalk   Вверх
fry
Дата 15.4.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: нет
Всего: 3



Lazin, ты конечно сделал достаточное количество серверов и т.п., в чем я не сомниваюсь глядя на количество звездочек под твоим аватаром, однако просто так говорить, что эффективности добиться нельзя на твоем месте (и с такими звездочками) я бы не стал (Это несколько "порочит" твою же репутацию т.к. любой пост должен иметь информационное наполнение. В данном случае информации, кроме не аргументированного сообщения о невозможности того, что я написал, нет и в помине). Чтобы мое сообщение не "поделяли" за то же самое я хочу дополнительно сказать Lazin о том, что эфективная работа достижима всегда, когда есть чем управлять и есть цель, ради которой и осуществляется управление. В конкретном примере, попробуй представить как будет работать сервер при одном и том же количестве потоков в случаях малого (например 10) и большого (например 10000) количества клиентов.
PM MAIL   Вверх
Олег2005
Дата 15.4.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(J0ker @  13.4.2009,  03:14 Найти цитируемый пост)
IO completion ports, паттерн "реактор" 

К сожалению, это не Винда, и виндовские решения тут не подходят......
Автор написал:
Linux/pthread/C.
PM MAIL WWW MSN   Вверх
Lazin
Дата 15.4.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



fry, вопрос перечитай
Цитата(loginrl103 @  19.2.2009,  08:18 Найти цитируемый пост)
Какую архитектуру сервера стоит выбрать?

Итак. Если берём архитектуру "один поток - одно соединение" получаем большую растрату ресурсов, производительность не самая лучшая. 

Если возьмём ту же архитектуру, но по принципу "один поток - несколько соединений". Как в этом случае будет идти расход памяти и процессора? Как в потоке возможно будет обрабатывать одновременно несколько сокетов?

Если берём событийную архитектуру...Какие библиотеки есть для решения этой задачи (ace для c++).


теперь твой ответ:
Цитата(fry @  11.4.2009,  13:13 Найти цитируемый пост)
Я думаю прокатит вариант с порождением задач - некоторый класс с функцией exec() - для каждого соединения и некоторого количества потоков для запуска этого самого exec() для всех задач которые должны выполняться. Каждый вызов данного метода не должен блокироваться. При данном применении (чат) это должно сработать. Соответственно можно развить данную идею и сделать например динамическое изменение количества потоков соответственно достигая этим эффективной работы сервера. Ну вот, вкратце как то так. 

Во первых, в случае неблокирующего I/O, оптимальным будет постоянное количество потоков, если ты увеличишь количество потоков, то процессоров у тебя больше не станет.
Во вторых, твое описание архитектуры приложения понятно только тебе, что должен делать метод exec и почему это должно сработать - загадка. smile

Добавлено через 1 минуту и 4 секунды
Цитата(Олег2005 @  15.4.2009,  21:54 Найти цитируемый пост)
К сожалению, это не Винда, и виндовские решения тут не подходят......

действительно, к сожалению, судя по всему в "винде" с этим проще smile  
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 15.4.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

действительно, к сожалению, судя по всему в "винде" с этим проще 

 smile а то тему перенесут в религиозные войны smile

Добавлено через 4 минуты и 49 секунд
loginrl103

Цитата

Итак. Если берём архитектуру "один поток - одно соединение" получаем большую растрату ресурсов, производительность не самая лучшая. 

не берем такую архитектуру  smile сразу откладываем
Цитата

Если возьмём ту же архитектуру, но по принципу "один поток - несколько соединений". Как в этом случае будет идти расход памяти и процессора?

вот! то что надо, равномерное распределение нагрузки.
Можно так
При запуске - создаем 10, 20, 30 (не актуально) потоков. Каждое сойдинение передаем в потоки по очереди, тем самым распределяя нагрузку.
Цитата

Как в потоке возможно будет обрабатывать одновременно несколько сокетов?

функции select или poll.

Добавлено через 5 минут и 50 секунд
Но лучше было бы создать систему так, чтобы при желании можно было горизонтально рассширить систему, т.е. добавить еще один сервер если одного станет нехватать.
PM   Вверх
J0ker
Дата 15.4.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



Цитата(Олег2005 @ 15.4.2009,  21:54)
Цитата(J0ker @  13.4.2009,  03:14 Найти цитируемый пост)
IO completion ports, паттерн "реактор" 

К сожалению, это не Винда, и виндовские решения тут не подходят......
Автор написал:
Linux/pthread/C.

если не шибаюсь, в *nix'ах есть аналогичный механизм - pool

Добавлено через 1 минуту и 28 секунд
http://www.citi.umich.edu/techreports/repo...iti-tr-00-4.pdf

Добавлено через 3 минуты и 16 секунд
возмите boost::Asio - там эти механизмы икапсулированны


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1038 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.