Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaно вот сейчас начал крутить параметр и ... обнаружил потолок в виде 8`388`608 - те 8МБ ну дык sysctl надо подкрутить - net.core.rmem_max, net.ipv4.udp_mem ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 13:32 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisa, как альтернативу линуксовым pipe можешь посмотреть на родные средства С++ : std::queue - очередь std::thread - создание потоков std::mutex - синхронизация доступа из разных потоков std::condition_variable - пробуждение потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 14:14 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
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()Ну и в каком месте тут требуется какая-то асинхронность, формирование пачек по хитровывернутому алгоритму? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2017, 16:07 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
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. где NUM_COLS - количество колонок, а nb_rows - количество записей в пачке у меня, максимальная скорость достигается при размере пачки 4000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 04:15 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dima Tnagisaя вообще правильно понял что это персональный буфер FIFO выделяемый под созданный сокет ? Нет. Я про sockfd из которого ты принимаешь пакеты Код: plaintext 1. Это прием из сети UDP пакетов, у sockfd есть буфер, в который входящий пакет сначала кладется, затем твоя прога его оттуда читает recvfrom(), если твоя прога не будет успевать читать и буфер переполнится, то новые пакеты будут просто удалятся, так устроен UDP. А твой FIFO это уже следующая цепочка, со своими буферами и прочими настройками. Как он работает я не знаю, но варианта всего два: либо будут потери, либо будет зависание на записи пока место не появится куда писать. спасибо. значит изначальная схема с тремя звеньями была верной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 04:18 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovnagisaAPI DirectPath это специальный интерфейс для загрузки Проблема в том, что вы и к пределу скорости обычного интерфейса не подошли, что говорит о кривизне вашего приложения. Но вольному воля. да я как бы не претендую, поправьте меня примером который обычным интерфейсом грузит хотя бы 10К ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 04:19 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaпоправьте меня примером который обычным интерфейсом грузит хотя бы 10К Какое слово из "использовать Array DML и отключить autocommit" Вы не поняли? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:36 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Какую скорость загрузки на Вашем оборудовании показывает SQLLoader без режима direct? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:39 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaзначит изначальная схема с тремя звеньями была верной. только неясно, зачем третье звено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:13 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaDima Tпропущено... Нет. Я про sockfd из которого ты принимаешь пакеты Код: plaintext 1. Это прием из сети 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:01 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
автору тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок Не факт, что и это ему нужно. Иногда можно просто читать исходные данные в том темпе, в котором их может обрабатывать писатель в Oracle. Т.е. хватить обычного SQLLOader, обрабатывающего linux pipe на входе. Уже наверное раз 10 сказали это ТС-у, но толку ноль... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 16:03 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
MasterZivавтору тебя есть процесс (или тред) приемник, его задача - гарантированно принимать пакеты с заданным rate в память, это ок Не факт, что и это ему нужно. Иногда можно просто читать исходные данные в том темпе, в котором их может обрабатывать писатель в Oracle. Т.е. хватить обычного SQLLOader, обрабатывающего linux pipe на входе. Уже наверное раз 10 сказали это ТС-у, но толку ноль... ну, если у него не UDP, то стандартные TCP nagle алгоритмы могут привести к очень неожиданным поведениям приложения. а так конечно да, можно просто буфер приемника привинтить гигантского размера и обойтись одним тредом. и даже если делать несколько писателей - собственно в отдельный тред можно отправлять только вызов OCI_DirPathLoad (ну или fork/spawn sqlldr), остальные вызовы работают относительно быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 17:30 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
dbpatchну, если у него не UDP топикстартер замерял потери пакетов. 99.9% - у него UDP собсвенно и предлагается максимально увеличить размер буфера в ядре. мож второй демон и не понадобится как межпроцессное взаимодействие реализовано - топикстартер не сознался, подозреваю, что до этого ещё не дошло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 00:36 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Изопропилdbpatchну, если у него не UDP топикстартер замерял потери пакетов. 99.9% - у него UDP ну, на канальном уровне у TCP тоже потери бывают, и их вполне можно измерить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 00:52 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
Изопропилкак межпроцессное взаимодействие реализовано - топикстартер не сознался, подозреваю, что до этого ещё не дошло У меня таки теплится надежда, что ему и потоков хватит. Они между собой всё же попроще взаимодействуют... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 01:20 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
dbpatchИзопропилпропущено... топикстартер замерял потери пакетов. 99.9% - у него UDP ну, на канальном уровне у TCP тоже потери бывают, и их вполне можно измерить. на это я 0.1% оставил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 02:12 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
nagisaя сейчас принимаю пакеты при помощи bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) и затем recvfrom (sockfd,me .... Уже понятно что UDP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 07:02 |
|
||
|
Демон под линукс
|
|||
|---|---|---|---|
|
#18+
сам ты не читатель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 шинах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 12:59 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018306]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
45ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 176ms |

| 0 / 0 |
