
Anatoly
21.07.2017
15:37:58
надо мерять

Alexander
21.07.2017
15:38:10

Berkus
21.07.2017
15:42:11
в общем случае lock-free будут медленнее в случае contention
это ж не бесплатно

Google

Berkus
21.07.2017
15:43:33

Ruslan
21.07.2017
15:44:53
спасибо всем)

cyberzx
21.07.2017
15:48:03

Antony
21.07.2017
15:51:06

cyberzx
21.07.2017
15:51:24
lock-free это не про скорость. lock-free это про гарантии

Arseny
21.07.2017
15:52:02
Что принято использовать если нужен семафор, которого можно ждать в epoll/poll/select?
Я пока умею только писать свою реализацию через eventfd.

cyberzx
21.07.2017
15:52:47
а чем eventfd не устраивает?
я тоже его использую для этих целей

Arseny
21.07.2017
15:55:24
Так не хочется свой семафор писать.
И совсем не хочется в fast path пользоваться eventfd.
То есть хочется пользоваться eventfd только если действительно нужно ждать.
Вообще в результате нужна MPSC очередь, которую можно добавить в epoll
И это как будто совершенно не распространенная структура данных.

Antony
21.07.2017
16:01:43
Сейчас попробую по быстрому рассказать идею:
`
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);
}
}

Google

Владислав
21.07.2017
16:06:16
Ребята, такой вопрос. Есть приложуха, которая берёт инфу с N mysql серверов (в среднем на каждом сервере несколько миллионов записей в бд), копирует данные в целевую БД, заполняет дополнительные таблицы на основе этих данных.
Задачи такие:
1) выполнить копирование и перехуячиывание данных в адекватное время
2) поддерживать актуальность данных, т.е если на одной из сорс БД какая-то запись {удалилилась, обновилась, добавилась}, то она должна {удалиться, обновиться, добавиться} и на таргет БД.
Я уверен, что это достаточно распостранённая задача. Как её решать, куда думать, какие есть паттерны?

Antony
21.07.2017
16:10:47

Alexander
21.07.2017
16:15:31

Дед Пегас
21.07.2017
16:19:10
Надо купить и залить в интернеты.
кекекек

Alexander
21.07.2017
16:19:44
а мне не хочется покупать ?

Antony
21.07.2017
16:20:10

Alexander
21.07.2017
16:20:36

Дед Пегас
21.07.2017
16:21:02

Alexander
21.07.2017
16:21:15

Pavel
21.07.2017
16:21:27

Дед Пегас
21.07.2017
16:21:27
?

Stanislav
21.07.2017
16:25:00

Alexander
21.07.2017
16:25:50

Antony
21.07.2017
16:27:33
Там кстати Glen Fernandes годные замечания сыпет :)

Stanislav
21.07.2017
16:28:12

Arseny
21.07.2017
16:33:49
Хотя видел, например, такое:
https://github.com/facebook/folly/blob/master/folly/io/async/NotificationQueue.h

Antony
21.07.2017
16:39:47

Arseny
21.07.2017
16:44:14

Google

Antony
21.07.2017
16:44:59
таймеры?
расскажите поподробнее про проблему
постараюсь через пару часов ответить :)

Andrei
21.07.2017
17:19:42
Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.
eventfd например.

Arseny
21.07.2017
17:28:29

Azoyan
21.07.2017
17:33:02
Парни, а серваки на gpu есть?

Evgeniy
21.07.2017
17:33:18

Azoyan
21.07.2017
17:33:37
Ну коннекты обрабатывать гпц

cyberzx
21.07.2017
17:34:20
а смысл?
и что ты имеешь в виду под обработкой коннектов? парсинг пакетов?

Azoyan
21.07.2017
17:34:45
Не знаю
Ну да
Я просто спросил

cyberzx
21.07.2017
17:35:16
CPU с этим справляется вполне хорошо

Azoyan
21.07.2017
17:35:22
Ну ок

Andrei
21.07.2017
17:35:30
@arseny Вернее я имел в виду, в чём проблема с eventfd? Мы обработали из epoll-а весь io, и прежде чем уснуть проверили очередь, и только если там пусто, пошли в epoll_wait, затем первый же продьюсер, который обнаружил, что очередь пустая, зафайрил eventfd

Mikhail
21.07.2017
17:35:33

Azoyan
21.07.2017
17:35:55
Не, вэб север

Google

Andrei
21.07.2017
17:36:11
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.

Дед Пегас
21.07.2017
17:36:12
У гпу нет доступа до туда.
На этом всё.

cyberzx
21.07.2017
17:37:23

Andrei
21.07.2017
17:37:27
Можно еще сигнал послать :) Это тоже epoll прервёт.

Admin
ERROR: S client not available

cyberzx
21.07.2017
17:38:49

Andrei
21.07.2017
17:38:54
Я вот ничего плохого в записи в eventfd не вижу. Один фиг консьюмера КАК-ТО надо разбудить.

Mikhail
21.07.2017
17:39:59

Дед Пегас
21.07.2017
17:40:02

Andrei
21.07.2017
17:40:13
Особенно, если epoll в ET режиме.

cyberzx
21.07.2017
17:40:25

Дед Пегас
21.07.2017
17:40:58
фаще это оффтоп
Хороший, сознательный гражданин!

Arseny
21.07.2017
17:47:42
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Ну так да. Если хочется делать write только тогда когда консьюмер действительно ждет, то получается что-то вроде семафора, но внутри не futex, а eventfd.
Меня удивляет, что такой абстракции в библиотеках обычно нет.
Более того, если речь идет о крутой mpsc queue, то интуитивно кажется, что защищать ее снаружи семафором (на futex или eventfd) = терять большую часть ее крутости. Эффективнее должно быть как-то встроить eventfd внутрь очереди. Таких очередей тоже как будто нету.

Andrei
21.07.2017
17:48:39
А, стоп, там снаружи локфри mpsc?
Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.


Arseny
21.07.2017
18:12:17
расскажите поподробнее про проблему
Опишу еще раз всю ситуацию
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 в саму очередь.
Но таких очередей тоже что-то не видно.


Alexander
21.07.2017
18:15:45
у кого-нибудь на работе стояла задача из разряда "Найти дистанцию редактирования между двумя последовательностями" ?

Google

Alexander
21.07.2017
18:16:38
или просто найти расстояние между двумя последовательностями?

Arseny
21.07.2017
18:18:32

Berkus
21.07.2017
18:19:00

Arseny
21.07.2017
18:19:11

Berkus
21.07.2017
18:19:18
любой дифф возьми - это оно
или OT

Alexander
21.07.2017
18:19:41

Killua
21.07.2017
18:20:13
Извраты собеседований, не?

Alexander
21.07.2017
18:20:28

Killua
21.07.2017
18:20:43
Потому что давно всё написано.

Arseny
21.07.2017
18:20:48

Andre
21.07.2017
18:20:50
классическая задача по ДП, извратиться там можно вопросами "а как уменьшить память?"

Alexander
21.07.2017
18:21:19

Killua
21.07.2017
18:21:47
В гугле, разумеется.

Arseny
21.07.2017
18:22:14

Alexander
21.07.2017
18:22:38