Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
MasterZivПо-моему так всё просто: Висишь на select-е (или poll/epoll) . Владеешь всеми хендлерами сокетов. select генерирует событие. по всем сработавшим сокетам (по каждому) создаём задачу на обработке в пуле коннектов, хватаем мьютекс очереди, пихаем задачи в очередь, отдаём мьютекс. Отдаными сокетами более не владеем. Взводим event/semaphore, что есть задачи. потоки пула просыпаются, каждый хвать мьютекс, хвать себе задачу. Отдать мьютекс и делать задачу (обрабатывать запрос). Если нужна новая задача, порождаемая обработкой, -- тот же механизм. Верно. На большом количестве коротких соединений оптимальнее использовать lock-free очередь вместо lock-based(mutex) очереди, но почему не используют в Boost.Asio? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 22:24 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Посмотрел все, что советовали. На работе сказали делать используя libevent(. Сейчас сижу разбираюсь, появляются вопросы. Попутно смотрю еще другие варианты. Смотрел стандартные средства: fork() - в принципе будет тоже самое, что у меня уже есть; select - мне понравился вариант - не сложен в реализации, есть возможность разбить обработку большого количества клиентов в нескольких потоках, для ускорения работы. По поводу select прошу высказать ваше мнение. Теперь вопросы по поводу libevent. Разбираю сейчас этот пример. Пока сложилось такое представление: мы просто подписываемся на три возможных события: подключение нового клиента, чтение сообщения от клиента, отправка сообщения клиенту. В таком представлении работает только подключение новых клиентов. Принимается сообщение только один раз от каждого нового клиента. Почему так происходит? Сначала подумал, после каждого чтения сообщения от клиента его нужно снова подписывать на это событие, но это вроде как глупо, да и не работает. Буду рад, если кто-нибудь разберет этот пример и объяснит мне логику его работы. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 10:06 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
La France, select как раз для большого кол-ва клиентов будет плох. При каждом событии вам нужно будет пробегаться по каждому из них и смотреть есть ли данные. То есть линейное время по кол-ву сокетов. ps. Как близкая альтернатива к libevent можно рассмотреть libev: он легче (по весу, киллограммов на 10) libevent, так же заявляется что он шустрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 10:42 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
sherzod_, Прочитал про два варианта: fork и select в этой статье. Если допилить пример с select, так чтобы клиенты обслуживались в нескольких потоках, то будет лучше чем создавать потоки для каждого клиента, при условии, что клиентов очень много. С примером libevent, о котором говорил разобрался вроде - подписал на чтение в конце метода записи, и убрал закрытие сокета и удаление data. Сейчас пока другой пример разбираю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 11:49 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
sherzod_select как раз для большого кол-ва клиентов будет плох. При каждом событии вам нужно будет пробегаться по каждому из них и смотреть есть ли данные. То есть линейное время по кол-ву сокетов. Именно поэтому обычно порождают отдельный рабочий процесс на обработку каждых XX подключений. Кроме того в современных процессорах есть команда сканирования массива бит в поисках первого установленного, это уже не нужно делать for+if. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 13:24 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
Сейчас разбираю этот пример. Судя по расширению это код на C, я его использую как C++, думаю результат на C был бы такой же. Поэтому теперь просьба объяснить мне этот пример (Под вечер не получается понять его, но пусть будет на будущее)). Работает он сейчас так: запускаю сервер, он ждет клиентов. Запускаю клиента он коннектится и получает от сервера известное сообщение. Сейчас пытаюсь по аналогии написать метод для приема сообщений от клиентов, но пока не получается. Если есть у кого идеи буду рад, если поделитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 15:18 |
|
||
|
Высоко-нагруженный сервер на ubuntu - С++ под Linux
|
|||
|---|---|---|---|
|
#18+
Вася УткинAnatoly MoskovskyТ.е. конкуренция между потоками есть - в момент создания нового соединения, но это имеет несущественное значение, т.к. основная работа с сервисом происходит все-таки в одном потоке и плюс конкурируют не более чем 2 потока. Но ведь в случае с web-сервером, например, каждый вызов страницы - это открытие и закрытие нового соединения. А если на web-сервере страницы статичные и быстро создаются, то нельзя сказать, что "основная работа с сервисом происходит все-таки в одном потоке" по сравнению с засыпанием acceptor-a на мьютексе и ожидания пока он снова проснется, ведь пока acceptor спит ни одно новое соединение не может быть создано. Даже если сервер читает запрос и просто пишет ответ из памяти, то все равно происходят следующие события затрагивающие очередь сервиса. 1) поток аксепт постит в сервис соединения обработчик старта сессии. 2) запускается чтение из сокета 3) запускается таймер для таймаута чтения 4) срабатывает обработчик чтения или таймер 5) запускается запись в сокет 6) запускается таймер для таймаута записи 7) срабатывает обработчик записи или таймер И это минимально необходимые действия для любого надежного сервера. Из всех этих событий только 1 выполняется в потоке аксептора, а остальные в потоке сервиса. То есть основная работа с сервисом происходит все-таки в одном потоке :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 21:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38528414&tid=2019760]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
157ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 308ms |
| total: | 543ms |

| 0 / 0 |
