powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Демон под линукс
18 сообщений из 43, страница 2 из 2
Демон под линукс
    #39381497
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisa, как альтернативу линуксовым pipe можешь посмотреть на родные средства С++ :
std::queue - очередь
std::thread - создание потоков
std::mutex - синхронизация доступа из разных потоков
std::condition_variable - пробуждение потока
...
Рейтинг: 0 / 0
Демон под линукс
    #39381626
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisa 1 : Create a direct path handle with OCI_DirPathCreate()
2 : Set (optional) some direct path load attributes
3 : Describe the columns to load with OCI_DirPathSetColumn()
4 : Populate data with OCI_DirPathSetEntry()
5 : Convert the data with OCI_DirPathConvert()
6 : Load the data into the database with OCI_DirPathLoad()
7 : Repeat step 4,5,6 + reset the stream with OCI_DirPathReset() until all rows has been loaded
8 : Commit the load with OCI_DirPathFinish()
9 : Free the direct path handle with OCI_DirPathFree()Ну и в каком месте тут требуется какая-то асинхронность, формирование пачек по хитровывернутому алгоритму?
...
Рейтинг: 0 / 0
Демон под линукс
    #39381945
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovnagisa 1 : Create a direct path handle with OCI_DirPathCreate()
2 : Set (optional) some direct path load attributes
3 : Describe the columns to load with OCI_DirPathSetColumn()
4 : Populate data with OCI_DirPathSetEntry()
5 : Convert the data with OCI_DirPathConvert()
6 : Load the data into the database with OCI_DirPathLoad()
7 : Repeat step 4,5,6 + reset the stream with OCI_DirPathReset() until all rows has been loaded
8 : Commit the load with OCI_DirPathFinish()
9 : Free the direct path handle with OCI_DirPathFree()Ну и в каком месте тут требуется какая-то асинхронность, формирование пачек по хитровывернутому алгоритму?
пройдите по ссылкам там и примеры есть

размер пачки задается тут
Код: plaintext
1.
dp = OCI_DirPathCreate(tbl, NULL, NUM_COLS, nb_rows);


где NUM_COLS - количество колонок, а nb_rows - количество записей в пачке
у меня, максимальная скорость достигается при размере пачки 4000
...
Рейтинг: 0 / 0
Демон под линукс
    #39381946
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tnagisaя вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ?
Нет.

Я про sockfd из которого ты принимаешь пакеты
Код: plaintext
1.
recvfrom(sockfd,me .... 


Это прием из сети UDP пакетов, у sockfd есть буфер, в который входящий пакет сначала кладется, затем твоя прога его оттуда читает recvfrom(), если твоя прога не будет успевать читать и буфер переполнится, то новые пакеты будут просто удалятся, так устроен UDP.

А твой FIFO это уже следующая цепочка, со своими буферами и прочими настройками. Как он работает я не знаю, но варианта всего два: либо будут потери, либо будет зависание на записи пока место не появится куда писать.
спасибо.
значит изначальная схема с тремя звеньями была верной.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381947
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovnagisaAPI DirectPath это специальный интерфейс для загрузки

Проблема в том, что вы и к пределу скорости обычного интерфейса не подошли, что говорит о
кривизне вашего приложения. Но вольному воля.

да я как бы не претендую, поправьте меня примером который обычным интерфейсом грузит хотя бы 10К
...
Рейтинг: 0 / 0
Демон под линукс
    #39382197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaпоправьте меня примером который обычным интерфейсом грузит хотя бы 10К

Какое слово из "использовать Array DML и отключить autocommit" Вы не поняли?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Демон под линукс
    #39382202
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую скорость загрузки на Вашем оборудовании показывает SQLLoader без режима direct?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Демон под линукс
    #39382245
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaзначит изначальная схема с тремя звеньями была верной.
только неясно, зачем третье звено
...
Рейтинг: 0 / 0
Демон под линукс
    #39382336
nagisaDima Tпропущено...

Нет.

Я про sockfd из которого ты принимаешь пакеты
Код: plaintext
1.
recvfrom(sockfd,me .... 


Это прием из сети UDP пакетов, у sockfd есть буфер, в который входящий пакет сначала кладется, затем твоя прога его оттуда читает recvfrom(), если твоя прога не будет успевать читать и буфер переполнится, то новые пакеты будут просто удалятся, так устроен UDP.

А твой FIFO это уже следующая цепочка, со своими буферами и прочими настройками. Как он работает я не знаю, но варианта всего два: либо будут потери, либо будет зависание на записи пока место не появится куда писать.
спасибо.
значит изначальная схема с тремя звеньями была верной.

трудно сказать, что у тебя было верно, но задача эта решается так

у тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок
у тебя есть процесс (или тред) писатель пакетов в Oracle - гарантий там особых нет никаких, ибо завязано на дисковую подсистему, это понятно

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

делать обмен между процессами это через PIPE, сокеты и подобное - можно, но не нужно, ибо там на каждый пакет будет поход в ядро (переключение контекста), а это крайне не дешево

как нужно? нужно работать через shm (shared memory) или memory mapped files. ну и lock free алгоритмы, простейший случай
которых - circular buffer или LMAX Disruptor - можно в интернетах почитать, что это такое (там можно многоие миллионы сообщений передавать в секунду между процессами).

и да, Oracle. для Direct Path уровень гранулярности - таблица. или партиция (субпартиция) - которая, по сути, является отдельной физической таблицей.

т.е. если тебе нужно нарастить скорость записи в Oracle - то таблицу назначение нужно распартицировать и писать в каждую партицию отдельной сессией/процессом Oracle. практические замеры даже на commodity железе показали почти линейный рост вплоть до 10 параллельных писателей, хотя там все обычно ограничено дисковой подсистемой, но и коммуникационные издержки чисто у Oracle очень велики (отсюда и up to 10x рост)


но главный мессадж данного поста - внутреннее межпроцессное взаимодействие нужно делать через mmap и lock free circular buffer / queue, это самый скоростной способ IPC
...
Рейтинг: 0 / 0
Демон под линукс
    #39382414
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок

Не факт, что и это ему нужно.
Иногда можно просто читать исходные данные в том темпе, в котором их может обрабатывать писатель в Oracle.
Т.е. хватить обычного SQLLOader, обрабатывающего linux pipe на входе.
Уже наверное раз 10 сказали это ТС-у, но толку ноль...
...
Рейтинг: 0 / 0
Демон под линукс
    #39382531
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivавтору тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок

Не факт, что и это ему нужно.
Иногда можно просто читать исходные данные в том темпе, в котором их может обрабатывать писатель в Oracle.
Т.е. хватить обычного SQLLOader, обрабатывающего linux pipe на входе.
Уже наверное раз 10 сказали это ТС-у, но толку ноль...

ну, если у него не UDP, то стандартные TCP nagle алгоритмы могут привести к очень неожиданным поведениям приложения.
а так конечно да, можно просто буфер приемника привинтить гигантского размера и обойтись одним тредом.

и даже если делать несколько писателей - собственно в отдельный тред можно отправлять только вызов OCI_DirPathLoad (ну или fork/spawn sqlldr), остальные вызовы работают относительно быстро.
...
Рейтинг: 0 / 0
Демон под линукс
    #39382790
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchну, если у него не UDP
топикстартер замерял потери пакетов. 99.9% - у него UDP

собсвенно и предлагается максимально увеличить размер буфера в ядре.
мож второй демон и не понадобится

как межпроцессное взаимодействие реализовано - топикстартер не сознался,
подозреваю, что до этого ещё не дошло
...
Рейтинг: 0 / 0
Демон под линукс
    #39382795
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилdbpatchну, если у него не UDP
топикстартер замерял потери пакетов. 99.9% - у него UDP

ну, на канальном уровне у TCP тоже потери бывают, и их вполне можно измерить.
...
Рейтинг: 0 / 0
Демон под линукс
    #39382807
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкак межпроцессное взаимодействие реализовано - топикстартер не сознался, подозреваю, что
до этого ещё не дошло

У меня таки теплится надежда, что ему и потоков хватит. Они между собой всё же попроще
взаимодействуют...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Демон под линукс
    #39382817
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchИзопропилпропущено...

топикстартер замерял потери пакетов. 99.9% - у него UDP

ну, на канальном уровне у TCP тоже потери бывают, и их вполне можно измерить.
на это я 0.1% оставил
...
Рейтинг: 0 / 0
Демон под линукс
    #39382843
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaя сейчас принимаю пакеты при помощи
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))
и затем
recvfrom (sockfd,me ....
Уже понятно что UDP
...
Рейтинг: 0 / 0
Демон под линукс
    #39385365
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сам ты не читательnagisaпропущено...

спасибо.
значит изначальная схема с тремя звеньями была верной.

трудно сказать, что у тебя было верно, но задача эта решается так

у тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок
у тебя есть процесс (или тред) писатель пакетов в Oracle - гарантий там особых нет никаких, ибо завязано на дисковую подсистему, это понятно

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

делать обмен между процессами это через PIPE, сокеты и подобное - можно, но не нужно, ибо там на каждый пакет будет поход в ядро (переключение контекста), а это крайне не дешево

как нужно? нужно работать через shm (shared memory) или memory mapped files. ну и lock free алгоритмы, простейший случай
которых - circular buffer или LMAX Disruptor - можно в интернетах почитать, что это такое (там можно многоие миллионы сообщений передавать в секунду между процессами).

и да, Oracle. для Direct Path уровень гранулярности - таблица. или партиция (субпартиция) - которая, по сути, является отдельной физической таблицей.

т.е. если тебе нужно нарастить скорость записи в Oracle - то таблицу назначение нужно распартицировать и писать в каждую партицию отдельной сессией/процессом Oracle. практические замеры даже на commodity железе показали почти линейный рост вплоть до 10 параллельных писателей, хотя там все обычно ограничено дисковой подсистемой, но и коммуникационные издержки чисто у Oracle очень велики (отсюда и up to 10x рост)


но главный мессадж данного поста - внутреннее межпроцессное взаимодействие нужно делать через mmap и lock free circular buffer / queue, это самый скоростной способ IPC

Полностью согласен с автором, но есть 5 копеек.

Сетевой слушатель непрерывно заполняет области разделяемой памяти
по факту заполнения область обрабатывает писатель в базу, а сетевой слушатель
переходит к следующей области разделяемой памяти.
Таким образом на один сетевой слушатель можно повесить несколько
писателей в базу в зависимости от разности скоростей сетевого приема и записи в БД.
В параноидальном случае нужно завести 2 сетевые карты на разных PCI шинах.
...
Рейтинг: 0 / 0
Демон под линукс
    #39390725
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги д0kХ и сам ты не читатель !
Спасибо за советы!

C использованием shm разобрался, сделал кольцевой буфер, автоподстройку под количество пакетов итд итп
короче все вышло отлично!
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Демон под линукс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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