cyberzx 🇷🇺
я тоже его использую для этих целей
Arseny
Так не хочется свой семафор писать. И совсем не хочется в fast path пользоваться eventfd. То есть хочется пользоваться eventfd только если действительно нужно ждать.
Arseny
Вообще в результате нужна MPSC очередь, которую можно добавить в epoll И это как будто совершенно не распространенная структура данных.
🐙 Antony
Вообще в результате нужна MPSC очередь, которую можно добавить в epoll И это как будто совершенно не распространенная структура данных.
Делал подобное на Boost.Asio. Для этого заводил атомарную переменную под флаг, который использовался для проверки события. Каждый кто с флагом работал, при изменения/чтении смотрел, надо ли запускать подзадачу. Есть немного кода вот тут http://apolukhin.github.io/Boost-Cookbook/second_edition.html#Chapter06-recipe6-part1 но боюсь без обяснений он не очень поможет.
🐙 Antony
Сейчас попробую по быстрому рассказать идею: ` void set_new_value(T value) { static std::atomic i = 120; if (i.swap(value) == required_value) { io_service_instance.post(task_that_must_be_executed_on_condition); } }
vladislav
Ребята, такой вопрос. Есть приложуха, которая берёт инфу с N mysql серверов (в среднем на каждом сервере несколько миллионов записей в бд), копирует данные в целевую БД, заполняет дополнительные таблицы на основе этих данных. Задачи такие: 1) выполнить копирование и перехуячиывание данных в адекватное время 2) поддерживать актуальность данных, т.е если на одной из сорс БД какая-то запись {удалилилась, обновилась, добавилась}, то она должна {удалиться, обновиться, добавиться} и на таргет БД. Я уверен, что это достаточно распостранённая задача. Как её решать, куда думать, какие есть паттерны?
Крылатый
Надо купить и залить в интернеты.
Крылатый
кекекек
🐙 Antony
Еще не вышло :) Сейчас второе чтение - надо исправить недочёты, найденные ревьюерами.
Крылатый
Надо как Ъ пираты спиратить до выхода!
Крылатый
🤔
Stanislav
а зачем ждешь? :)
🐙 Antony
Там кстати Glen Fernandes годные замечания сыпет :)
Stanislav
а тьфу, думал Антон пишет 😂
Arseny
В общем один из поиковиков выдаёт ссылку прям на книгу в pdf формате. Там можно прочесть нужную главу с объяснениями. Но не уверен что такой подход на 100% вам подойдёт
Вроде по коду более-менее понятно что происходит. Но у меня несколько другого плана проблема. Есть тьма реализаций разнообразных concurrent queue, но я не видел ни одной, которую можно добавить в poll. Что-то похожее наверняка есть во внутренностях всяких asio и libev, но самостоятельных реализаций я не видел и не очень понимаю почему.
Arseny
Хотя видел, например, такое: https://github.com/facebook/folly/blob/master/folly/io/async/NotificationQueue.h
Arseny
Дорого. std::conditional_variable работает как правило быстрее, чем epoll+что-то ещё
А какая альтернатива если нужно общаться с потоком в котором epoll крутится?
🐙 Antony
таймеры?
🐙 Antony
расскажите поподробнее про проблему
🐙 Antony
постараюсь через пару часов ответить :)
Andrei
А какая альтернатива если нужно общаться с потоком в котором epoll крутится?
Блокироваться на epoll-е, но сперва заводить таймер. Если из epoll_wait вышли с дескриптором таймера — опрашиваем какой-нибудь blocking_queue на том же СV.
Andrei
Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.
Andrei
eventfd например.
Arseny
Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.
Не хочется так часто будить поток просто так. Да, это как раз через eventfd сейчас и реализовано. Но не хочется и не нужно писать что-то в eventfd на каждое добавление в очередь. В оптимальном случае, когда оба потока достаточно загружены в очереди всегда что-то есть и eventfd вообще не должен использоваться. Как и нормальный семафор, который если не нужно ждать просто одну переменную атомарно меняет и не вызывает системные функции.
Ivan
Парни, а серваки на gpu есть?
Ivan
Ну коннекты обрабатывать гпц
cyberzx 🇷🇺
а смысл?
cyberzx 🇷🇺
и что ты имеешь в виду под обработкой коннектов? парсинг пакетов?
Ivan
Не знаю
Ivan
Ну да
Ivan
Я просто спросил
cyberzx 🇷🇺
CPU с этим справляется вполне хорошо
Ivan
Ну ок
Andrei
@arseny Вернее я имел в виду, в чём проблема с eventfd? Мы обработали из epoll-а весь io, и прежде чем уснуть проверили очередь, и только если там пусто, пошли в epoll_wait, затем первый же продьюсер, который обнаружил, что очередь пустая, зафайрил eventfd
Mikhail
Парни, а серваки на gpu есть?
ты имеешь с виду графические станции?
Ivan
Не, вэб север
Andrei
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Крылатый
У гпу нет доступа до туда.
Крылатый
На этом всё.
Andrei
Можно еще сигнал послать :) Это тоже epoll прервёт.
Andrei
И что в этом плохого? Зачем обязательно спать на поллинге?
Спать на поллинге — это хорошо. Но вопрос был в том, как лишний раз write не делать в eventfd
cyberzx 🇷🇺
У гпу нет доступа до туда.
Ну можно делать на GPU дешифрацию трафика, например. Но это не нужно и на CPU вполне быстро
Andrei
Я вот ничего плохого в записи в eventfd не вижу. Один фиг консьюмера КАК-ТО надо разбудить.
Andrei
Особенно, если epoll в ET режиме.
cyberzx 🇷🇺
тебе просто хочется пообщаться?
Нет. Терпеть не могу общаться. Я чёртов социофоб
Крылатый
фаще это оффтоп
Крылатый
Хороший, сознательный гражданин!
Arseny
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Ну так да. Если хочется делать write только тогда когда консьюмер действительно ждет, то получается что-то вроде семафора, но внутри не futex, а eventfd. Меня удивляет, что такой абстракции в библиотеках обычно нет. Более того, если речь идет о крутой mpsc queue, то интуитивно кажется, что защищать ее снаружи семафором (на futex или eventfd) = терять большую часть ее крутости. Эффективнее должно быть как-то встроить eventfd внутрь очереди. Таких очередей тоже как будто нету.
Andrei
А, стоп, там снаружи локфри mpsc?
Andrei
Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.
Arseny
расскажите поподробнее про проблему
Опишу еще раз всю ситуацию TLDR Откуда брать mpsc queue, которую можно ждать в epoll или почему таких нигде нету? Есть несколько потоков, в каждом из них крутится epoll. Потокам нужно слать друг другу сообщения. Когда потоку приходит сообщение он должен пробуждаться из epoll-а. Разбудить поток можно разными способами: eventfd, pthread_signal, pipe наконец. Пробуждаться каждые x миллисекунд и проверять очередь так себе вариант. Как именно будить имхо не очень важно, системный вызов и пробуждение потока это уже относительно долго. Но допустим используется eventfd, как будто созданный именно для этого. Для отправки сообщений хочется использовать mpsc queue. При этом ее нужно как-то скрестить с eventfd, чтобы fast path в eventfd не писал вообще. То есть хочется хочет делать write в eventfd только когда consumer действительно спит в epoll. Это можно сделать обернув очередь в семафор внутри которого не futex, а eventfd. Но нигде не видел реализации такого семафора. Более того интуитивно кажется что оборачивать очередь в семафор не оптимально, оптимальней встроить eventfd в саму очередь. Но таких очередей тоже что-то не видно.
Arseny
Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.
lockfree spsc queue я как-то с eventfd скрестил, вроде сносно вышло. Интересно чужие реализации посмотреть, но где они?
Berkus
levenshtein?
Arseny
Именно по работе?
Berkus
любой дифф возьми - это оно
Berkus
или OT
Killua
Извраты собеседований, не?
Killua
Потому что давно всё написано.
Arseny
Я как-то вот это реализовывал http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.11.3463
Andre
классическая задача по ДП, извратиться там можно вопросами "а как уменьшить память?"
Killua
В гугле, разумеется.
Arseny
Сейчас попробую найти. Там был marathon match на topcoder, там куча реализаций.
Killua
А что не так-то?
Vladislav
А что не так-то?
то, что позиция "алгоритмы нужны только для собеседований и все давно написано" - очень наивная
Killua
Результатов: примерно 345 000
Berkus
Результатов: примерно 345 000
о, а вот и approximate match!
Killua
Скиньте канал для новичков тогда уж, плз.
Berkus
#supapro
Ivan
Approximate regexp?
Ivan
agrep это ты имел ввиду?