LINUX.ORG.RU

как сделать интервальные счетчики в проге на си

 ,


1

3

всем привет!

Вопрос следующий.

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

Например, в коде идет подсчет какого либо события. Как каждый час сохранять этот счетчик?

Сигналы по таймеру? или есть что то другое, более правильное?

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

Заранее спасибо!



Последнее исправление: elmir_k (всего исправлений: 1)

В программе ведь есть какой-то глобальный цикл? Ну вот и не парься — проверяй в нём сколько прошло времени от последнего сохранения, да сохраняй когда нужно.

Можешь нагородить отдельный поток со слипом, но оно тебе надо? А может твоя программа и так многопоточная и добавить ещё один поток не проблема.

Такую задачу нужно решать на месте подручными методами. Сомневаюсь, что есть какой-то универсальный идеологически верный метод.

Deleted
()

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

Я бы сделал структуру со статистикой и передал указатель на неё потоку. Т.к. поток только читает данные не надо париться о race condition, как итог всё будет довольно локанично.

sparks ★★★★
()

Кидаешь короче все в stdout, на выходе баш скрипт, который читает строку и пишет её в файл, затирая старый. По крону раз в час файл копируется. Можно ничего не затирать, а тупо писать в лог и раз в час по крону брать последнюю строчку. Не будет никаких тредов, никто не будет жрать проц, как только данные попадут в поток всё заработает.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от sparks

Т.к. поток только читает данные не надо париться о race condition

Но кто-то же их обновляет, пока он читает, вот и data race.

xaizek ★★★★★
()

Еще есть POSIX-таймеры, man timerfd_create.

anonymous
()

Если не чаще чем раз в секунду то можно через SIGALRM

redixin ★★★★
()
Ответ на: комментарий от xaizek

В статистической информции аля количества клиентов, количества переданной/принятой инфы, нескольких дельт по времени и тд это не критично.

sparks ★★★★
()
Ответ на: комментарий от sparks

В статистической информции аля количества клиентов, количества переданной/принятой инфы, нескольких дельт по времени и тд это не критично.

конечно зависит от того насколько критична точность. Если у вас «кол-во клиентов» то видимо по барабану :-) Пишите в базу по таймеру. Вообще сейчас базы довольно шустрые и можно писать вообще всё - а нужную статистку вытаскивать средствами СУБД и не подсчитывать в ручную в приложении.

а так типичные моменты: если метрика обновилась раньше чем дошёл сигнал таймера ? её куда засчитать - в только что прошедший час или уже в новый..и как ;

а если она имеет свои метки времени и опоздала ? таймер своё отщёлкал, всё записал и тут на тебе

MKuznetsov ★★★★★
()

Твоя программа пишет необходимую информацию в разделяемую память, отдаёт инфу по dbus и т.д. Процесс мониторинга (ganglia, zabbix, самописный по cron и т.д.) забирает эту информацию.

Если счётчик для мониторинга целочисленный, то тупо храним его в uint64_t (или любом другом с атомарным доступом) и постоянно увеличиваем. Системы мониторинга прекрасно умеют такие показатели правильно воспринимать (отняли предыдущее и разделили на дельту системного время, при этом переполнение побоку).

AlexVR ★★★★★
()

Многомерный массив где номер индекса это тип событие, значение по индексу это количество событий определённого типа, получаешь текущее время в секундах в начале программы к этому времени добавляешь промежуток времени после которого должно произойти сохранение, после каждого подсчёта события, получаешь текущее время и если оно больше того что нужно (прошлое время + интервал) сохраняешь свои события. Всё. Чё тут думать то?

Deleted
()

https://github.com/vvromanov/hilo_utils

Пример иcпользования счетчиков - https://github.com/vvromanov/hilo_utils/blob/master/tests/TestCounters.cpp

Писалка счетчиков в RRD https://github.com/vvromanov/hilo_utils/tree/master/rrd-writer

Счетчики создаются в SHM. Каждую секунду пишутся в базу данных rrd. По этим файлам строятся графики итд.

vromanov ★★★
()
Ответ на: комментарий от vromanov

а какого рода инфа пишется в SHM? просто что то вроде «идентификатор события + время события» ? то есть раскладку по интервалам main приложение не ведет, а раслкадку по интервала и прочие действия с данными счетчиков выполняет приложение, которое из SHM читает данные?

elmir_k
() автор топика
Ответ на: комментарий от elmir_k

В SHM просто постоянно растущий счетчик. Писалка периодически сбрасывает значение счетчика в RRD файл. Там есть и что-то вроде скользящего среднего. Но в результатет данные записываются в файл RRD. По которому можно строить графики и делать различные запросы. https://oss.oetiker.ch/rrdtool/ Или вот еще хорошая система - https://facette.io/

vromanov ★★★
()
Ответ на: комментарий от vromanov

спасибо! многое понятно стало. а доступ к shared memory достаточно синхронизировать мьютексом? чтобы читающий данные из шаред мемори лочил память...

elmir_k
() автор топика
Ответ на: комментарий от elmir_k

Мютекса не нужно. Достаточно атомарных операций. В шаред памяти лежит массив счетчиков. Рядом лежит индекс по имени. Мютекс нужен при работе с индексом, с самими счетчиками работа идет с помощью атомарных операций.

vromanov ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.