Параллельный доступ к RRD (RRDTool) - PullRequest
2 голосов
/ 25 сентября 2008

Я использую RRDTool (http://oss.oetiker.ch/rrdtool/) в качестве графического бэкенда для хранения метрик производительности. Это делается с помощью RRDTool CLI из скрипта Python.

Моя проблема в том, что скрипт многопоточный, и каждый поток обновляет RRD довольно быстрыми темпами. Иногда происходит сбой обновления, поскольку один поток обращается к файлу RRD, а другой пытается получить к нему доступ.

У меня сложилось впечатление, что это нормально, поскольку RRDTool использует собственный механизм блокировки, но я полагаю, что это не так.

У кого-нибудь есть хороший подход для одновременного доступа к RRD?

Я могу придумать несколько путей:

  1. имеет 1 поток, создающий очередь, и передает RRD только из одного потока.

  2. создать свой собственный механизм блокировки внутри скрипта Python. (как бы я это сделал?)

есть что-то лучше или вы уже сталкивались с этой проблемой раньше?

Ответы [ 4 ]

3 голосов
/ 04 февраля 2010

Вы также можете попробовать использовать rrdcached для обновления. Тогда все обновления записи будут сериализованы через rrdcached. Когда вы хотите прочитать RRD для генерации графиков, вы указываете демону сбросить его, и RRD на диске будет представлять последнее состояние.

Все инструменты RRD будут делать это прозрачно, если они будут указывать на кэшированный демон через переменную окружения.

2 голосов
/ 22 июля 2010

Эта тема в списке rrd-users может быть полезна. Автор rrdtool утверждает, что его блокировка файлов обрабатывает одновременное чтение и запись.

1 голос
/ 25 сентября 2008

Для этой проблемы должно быть достаточно эксклюзивной блокировки:

Определите объект блокировки на основном уровне, а не на уровне потока, и все готово.

Изменить в ответ на комментарий:

если вы определяете свою блокировку (lock = new Lock()) на уровне потока, у вас будет один объект блокировки на каждый работающий поток, и вы действительно хотите одну блокировку для обновления файла rrdtool, поэтому это определение должно быть на основном уровне .

0 голосов
/ 03 ноября 2014

Я бы предложил использовать rrdcached, что также улучшит производительность вашего сборщика данных. Последние версии rrdtool (1.4.x) значительно улучшили функциональность и производительность rrdcached; вы также можете оптимизировать поведение кэширования в соответствии с вашими данными.

Мы интенсивно используем rrdcached здесь с несколькими сотнями обновлений в секунду для большого количества файлов RRD.

...