SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Сервис диагностики 100500 устройств (организация транзакций с использованием ibpp 2.x)
Сервис диагностики 100500 устройств [сообщение #4082] Thu, 18 January 2024 11:31 Переход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
Приветствую.

Вопрос не сугубо про FB, но в организации 2х-поточного чтения-записи из одного бинарника.
Сцуть - нужно взять кучу идентификаторов из БД и, посылая на железку запрос, отмечать что запрос послан, во втором потоке приходит ответ, информацию о котором записывается в БД - для простоты одна таблица структурой поле количество посланных запросов и поле количество полученных ответов.

Вопросы
1. нужно ли держать 2 коннекта читающий ид-ы и пишущий отметку о посылке, с учетом того, что второй поток произвольно пишет ответы или лучше в первом потоке выгружать, например, все в std::vector и потом в другой транзакции последовательно записывать запросы?
2. с учетом того, что железок тысячи, а опрос всех предварительно предполагаю каждые 10-15 минут, то как бы организовать транзакции, чтобы они друг другу не мешали, но и не оборачивать в транзакцию хотя бы каждый каждый запрос железки?

есть отдалено похожий скрипт на bash с использованием isql-fb, который оборачивает запись запросов в одну транзакцию, что приводит периодически к блокировкам остальных изменений, но там это не так критично в силу небольших объемов и блокировки обрабатываются на стороне пользовательского интерфейса.
Re: Сервис диагностики 100500 устройств [сообщение #4087 является ответом на сообщение #4082] Thu, 18 January 2024 14:00 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 167
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
"Тысячи железок" предполагает мегабайты информации, если по каждой железке из базы вынимается до килобайта данных.
Если список "тысяч железок" не меняется каждую минуту, то можно быстро "огласить весь список" для сохранения его в памяти программы и "освободить" подключение к базе.
Аналогично, можно накапливать очередь ответов разумного размера и, по мере заполнения или по тайм-ауту записывать базу сразу пачку данных.

"По-моему - так" (ц) Винни-Пух, голосом Е.Леонова.
Re: Сервис диагностики 100500 устройств [сообщение #4091 является ответом на сообщение #4082] Thu, 18 January 2024 15:39 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
wolverin писал(а) Thu, 18 January 2024 09:31

1. нужно ли держать 2 коннекта читающий ид-ы и пишущий отметку о посылке, с учетом того, что второй поток произвольно пишет ответы или лучше в первом потоке выгружать, например, все в std::vector и потом в другой транзакции последовательно записывать запросы?
Можно держать, а можно не держать. Весь вопрос в быстродействии и в том насколько хорошо ты понимаешь многопоточность.
Re: Сервис диагностики 100500 устройств [сообщение #4092 является ответом на сообщение #4087] Thu, 18 January 2024 15:44 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
каждую минуту нет, но в течении 10-15 минут может, в любом случае получается весь список нужен не чаще этого интервала (а возможно придется и больше делать адаптивно, если предыдущий опрос не будет успевать)
про очередь ответов надо подумать, спасибо, но больше вопрос взаимодействия 2х достаточно частых транзакций на изменение одних и те же данных - т.е. вы делаете очередь больше, но и блокировка становится дольше.

[Обновления: Thu, 18 January 2024 15:45]

Известить модератора

Re: Сервис диагностики 100500 устройств [сообщение #4093 является ответом на сообщение #4091] Thu, 18 January 2024 15:46 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
SD писал(а) Thu, 18 January 2024 15:39
Весь вопрос в быстродействии
именно так, как бы понять какой вариант оптимальнее
Re: Сервис диагностики 100500 устройств [сообщение #4094 является ответом на сообщение #4093] Thu, 18 January 2024 15:53 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
хе хе, вот напишешь спросишь кого то и мысль сразу новая приходит - можно же перечитывать список с какой то периодичностью, а запись осуществлять в 3 потоке из двух других пачкой
Re: Сервис диагностики 100500 устройств [сообщение #4096 является ответом на сообщение #4094] Thu, 18 January 2024 16:39 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
таблица подвергающаяся модификации одна?
Re: Сервис диагностики 100500 устройств [сообщение #4099 является ответом на сообщение #4096] Thu, 18 January 2024 20:08 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Вы там update что ли делаете? Откуда блокировки? Если да, то бери 5ку и используй skip locked
Re: Сервис диагностики 100500 устройств [сообщение #4102 является ответом на сообщение #4096] Fri, 19 January 2024 06:12 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
МП писал(а) Thu, 18 January 2024 16:39
таблица подвергающаяся модификации одна?
да
Re: Сервис диагностики 100500 устройств [сообщение #4103 является ответом на сообщение #4099] Fri, 19 January 2024 06:15 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
sim_84 писал(а) Thu, 18 January 2024 20:08
Вы там update что ли делаете?
на 3ку то только начал парк серверов переводить, конечно не потому что именно FB переехать проблема, а потому что это всю систему обновить надо.

но не страшно, мысль пришла - складывать в буфер апдейты из 2х потоков и 3 потоком уже сбрасывать его в базу по времени или по размеру, кажется должно быть оптимально.
Re: Сервис диагностики 100500 устройств [сообщение #4109 является ответом на сообщение #4103] Fri, 19 January 2024 09:45 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
размер записи?
количество записей в секунду?
Re: Сервис диагностики 100500 устройств [сообщение #4114 является ответом на сообщение #4109] Fri, 19 January 2024 12:14 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
пока строка таблицы 4 поля int и 2 даты, про секунды не знаю, нет еще функционала, фиксация запросов будет со скоростью работы асинхронного клиента mqtt, насколько он быстрый не знаю, а уж ответы вообще как получится, там приходят снапшоты с камер и складываются локально, затем отметка в бд.
Re: Сервис диагностики 100500 устройств [сообщение #4139 является ответом на сообщение #4109] Mon, 22 January 2024 10:54 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
pastor писал(а) Fri, 19 January 2024 09:45

количество записей в секунду?
приблизительно оценил в >100 записей в секунду )
не каждую секунду конечно, волнами нагрузка приходит, но оказалось в многопоток опрашивать железки достаточно "быстро" получается.
Re: Сервис диагностики 100500 устройств [сообщение #4140 является ответом на сообщение #4139] Mon, 22 January 2024 12:17 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
wolverin писал(а) Mon, 22 January 2024 10:54
pastor писал(а) Fri, 19 January 2024 09:45

количество записей в секунду?
приблизительно оценил в >100 записей в секунду )
не каждую секунду конечно, волнами нагрузка приходит, но оказалось в многопоток опрашивать железки достаточно "быстро" получается.
на препарированных запросах на 2.5 получается до 40 000/сек по 4кб на запись
препарированный запрос может жить и после коммита


start transaction
prepare

for execute

commit



Re: Сервис диагностики 100500 устройств [сообщение #4141 является ответом на сообщение #4140] Mon, 22 January 2024 12:45 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
pastor
. препарированный запрос может жить и после коммита
не всё так однозначно ©

смотря какой запрос,
смотря что подразумевается под словом "жить",
смотря где "жить" (в нутрях сервера, или на клиенте).
Re: Сервис диагностики 100500 устройств [сообщение #4142 является ответом на сообщение #4140] Mon, 22 January 2024 13:11 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
pastor писал(а) Mon, 22 January 2024 12:17

на препарированных запросах на 2.5 получается до 40 000/сек по 4кб на запись
вопрос же не в количестве записей в секунду (что определяется вообщем то железом), а в количестве транзакций, вы оформите каждую запись в транзакцию и тогда сколько будет?
повторюсь - 2 конкурирующих потока делают update одной и той же таблицы.
сейчас просто первую статистику получил на 150 железках, когда 2 потока складывают в 3ий и уже только он пишет пачкой.

[Обновления: Mon, 22 January 2024 13:24]

Известить модератора

Re: Сервис диагностики 100500 устройств [сообщение #4143 является ответом на сообщение #4142] Mon, 22 January 2024 13:50 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
wolverin писал(а) Mon, 22 January 2024 13:11
pastor писал(а) Mon, 22 January 2024 12:17

на препарированных запросах на 2.5 получается до 40 000/сек по 4кб на запись
вопрос же не в количестве записей в секунду (что определяется вообщем то железом), а в количестве транзакций, вы оформите каждую запись в транзакцию и тогда сколько будет?
повторюсь - 2 конкурирующих потока делают update одной и той же таблицы.
сейчас просто первую статистику получил на 150 железках, когда 2 потока складывают в 3ий и уже только он пишет пачкой.
можно и на одной записи в час дедлок словить

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

если потоки не пересекаются по устройствам - то откуда дедлоки?

[Обновления: Mon, 22 January 2024 13:51]

Известить модератора

Re: Сервис диагностики 100500 устройств [сообщение #4144 является ответом на сообщение #4142] Mon, 22 January 2024 14:18 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
wolverin
повторюсь - 2 конкурирующих потока делают update одной и той же таблицы.
Они что, одну и ту же запись апдейтят ?
Re: Сервис диагностики 100500 устройств [сообщение #4152 является ответом на сообщение #4144] Mon, 22 January 2024 18:28 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
hvlad писал(а) Mon, 22 January 2024 14:18
Они что, одну и ту же запись апдейтят ?
да, столбцы только разные )
Re: Сервис диагностики 100500 устройств [сообщение #4153 является ответом на сообщение #4143] Mon, 22 January 2024 18:33 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
pastor писал(а) Mon, 22 January 2024 13:50

если потоки не пересекаются по устройствам - то откуда дедлоки?
запрос может пересечься с ответом и они попытаются обновить одну и ту же строку.
пробовал поштучно опрашивать с ожиданием ответа, так cron успевает еще 2-3 раза начать задания крутить из за значительного времени ожидания ответа с медленных железок.
предметно говоря - отправляю я mqtt сообщение на железку, а она мне должна прислать снимок с камеры как получится

[Обновления: Mon, 22 January 2024 18:36]

Известить модератора

Re: Сервис диагностики 100500 устройств [сообщение #4154 является ответом на сообщение #4153] Mon, 22 January 2024 18:46 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
wolverin писал(а) Mon, 22 January 2024 18:33
pastor писал(а) Mon, 22 January 2024 13:50

если потоки не пересекаются по устройствам - то откуда дедлоки?
запрос может пересечься с ответом и они попытаются обновить одну и ту же строку.
пробовал поштучно опрашивать с ожиданием ответа, так cron успевает еще 2-3 раза начать задания крутить из за значительного времени ожидания ответа с медленных железок.
предметно говоря - отправляю я mqtt сообщение на железку, а она мне должна прислать снимок с камеры как получится
в любом порядке?
и это важно знать?
а если поверх перепишется - то пофиг?
Re: Сервис диагностики 100500 устройств [сообщение #4155 является ответом на сообщение #4154] Mon, 22 January 2024 18:55 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
там всего лишь счетчики для изменения на +-1, поэтому не важно в каком порядке

зы. про разные колонки наврал, во-первых для "скользящей" статистики надо попробовать -1 от успешных ответов отнимать, во-вторых, есть же общий текущий уровень в % в другой таблице.
кароче, без 3го потока получается никак, либо структура нужна какая то другая
Re: Сервис диагностики 100500 устройств [сообщение #4158 является ответом на сообщение #4152] Mon, 22 January 2024 19:16 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
wolverin писал(а) Mon, 22 January 2024 17:28
hvlad писал(а) Mon, 22 January 2024 14:18
Они что, одну и ту же запись апдейтят ?
да, столбцы только разные )
Ну тогда либо переделать стр-ру на правильную (лучше всего), либо обрабатывать конфликты (это не так страшно, как кажется), либо попросить обрабатывать конфликты Firebird - см. Read Consistency
Re: Сервис диагностики 100500 устройств [сообщение #4159 является ответом на сообщение #4158] Mon, 22 January 2024 19:46 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
hvlad писал(а) Mon, 22 January 2024 19:16

спасибо, посмотрю
пока никакая "правильная" структура в голову не приходит, в целом вообще исключить конфликты через один общий поток записи кажется вернее всего.
Re: Сервис диагностики 100500 устройств [сообщение #4167 является ответом на сообщение #4159] Tue, 23 January 2024 04:06 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 140
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
[quote title=wolverin писал(а) Mon, 22 January 2024 23:46]hvlad писал(а) Mon, 22 January 2024 19:16

пока никакая "правильная" структура в голову не приходит.
ну например развернуть запись "из ширины в длину", типа было
id     integer
field1 integer
field2 integer
field3 integer
на
id       integer
id_field integer
value    integer
тогда при изменении разны полей пересечений не будет.
но понятно что изменится первичный ключ, или добавится ограничение уникальности, и запросы на select нужно переписать,
так же нужно будет думать про NULLы, если записи про нужное поле еще не было.

Re: Сервис диагностики 100500 устройств [сообщение #4168 является ответом на сообщение #4167] Tue, 23 January 2024 07:11 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
тогда придется каждый раз пересчитывать 100500 железок * на количество записей и удалять все бесполезное позже какого то периода другим потоком с каким то интервалом, а так получается всегда записана текущее значение "уровня сигнала" на железке - т.е. нагрузка существенно возрастет.
Re: Сервис диагностики 100500 устройств [сообщение #4171 является ответом на сообщение #4168] Tue, 23 January 2024 11:26 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 140
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
wolverin писал(а) Tue, 23 January 2024 11:11
тогда придется каждый раз пересчитывать 100500 железок * на количество записей и удалять все бесполезное позже какого то периода другим потоком с каким то интервалом, а так получается всегда записана текущее значение "уровня сигнала" на железке - т.е. нагрузка существенно возрастет.
Если это было мне - то я ничо не понял. Чего пересчитывать, что такое "удалять бесполезное"... Чем отличается "бесполезное" в твоем варианте от "бесполезного" в моем варианте. Если что - в моем варианте количество данных ровно такое же, просто они не в ширину а в высоту.

[Обновления: Tue, 23 January 2024 11:27]

Известить модератора

Re: Сервис диагностики 100500 устройств [сообщение #4172 является ответом на сообщение #4168] Tue, 23 January 2024 11:33 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
wolverin писал(а) Tue, 23 January 2024 07:11
тогда придется каждый раз пересчитывать 100500 железок * на количество записей и удалять все бесполезное позже какого то периода другим потоком с каким то интервалом, а так получается всегда записана текущее значение "уровня сигнала" на железке - т.е. нагрузка существенно возрастет.
записано не текущее значение и даже не последнее, а значение, пришедшее последним
Re: Сервис диагностики 100500 устройств [сообщение #4173 является ответом на сообщение #4172] Tue, 23 January 2024 11:35 Переход к предыдущему сообщениюПереход к следующему сообщению
wolverin в настоящее время не в онлайне  wolverin
Сообщений: 42
Зарегистрирован: August 2023
Member
дак они все в итоге переписываются каждый раз, есть только вариант делать историю "в ширину", т.е. хранить за дельту времени все значения.
Re: Сервис диагностики 100500 устройств [сообщение #4182 является ответом на сообщение #4173] Tue, 23 January 2024 16:28 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Убери постоянно перезаписываемую информацию из БД вообще в Memory Mapped File. В БД скидывай уже долгохранящиеся итоги и агрегаты (если таковые вообще нужны зачем-то).
Re: Сервис диагностики 100500 устройств [сообщение #4187 является ответом на сообщение #4173] Tue, 23 January 2024 17:19 Переход к предыдущему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
wolverin писал(а) Tue, 23 January 2024 11:35
дак они все в итоге переписываются каждый раз, есть только вариант делать историю "в ширину", т.е. хранить за дельту времени все значения.
если они бесконтрольно перезаписываются - зачем их вообще писать?

нужны отсечки изменения состояния - то в среднем слое при получении изменения состояния - сразу писать

нужны средние за период (термометр) - накапливать за минуту и писать

пиковый ахтунг (пороговое) - писать немедленно
Предыдущая тема: FB3 Долгий shutdown базы с одновременной нагрузкой антивирусом Касперского
Следующая тема: RDB$DESCRIPTION
Переход к форуму:
  


Текущее время: Sun Dec 22 23:15:54 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01254 секунд