powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоковый сервер на С++
25 сообщений из 94, страница 2 из 4
Потоковый сервер на С++
    #38209760
WesttrdДохтаРпропущено...


Я сказал помещается ( можно впихнуть), реально если важен перфоманс
то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора).
Можно нарисовать велосипед на тему select на SIGIO.
В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO
прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) .

Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов.
Текущая имплементация aio для сокетов не является асинхронной
Имплементация где? И как asynchronous I/O (AIO) может быть не asynchronous?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38209773
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MedEx,

Ну щас все будут перечислять что знают - и boost и qt и glib... Qt - это слишком тяжёлая штука и оверхеда несёт с собой прилично. Нужно что-то более приземлённое. Лучшей пусть свой велосипед лабает вокруг libpthread
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38210099
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имплементация гдеWesttrdпропущено...

Текущая имплементация aio для сокетов не является асинхронной
Имплементация где? И как asynchronous I/O (AIO) может быть не asynchronous?

AIO имеет ряд ограничений, и пока в стандартных ядрах нет полноценной реализации для сетевых сервисов. Вот последняя известная мне информация на сей счет:

http://lse.sourceforge.net/io/aio.html
What Does Not Work?

AIO read and write on files opened without O_DIRECT (i.e. normal buffered filesystem AIO). On ext2, ext3, jfs, xfs and nfs, these do not return an explicit error, but quietly default to synchronous or rather non-AIO behaviour (i.e io_submit waits for I/O to complete in these cases). For most other filesystems, -EINVAL is reported.
AIO fsync (not supported for any filesystem)
AIO read and write on sockets (doesn't return an explicit error, but quietly defaults to synchronous or rather non-AIO behavior)
AIO read and write on pipes (reports -EINVAL)
Not all devices (including TTY) support AIO (typically return -EINVAL)
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38210126
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Westtrd,

Я думаю, ДохтаР имел в виду не AIO как конкретное АПИ в Линуксе, а асинхронную архитектуру в общем, когда пользовательский код запускает задания и обрабатывает результаты, не используя механизм потоков для ожидания выполнения этих заданий.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38210129
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyпользовательский код запускает задания и обрабатывает результаты,
не используя механизм потоков для ожидания выполнения этих заданий.
Угу, автомагически. "А унутре у нея неонка." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38211065
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Мне тут известны 2 основных направления:
1. epoll для требовательных к латентности решений
2. libev и производные для требовательных к масштабируемости решений

Как правило, универсального ничего нет, решение затачивается индивидуально, особенно в специфичных проектах
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38211220
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WesttrdМне тут известны 2 основных направления:
1. epoll для требовательных к латентности решений
2. libev и производные для требовательных к масштабируемости решений

Это одно и то же направление.
2 - более высокоуровневое и кросплатформенное АПИ над 1 и аналогами в других ОСях.

Это и есть AIO (в широком смысле) про которое говорилось выше.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38211381
Anatoly MoskovskyWesttrdМне тут известны 2 основных направления:
1. epoll для требовательных к латентности решений
2. libev и производные для требовательных к масштабируемости решений

Это одно и то же направление.
2 - более высокоуровневое и кросплатформенное АПИ над 1 и аналогами в других ОСях.

Это и есть AIO (в широком смысле) про которое говорилось выше.
Т.е. фактически это (libev, libevent, boost.asio) самый производительный и по латентности, и по масштабируемости способ обмена данными по обычным TCP/IP сетям?


http://alexott.net/ru/cpp/BoostAsioNotes.html] http://alexott.net/ru/cpp/BoostAsioNotes.html
westtrdВозможно даже выгнать ОС с этих ядер, при желании, важно чтобы irqbalance не использовал их, в остальном не страшно.
Вот как раз asio для не самых критичных по латенси компонентов подходит намного лучше того, что вы перечислили. Для критичных вещей я использую хранилища, аналогов которых в общеизвестных библиотеках нет , которые автоматически выравниваются по границе кеш линии процессора, реализуют безлоковую синхронизацию при необходимости.
А какой профит в % или абсолютных величинах это дает и как примерно это выглядит в реализации?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38211424
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про локфри.

В Бусте 1.53 появились несколько локфри контейнеров, в том числе очередь, которая наиболее часто используется для передачи сообщений между потоками.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38212077
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWesttrd,

Я думаю, ДохтаР имел в виду не AIO как конкретное АПИ в Линуксе, а асинхронную архитектуру в общем, когда пользовательский код запускает задания и обрабатывает результаты, не используя механизм потоков для ожидания выполнения этих заданий.

В принципе да.
Но если идти еще глубже в перфоманс ,
то ожидание асинхронно на несколько сокетов, но сама операция read write
сихронна с точки зрения контекста выполнения.


Если расматривать чистый АИО , асихронным будет все,
так как ядро дернет колбек фунцию (sigaction) процесса , когда поменяется
состояние сокета ( что то придет , что то уйдет).
Этим колбеком можно разбудить другую нить для обработки.
Или продолжить обработку самостоятельно с места в котором нить была
прервана колбеком.
Ядро через ДМА пишет читает адресное пространство процесса
паралельно с выполнением самого процесса.
По факту завешения операции ввода вывода дергает колбек.
Изза ДМА всякие ограничения на работу АИО с кешами файловой системы
итд итп.

Приблизительно так.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38212787
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый производительный способAnatoly Moskovskyпропущено...

Это одно и то же направление.
2 - более высокоуровневое и кросплатформенное АПИ над 1 и аналогами в других ОСях.

Это и есть AIO (в широком смысле) про которое говорилось выше.
Т.е. фактически это (libev, libevent, boost.asio) самый производительный и по латентности, и по масштабируемости способ обмена данными по обычным TCP/IP сетям?


http://alexott.net/ru/cpp/BoostAsioNotes.html]http://alexott.net/ru/cpp/BoostAsioNotes.html] http://alexott.net/ru/cpp/BoostAsioNotes.html
westtrdВозможно даже выгнать ОС с этих ядер, при желании, важно чтобы irqbalance не использовал их, в остальном не страшно.
Вот как раз asio для не самых критичных по латенси компонентов подходит намного лучше того, что вы перечислили. Для критичных вещей я использую хранилища, аналогов которых в общеизвестных библиотеках нет , которые автоматически выравниваются по границе кеш линии процессора, реализуют безлоковую синхронизацию при необходимости.
А какой профит в % или абсолютных величинах это дает и как примерно это выглядит в реализации?
Тут речь идет не о процентах, тут речь идет скорее всего об узкоспециализированных решениях.
И, понятное дело, их применение должно быть обоснованным и уместным. В критических местах, там где битва идет за наносекунды, это становится необходимым.

Пример из личного опыта, одно из кастомизированных хранилищ моего приготовления дает на страничном рингбуфере указателей пропускную способность более 300 млн сообщений в секунду с одним писателем.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38212821
Westtrdсамый производительный способпропущено...

Т.е. фактически это (libev, libevent, boost.asio) самый производительный и по латентности, и по масштабируемости способ обмена данными по обычным TCP/IP сетям?


http://alexott.net/ru/cpp/BoostAsioNotes.html]http://alexott.net/ru/cpp/BoostAsioNotes.html] http://alexott.net/ru/cpp/BoostAsioNotes.html
пропущено...

А какой профит в % или абсолютных величинах это дает и как примерно это выглядит в реализации?
Тут речь идет не о процентах, тут речь идет скорее всего об узкоспециализированных решениях.
И, понятное дело, их применение должно быть обоснованным и уместным. В критических местах, там где битва идет за наносекунды, это становится необходимым.

Пример из личного опыта, одно из кастомизированных хранилищ моего приготовления дает на страничном рингбуфере указателей пропускную способность более 300 млн сообщений в секунду с одним писателем.
А сколько при этом читателей, размер буфера и сколько CPUs/Cores на системе?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38213567
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый производительный способ,

Размер страницы буфера подбирается.
Количество читателей не ограничено, но такие характеристики доступны только на выделенных ядрах в busy spin, при применении нотификаторов такое недоступно, само собой.

Как я уже говорил, решение узкоспециализировано и не рассчитано на массовое применение, его задача - обеспечивать теоретически возможную пропускную способность в критически важных компонентах низколатентных серверных приложений.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38213710
Westtrdсамый производительный способ,

Размер страницы буфера подбирается.
Количество читателей не ограничено, но такие характеристики доступны только на выделенных ядрах в busy spin, при применении нотификаторов такое недоступно, само собой.

Как я уже говорил, решение узкоспециализировано и не рассчитано на массовое применение, его задача - обеспечивать теоретически возможную пропускную способность в критически важных компонентах низколатентных серверных приложений.
Это понятно, что ядра нагружены на 100% и нет переключения потоков.
Интересно вот что. Этот буфер же шарится между ядрами? И вот между сколькими ядрами он у вас шарится при 300млн сообщений (10 тактов = 3 нс на сообщение) и сколько в среднем барьеров памяти на одно сообщение (или сколько сообщений на один барьер)?

Вообще 3нс - это минимальная латентность кэша L2, в лучшем случае шарящегося между двумя соседними ядрами. Т.е. с wait-free вы смогли бы в лучшем случае использовать этот буфер для 2х ядер. А если ядер больше, значит барьеров меньше, чем сообщений.

У вас буфер делиться на несколько буферов по числу ядер и вызывается один барьер на каждый из них, т.е. на пачку сообщений?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38213752
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый производительный способ,

Один из принципов в данном случае - все аффинированные ядра должны разделять одну страницу рингбуфера в кеше процессора, иначе все тухнет.

Для курсоров барьеры не пользуются в принципе, алго позволяет это не делать.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38213779
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Westtrd
Для курсоров барьеры не пользуются в принципе, алго позволяет это не делать.


Я прошу прощения, это как ?

Вы нашли кнопку на процессоре
включения-выключения аут_оф_ордер оптимизации ?

Ури , где у него кнопка!!!! Ури !!! Ури !!!

YouTube Video
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38214063
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаР,

Проприетарные алгоритмы, вся эта оптимизация устраняется на уровне внутренней логики.
Подробности закрыты.

И да, этот момент весьма тщательно оттестирован и работает.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38214327
Westtrdсамый производительный способ,

Один из принципов в данном случае - все аффинированные ядра должны разделять одну страницу рингбуфера в кеше процессора, иначе все тухнет.
Если точнее, то страницу в LLC(L3) CPU.

WesttrdДля курсоров барьеры не пользуются в принципе, алго позволяет это не делать.
Барьеры в любом случае есть, либо явные - либо неявные. Чтобы доставить изменения из L1/L2 в L3.
Неявные, как вариант, это вытеснение данных из L1/L2. Интересно это может быть быстрее, чем явный барьер?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38214345
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый производительный способ,

Согласен.
У меня получается что да.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38217181
WesttrdДля курсоров барьеры не пользуются в принципе, алго позволяет это не делать.
А если это не военная тайно, как вы добились для курсоров отсутствие конкуренции - у каждого читателя свой курсор?
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38217638
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
самый производительный способ,

Это решение описано в специализированных проектах - курсор читателя если они не связаны логически, ДОЛЖЕН быть независимым, и оверхеда тут практически никакого
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38219423
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Westtrdсамый производительный способ,

Это решение описано в специализированных проектах - курсор читателя если они не связаны логически, ДОЛЖЕН быть независимым, и оверхеда тут практически никакого

Оверхедов может быть 2 вида:

1. Ожидание на блокировке ресурса ( всех или части записей из курсора) , пока его кто то меняет.

2. Копирование курсора в промежуточный буфер ( создание версии снапшота ).

Имхо по другому никак.

Можно еще пойти посредине между 1 и 2 , по которому иногда ходит оракл - рестарт стейтмента,
замена курсора на новую версию снапшота при нарушении логической целостности курсора пришедшей из какой то другой нити ( пользовательской сессии) .
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38219811
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаР,

Ни первого, ни второго на читателе нет. Блокировок ресурса на курсоре не возникает, ибо курсор однопоточная сущность. В моей парадигме все блокировки контролируются писателем, но они минимизированы.

Копирования курсора тем более нет. Но это особенности имплементации, специфичные для решения.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38219813
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаР,

Речь идет не об имплементации изменяемого хранилища, а об разновидностях FIFO очередей.
...
Рейтинг: 0 / 0
Потоковый сервер на С++
    #38219870
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Westtrd
В моей парадигме все блокировки контролируются писателем, но они минимизированы.


Да, блокировки должны контролироваться писателями.
Но я не исключаю варианта, когда читатель может взять себе обьект в процессе записи.
Особенно если это структура( класс) с множеством полей.
Поэтому ИМХО читатель обязан смотреть на блокировку установленную писателем.
что бы не прочитать мусор, часть обьекта до изменения , другую часть уже измененную.
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоковый сервер на С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]