Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Задача написать демон под линукс, задача демона - загрузка потока данных в 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: на сях пишу эпизодически, соответственно прошу не пинать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2017, 14:45 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisa, вряд ли это вообще надо так делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 11:47 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Не понял зачем скорость определять? Для статистики разве что. Обработка очереди должна начинаться сразу как только туда что-то попало. Т.е. поток обработки висит в ожидании, пишущий поток при каждой записи в очередь будит поток обработки, тот просыпается, все что есть в очереди отправляет пачкой в БД, и так работает пока очередь не опустеет, затем снова засыпает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 12:08 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dima T, Про потоки автор как-то, видимо, скептически настроен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 14:14 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
интересно, как receiver и writer данными обмениваются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 14:48 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
MasterZivDima T, Про потоки автор как-то, видимо, скептически настроен... Я в линуксах не силен, может там есть какое API чтобы между процессами очередь организовать, если не путаю в линуксе изначально вообще потоков не было, после добавили. Может он просто про них не в курсе. Я так понял он отдельными процессами это решил сделать nagisaвопрос в том как это правильно пишется - те организация FIFO и использование его процессами приема и записи ? ИМХО с потоками проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 14:51 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dima Tможет там есть какое API чтобы между процессами очередь организовать pipe самый обыкновенный что в никсах что в винде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 15:04 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Далеко не факт, что вообще нужно разделать читателя источника и писателя в БД. Поскольку обработка скорее всего будет никакая, то задача будет IO bound, и толку от введения в архитектуру двух потоков/процессов чтения и записи никакого не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 18:04 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
MasterZivПоскольку обработка скорее всего будет никакая, то задача будет IO bound, и толку от введения в архитектуру двух потоков/процессов чтения и записи никакого не будет. Зависит от того умеет ли клиент оракла работать в асинхронном режиме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 18:22 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Клиенту этого и не надо. Умеет ли приложение, которому этого тоже не надо - вопрос уже к автору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 18:36 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
DirectPath сам внутри очередь имеет вроде как ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 19:04 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dima TНе понял зачем скорость определять? Для статистики разве что. Обработка очереди должна начинаться сразу как только туда что-то попало. Т.е. поток обработки висит в ожидании, пишущий поток при каждой записи в очередь будит поток обработки, тот просыпается, все что есть в очереди отправляет пачкой в БД, и так работает пока очередь не опустеет, затем снова засыпает. сейчас оно почти так и сделано - те пакет пришел и тут же в базу потом коммит каждую секунду. но потолок этой технологии 3500 записей в секунду. соответственно надо использовать другой подход - те API DirectPath и это требует сразу явного объявления объема блока загрузки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 20:29 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
MasterZivDima T, Про потоки автор как-то, видимо, скептически настроен... да я никак еще не настроен, как я уже сказал - пишу эпизодически и соответственно какие-то вещи могу просто не знать тк не сталкивался. сейчас хочу оттестить штатное FIFO - cм http://www.intuit.ru/studies/courses/2249/52/lecture/1554?page=6 просто хочу советов - те каких ошибок делать не стоит тк подозреваю что при больших скоростях вылезут какие-то ньюансы, которые в начале были совсем не заметны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 20:34 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaпросто хочу советов - те каких ошибок делать не стоит сначала без выпендрёжу сделать через DirectPath в одном процессе. если будет плохо справляться - тогда и искать узкое место. Главная потенциальная ошибка - преждевременная оптимизация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 20:45 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Изопропилсначала без выпендрёжу сделать через DirectPath в одном процессе. Но перед этим - использовать Array DML и отключить autocommit. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2017, 22:02 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Изопропил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 при приеме данных тут ограничен системными настройками ? и в данной задаче рассчитывать на него точно не стоит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 09:50 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaя правильно понимаю, размер FIFO при приеме данных тут ограничен системными настройками ? и в данной задаче рассчитывать на него точно не стоит ? не совсем системные настройки ограничивают максимальный размер буфера, изменяется или в конфиге или командой sysctl -w net.core.rmem_max= а для сокета можно выставить значение опции SO_RCVBUF PS какие препятствия для тьюнинга хорошо нагруженной системы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 10:43 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaзатраты на подготовку сессии DirectPath - ~350мкс затраты на загрузку - ~400мс затраты на завершение сессии DirectPath - ~750мкс если интенсивность поступления пакетов прежняя - те 100к в секунду, то мы потеряем ~40к пакетов соответственно необходимость в разделении процессов приема пакетов и их записи явнаяВы точно не путаете транзакции и сессии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 11:24 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
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() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 12:08 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Изопропилnagisaя правильно понимаю, размер FIFO при приеме данных тут ограничен системными настройками ? и в данной задаче рассчитывать на него точно не стоит ? не совсем системные настройки ограничивают максимальный размер буфера, изменяется или в конфиге или командой sysctl -w net.core.rmem_max= а для сокета можно выставить значение опции SO_RCVBUF PS какие препятствия для тьюнинга хорошо нагруженной системы? спасибо за пояснение посмотрел Код: plaintext 1. 2. Код: plaintext тогда должно хватить для задачи с головой - пакет <300 байт и можно не парится что что-то пропадет во время слива массива в базу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 12:13 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisa Код: plaintext тогда должно хватить для задачи с головой - пакет <300 байт и можно не парится что что-то пропадет во время слива массива в базу Сомневаюсь, тут всего 800-900 пакетов в буфер поместится. При скорости 100к/сек буфер заполнится за 8-9 мс, т.е. если твой процесс будет приостановлен на большее время - у тебя начнутся потери. Сделай хотя бы 15 Мб, чтобы на полсекунды простоя хватало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 12:32 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dima Tnagisa Код: plaintext тогда должно хватить для задачи с головой - пакет <300 байт и можно не парится что что-то пропадет во время слива массива в базу Сомневаюсь, тут всего 800-900 пакетов в буфер поместится. При скорости 100к/сек буфер заполнится за 8-9 мс, т.е. если твой процесс будет приостановлен на большее время - у тебя начнутся потери. Сделай хотя бы 15 Мб, чтобы на полсекунды простоя хватало. да, конечно, я так и хотел но вот сейчас начал крутить параметр и ... обнаружил потолок в виде 8`388`608 - те 8МБ я вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 12:52 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaAPI DirectPath это специальный интерфейс для загрузки Проблема в том, что вы и к пределу скорости обычного интерфейса не подошли, что говорит о кривизне вашего приложения. Но вольному воля. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 13:01 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaя вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ? Нет. Я про sockfd из которого ты принимаешь пакеты Код: plaintext 1. Это прием из сети UDP пакетов, у sockfd есть буфер, в который входящий пакет сначала кладется, затем твоя прога его оттуда читает recvfrom(), если твоя прога не будет успевать читать и буфер переполнится, то новые пакеты будут просто удалятся, так устроен UDP. А твой FIFO это уже следующая цепочка, со своими буферами и прочими настройками. Как он работает я не знаю, но варианта всего два: либо будут потери, либо будет зависание на записи пока место не появится куда писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39381433&tid=2018306]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 9ms |
| total: | 127ms |

| 0 / 0 |
