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

сейчас поток данных слабый - те до 1000 пакетов в секунду и хватает обычного двухпроцессного демона:
те демон контроллер и дочерний процесс-обработчик который принимает пакеты и кладет их в базу, периодически делая коммит

надо улучшить демон - те обеспечить возможность приема до 100'000 пакетов в секунду
соответственно получается надо выделить явно процессы приема и парсинга пакетов и процесса записи в базу с применением DirectPath

DirectPath уже оттестил, получается до 250К записей в секунду кладется без напряга

по схеме получается 3 части:
1. receiver
2. FIFO
3. writer

вопрос в том как это правильно пишется - те организация FIFO и использование его процессами приема и записи ?
прошу профессионалов подсказать - на что обратить внимание, и что следует избегать.

логика процессов будет такая
1. receiver принимает, парсит и кладет пакеты в очередь FIFO, попутно определяя скорость их поступления в секунду.
2. writer формирует пакет DirectPath размер которого определяется скоростью и осуществляет загрузку.

те к примеру пришло за последнюю секунду 1452 пакета
соответственно DirectPath формирует блок в 1452 записи - те явно загружая, что пришло за -1 секунду
те текущая секунда уже грузится в FIFO а предыдущая льется в базу


ps: на сях пишу эпизодически, соответственно прошу не пинать
...
Рейтинг: 0 / 0
Демон под линукс
    #39380762
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisa,
вряд ли это вообще надо так делать.
...
Рейтинг: 0 / 0
Демон под линукс
    #39380782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял зачем скорость определять? Для статистики разве что.
Обработка очереди должна начинаться сразу как только туда что-то попало. Т.е. поток обработки висит в ожидании, пишущий поток при каждой записи в очередь будит поток обработки, тот просыпается, все что есть в очереди отправляет пачкой в БД, и так работает пока очередь не опустеет, затем снова засыпает.
...
Рейтинг: 0 / 0
Демон под линукс
    #39380853
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Про потоки автор как-то, видимо, скептически настроен...
...
Рейтинг: 0 / 0
Демон под линукс
    #39380880
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, как receiver и writer данными обмениваются
...
Рейтинг: 0 / 0
Демон под линукс
    #39380881
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima T,

Про потоки автор как-то, видимо, скептически настроен...
Я в линуксах не силен, может там есть какое API чтобы между процессами очередь организовать, если не путаю в линуксе изначально вообще потоков не было, после добавили. Может он просто про них не в курсе.

Я так понял он отдельными процессами это решил сделать
nagisaвопрос в том как это правильно пишется - те организация FIFO и использование его процессами приема и записи ?
ИМХО с потоками проще.
...
Рейтинг: 0 / 0
Демон под линукс
    #39380891
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tможет там есть какое API чтобы между процессами очередь организовать
pipe самый обыкновенный что в никсах что в винде
...
Рейтинг: 0 / 0
Демон под линукс
    #39381003
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далеко не факт, что вообще нужно разделать читателя источника и писателя в БД.
Поскольку обработка скорее всего будет никакая, то задача будет IO bound, и толку от введения в архитектуру двух потоков/процессов чтения и записи никакого не будет.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381013
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПоскольку обработка скорее всего будет никакая, то задача будет IO bound, и толку от введения в архитектуру двух потоков/процессов чтения и записи никакого не будет.
Зависит от того умеет ли клиент оракла работать в асинхронном режиме
...
Рейтинг: 0 / 0
Демон под линукс
    #39381022
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиенту этого и не надо.
Умеет ли приложение, которому этого тоже не надо - вопрос уже к автору.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381034
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DirectPath сам внутри очередь имеет вроде как
...
Рейтинг: 0 / 0
Демон под линукс
    #39381083
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНе понял зачем скорость определять? Для статистики разве что.
Обработка очереди должна начинаться сразу как только туда что-то попало. Т.е. поток обработки висит в ожидании, пишущий поток при каждой записи в очередь будит поток обработки, тот просыпается, все что есть в очереди отправляет пачкой в БД, и так работает пока очередь не опустеет, затем снова засыпает.

сейчас оно почти так и сделано - те пакет пришел и тут же в базу
потом коммит каждую секунду. но потолок этой технологии 3500 записей в секунду.

соответственно надо использовать другой подход - те API DirectPath
и это требует сразу явного объявления объема блока загрузки.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381085
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivDima T,

Про потоки автор как-то, видимо, скептически настроен...
да я никак еще не настроен, как я уже сказал - пишу эпизодически и соответственно какие-то вещи могу просто не знать тк не сталкивался.

сейчас хочу оттестить штатное FIFO - cм http://www.intuit.ru/studies/courses/2249/52/lecture/1554?page=6

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

если будет плохо справляться - тогда и искать узкое место.

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

Но перед этим - использовать Array DML и отключить autocommit.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Демон под линукс
    #39381244
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилnagisaпросто хочу советов - те каких ошибок делать не стоит
сначала без выпендрёжу сделать через DirectPath в одном процессе.
если будет плохо справляться - тогда и искать узкое место.
Главная потенциальная ошибка - преждевременная оптимизация

вот смотрите:

1. тк мы не знаем сколько пакетов придет то мы накапливаем пакеты в буфер в течении 1с
их может придти 100 а может 100000 или больше, рассмотрим плохой случай со 100к пакетов

2. по итогам получили количество:
далее
затраты на подготовку сессии DirectPath - ~350мкс
затраты на загрузку - ~400мс
затраты на завершение сессии DirectPath - ~750мкс

если интенсивность поступления пакетов прежняя - те 100к в секунду, то мы потеряем ~40к пакетов


соответственно необходимость в разделении процессов приема пакетов и их записи явная


я сейчас принимаю пакеты при помощи
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))
и затем
recvfrom(sockfd,me ....

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

системные настройки ограничивают максимальный размер буфера, изменяется или в конфиге или командой
sysctl -w net.core.rmem_max=

а для сокета можно выставить значение опции SO_RCVBUF

PS какие препятствия для тьюнинга хорошо нагруженной системы?
...
Рейтинг: 0 / 0
Демон под линукс
    #39381299
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaзатраты на подготовку сессии DirectPath - ~350мкс
затраты на загрузку - ~400мс
затраты на завершение сессии DirectPath - ~750мкс

если интенсивность поступления пакетов прежняя - те 100к в секунду, то мы потеряем ~40к пакетов

соответственно необходимость в разделении процессов приема пакетов и их записи явнаяВы точно не путаете транзакции и сессии?
...
Рейтинг: 0 / 0
Демон под линукс
    #39381350
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovnagisaзатраты на подготовку сессии DirectPath - ~350мкс
затраты на загрузку - ~400мс
затраты на завершение сессии DirectPath - ~750мкс

если интенсивность поступления пакетов прежняя - те 100к в секунду, то мы потеряем ~40к пакетов

соответственно необходимость в разделении процессов приема пакетов и их записи явнаяВы точно не путаете транзакции и сессии?
нет - API DirectPath это специальный интерфейс для загрузки
те в нем нет ни Insert-ов ни commit-a в традиционном понимании
как следствие нельзя использовать сиквенсы (их просто нет) и прочие ограничения, но зато офигенная скорость

см http://docs.oracle.com/cd/B19306_01/appdev.102/b14250/oci12obn.htm#i433129
https://vrogier.github.io/ocilib/doc/html/group___ocilib_c_apidirect_path.html


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
Демон под линукс
    #39381359
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилnagisaя правильно понимаю, размер FIFO при приеме данных тут ограничен системными настройками ? и в данной задаче рассчитывать на него точно не стоит ?
не совсем

системные настройки ограничивают максимальный размер буфера, изменяется или в конфиге или командой
sysctl -w net.core.rmem_max=

а для сокета можно выставить значение опции SO_RCVBUF

PS какие препятствия для тьюнинга хорошо нагруженной системы?
спасибо за пояснение

посмотрел
Код: plaintext
1.
2.
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize);
printf("initial socket receive buf %d\n", rcvBufferSize);


Код: plaintext
initial socket receive buf 262144
я правильно понял что это это выделение памяти на каждый открываемый сокет ?

тогда должно хватить для задачи с головой - пакет <300 байт
и можно не парится что что-то пропадет во время слива массива в базу
...
Рейтинг: 0 / 0
Демон под линукс
    #39381371
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisa
Код: plaintext
initial socket receive buf 262144
я правильно понял что это это выделение памяти на каждый открываемый сокет ?

тогда должно хватить для задачи с головой - пакет <300 байт
и можно не парится что что-то пропадет во время слива массива в базу
Сомневаюсь, тут всего 800-900 пакетов в буфер поместится. При скорости 100к/сек буфер заполнится за 8-9 мс, т.е. если твой процесс будет приостановлен на большее время - у тебя начнутся потери.

Сделай хотя бы 15 Мб, чтобы на полсекунды простоя хватало.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381390
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tnagisa
Код: plaintext
initial socket receive buf 262144
я правильно понял что это это выделение памяти на каждый открываемый сокет ?

тогда должно хватить для задачи с головой - пакет <300 байт
и можно не парится что что-то пропадет во время слива массива в базу
Сомневаюсь, тут всего 800-900 пакетов в буфер поместится. При скорости 100к/сек буфер заполнится за 8-9 мс, т.е. если твой процесс будет приостановлен на большее время - у тебя начнутся потери.

Сделай хотя бы 15 Мб, чтобы на полсекунды простоя хватало.
да, конечно, я так и хотел
но вот сейчас начал крутить параметр и ... обнаружил потолок в виде 8`388`608 - те 8МБ

я вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ?
...
Рейтинг: 0 / 0
Демон под линукс
    #39381399
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaAPI DirectPath это специальный интерфейс для загрузки

Проблема в том, что вы и к пределу скорости обычного интерфейса не подошли, что говорит о
кривизне вашего приложения. Но вольному воля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Демон под линукс
    #39381433
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaя вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ?
Нет.

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


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

А твой FIFO это уже следующая цепочка, со своими буферами и прочими настройками. Как он работает я не знаю, но варианта всего два: либо будут потери, либо будет зависание на записи пока место не появится куда писать.
...
Рейтинг: 0 / 0
Демон под линукс
    #39381442
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaно вот сейчас начал крутить параметр и ... обнаружил потолок в виде 8`388`608 - те 8МБ
ну дык sysctl надо подкрутить - net.core.rmem_max, net.ipv4.udp_mem
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Демон под линукс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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