并发访问RRD(RRDTool)

时间:2008-09-25 14:40:55

标签: python rrdtool

我使用RRDTool(http://oss.oetiker.ch/rrdtool/)作为存储性能指标的图形后端。这是通过Python脚本中的RRDTool CLI完成的。

我的问题是脚本是多线程的,每个线程都以非常快的速度更新RRD。有时更新失败,因为一个线程正在访问RRD文件而另一个线程也试图访问它。

我的印象是可以尝试,因为RRDTool使用自己的锁定机制,但我想这不是真的。

有没有人有同时访问RRD的好方法?

我可以想到几个方法:

  1. 有1个线程创建一个队列,只从单个线程中提供RRD。

  2. 在Python脚本中创建自己的锁定机制。 (我怎么办?)

  3. 有什么更好或者你之前遇到过这个问题吗?

4 个答案:

答案 0 :(得分:3)

您也可以尝试使用rrdcached进行更新。然后所有写入更新将通过rrdcached序列化。当您想要读取RRD以生成图形时,您可以告诉守护程序刷新它,然后磁盘上的RRD将代表最新状态。

如果通过环境变量指向缓存的守护进程,所有RRD工具都将透明地执行此操作。

答案 1 :(得分:2)

rrd-users列表中的

This thread可能很有用。 rrdtool的作者声明其文件锁定处理并发读写。

答案 2 :(得分:1)

对于这个问题,排他锁应该足够了:

在主级别而不是在线程级别定义锁定对象,然后就完成了。

编辑回复评论:

如果你在线程级别定义你的锁(lock = new Lock()),每个正在运行的线程你将有一个锁对象,你真的想要一个锁定文件rrdtool更新,所以这个定义必须在主要水平。

答案 3 :(得分:0)

我建议使用rrdcached,这也会提高数据收集器的性能。最新版本的rrdtool(1.4.x)极大地改进了rrdcached的功能和性能;您可以根据您的数据调整缓存行为以进行优化。

我们在这里大量使用rrdcached,每秒有数百次更新,而不是大量的RRD文件。