2008-09-25 5 views
2

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

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

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

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

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

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

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

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

+0

Вы пробовали привязки python RRDTool?Являются ли они не многопоточными/многопроцессорными? – Gregory 2008-11-22 20:14:36

ответ

1

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

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

Редактировать в ответ на комментарий:

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

+0

Почему бы не на уровне нити? – 2008-09-25 16:20:57

2

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

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

2

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

0

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

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

Смежные вопросы