Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
WesttrdДохтаРпропущено... Я сказал помещается ( можно впихнуть), реально если важен перфоманс то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора). Можно нарисовать велосипед на тему select на SIGIO. В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) . Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов. Текущая имплементация aio для сокетов не является асинхронной Имплементация где? И как asynchronous I/O (AIO) может быть не asynchronous? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 17:47 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
MedEx, Ну щас все будут перечислять что знают - и boost и qt и glib... Qt - это слишком тяжёлая штука и оверхеда несёт с собой прилично. Нужно что-то более приземлённое. Лучшей пусть свой велосипед лабает вокруг libpthread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 17:53 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Имплементация где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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 22:48 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrd, Я думаю, ДохтаР имел в виду не AIO как конкретное АПИ в Линуксе, а асинхронную архитектуру в общем, когда пользовательский код запускает задания и обрабатывает результаты, не используя механизм потоков для ожидания выполнения этих заданий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 23:29 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyпользовательский код запускает задания и обрабатывает результаты, не используя механизм потоков для ожидания выполнения этих заданий. Угу, автомагически. "А унутре у нея неонка." (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 23:32 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Мне тут известны 2 основных направления: 1. epoll для требовательных к латентности решений 2. libev и производные для требовательных к масштабируемости решений Как правило, универсального ничего нет, решение затачивается индивидуально, особенно в специфичных проектах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2013, 13:48 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
WesttrdМне тут известны 2 основных направления: 1. epoll для требовательных к латентности решений 2. libev и производные для требовательных к масштабируемости решений Это одно и то же направление. 2 - более высокоуровневое и кросплатформенное АПИ над 1 и аналогами в других ОСях. Это и есть AIO (в широком смысле) про которое говорилось выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2013, 14:55 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
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 для не самых критичных по латенси компонентов подходит намного лучше того, что вы перечислили. Для критичных вещей я использую хранилища, аналогов которых в общеизвестных библиотеках нет , которые автоматически выравниваются по границе кеш линии процессора, реализуют безлоковую синхронизацию при необходимости. А какой профит в % или абсолютных величинах это дает и как примерно это выглядит в реализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2013, 15:43 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Про локфри. В Бусте 1.53 появились несколько локфри контейнеров, в том числе очередь, которая наиболее часто используется для передачи сообщений между потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2013, 15:58 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWesttrd, Я думаю, ДохтаР имел в виду не AIO как конкретное АПИ в Линуксе, а асинхронную архитектуру в общем, когда пользовательский код запускает задания и обрабатывает результаты, не используя механизм потоков для ожидания выполнения этих заданий. В принципе да. Но если идти еще глубже в перфоманс , то ожидание асинхронно на несколько сокетов, но сама операция read write сихронна с точки зрения контекста выполнения. Если расматривать чистый АИО , асихронным будет все, так как ядро дернет колбек фунцию (sigaction) процесса , когда поменяется состояние сокета ( что то придет , что то уйдет). Этим колбеком можно разбудить другую нить для обработки. Или продолжить обработку самостоятельно с места в котором нить была прервана колбеком. Ядро через ДМА пишет читает адресное пространство процесса паралельно с выполнением самого процесса. По факту завешения операции ввода вывода дергает колбек. Изза ДМА всякие ограничения на работу АИО с кешами файловой системы итд итп. Приблизительно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2013, 03:33 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
самый производительный способ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 млн сообщений в секунду с одним писателем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2013, 13:35 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
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 на системе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2013, 13:47 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
самый производительный способ, Размер страницы буфера подбирается. Количество читателей не ограничено, но такие характеристики доступны только на выделенных ядрах в busy spin, при применении нотификаторов такое недоступно, само собой. Как я уже говорил, решение узкоспециализировано и не рассчитано на массовое применение, его задача - обеспечивать теоретически возможную пропускную способность в критически важных компонентах низколатентных серверных приложений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2013, 19:58 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrdсамый производительный способ, Размер страницы буфера подбирается. Количество читателей не ограничено, но такие характеристики доступны только на выделенных ядрах в busy spin, при применении нотификаторов такое недоступно, само собой. Как я уже говорил, решение узкоспециализировано и не рассчитано на массовое применение, его задача - обеспечивать теоретически возможную пропускную способность в критически важных компонентах низколатентных серверных приложений. Это понятно, что ядра нагружены на 100% и нет переключения потоков. Интересно вот что. Этот буфер же шарится между ядрами? И вот между сколькими ядрами он у вас шарится при 300млн сообщений (10 тактов = 3 нс на сообщение) и сколько в среднем барьеров памяти на одно сообщение (или сколько сообщений на один барьер)? Вообще 3нс - это минимальная латентность кэша L2, в лучшем случае шарящегося между двумя соседними ядрами. Т.е. с wait-free вы смогли бы в лучшем случае использовать этот буфер для 2х ядер. А если ядер больше, значит барьеров меньше, чем сообщений. У вас буфер делиться на несколько буферов по числу ядер и вызывается один барьер на каждый из них, т.е. на пачку сообщений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2013, 23:07 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
самый производительный способ, Один из принципов в данном случае - все аффинированные ядра должны разделять одну страницу рингбуфера в кеше процессора, иначе все тухнет. Для курсоров барьеры не пользуются в принципе, алго позволяет это не делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 00:03 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrd Для курсоров барьеры не пользуются в принципе, алго позволяет это не делать. Я прошу прощения, это как ? Вы нашли кнопку на процессоре включения-выключения аут_оф_ордер оптимизации ? Ури , где у него кнопка!!!! Ури !!! Ури !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 01:17 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаР, Проприетарные алгоритмы, вся эта оптимизация устраняется на уровне внутренней логики. Подробности закрыты. И да, этот момент весьма тщательно оттестирован и работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 11:16 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrdсамый производительный способ, Один из принципов в данном случае - все аффинированные ядра должны разделять одну страницу рингбуфера в кеше процессора, иначе все тухнет. Если точнее, то страницу в LLC(L3) CPU. WesttrdДля курсоров барьеры не пользуются в принципе, алго позволяет это не делать. Барьеры в любом случае есть, либо явные - либо неявные. Чтобы доставить изменения из L1/L2 в L3. Неявные, как вариант, это вытеснение данных из L1/L2. Интересно это может быть быстрее, чем явный барьер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 13:29 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
самый производительный способ, Согласен. У меня получается что да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2013, 13:39 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
WesttrdДля курсоров барьеры не пользуются в принципе, алго позволяет это не делать. А если это не военная тайно, как вы добились для курсоров отсутствие конкуренции - у каждого читателя свой курсор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2013, 14:07 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
самый производительный способ, Это решение описано в специализированных проектах - курсор читателя если они не связаны логически, ДОЛЖЕН быть независимым, и оверхеда тут практически никакого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2013, 17:13 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrdсамый производительный способ, Это решение описано в специализированных проектах - курсор читателя если они не связаны логически, ДОЛЖЕН быть независимым, и оверхеда тут практически никакого Оверхедов может быть 2 вида: 1. Ожидание на блокировке ресурса ( всех или части записей из курсора) , пока его кто то меняет. 2. Копирование курсора в промежуточный буфер ( создание версии снапшота ). Имхо по другому никак. Можно еще пойти посредине между 1 и 2 , по которому иногда ходит оракл - рестарт стейтмента, замена курсора на новую версию снапшота при нарушении логической целостности курсора пришедшей из какой то другой нити ( пользовательской сессии) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2013, 20:00 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаР, Ни первого, ни второго на читателе нет. Блокировок ресурса на курсоре не возникает, ибо курсор однопоточная сущность. В моей парадигме все блокировки контролируются писателем, но они минимизированы. Копирования курсора тем более нет. Но это особенности имплементации, специфичные для решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2013, 10:10 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаР, Речь идет не об имплементации изменяемого хранилища, а об разновидностях FIFO очередей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2013, 10:12 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Westtrd В моей парадигме все блокировки контролируются писателем, но они минимизированы. Да, блокировки должны контролироваться писателями. Но я не исключаю варианта, когда читатель может взять себе обьект в процессе записи. Особенно если это структура( класс) с множеством полей. Поэтому ИМХО читатель обязан смотреть на блокировку установленную писателем. что бы не прочитать мусор, часть обьекта до изменения , другую часть уже измененную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2013, 10:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38212077&tid=2020113]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 298ms |

| 0 / 0 |
