2

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

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

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

有没有人有并发访问 RRD 的好方法?

我可以想到几种方法:

  1. 让 1 个线程创建一个队列,并且仅从单个线程提供 RRD。

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

有什么更好的或者你以前遇到过这个问题吗?

4

4 回答 4

3

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

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

于 2010-02-04T11:37:12.190 回答
2

rrd-users 列表中的这个线程可能很有用。rrdtool 的作者指出,它的文件锁定处理并发读取和写入。

于 2010-07-22T11:40:09.513 回答
1

一个独占锁应该足以解决这个问题:

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

编辑回应评论:

如果你lock = new Lock()在线程级定义你的锁(

于 2008-09-25T15:32:22.893 回答
0

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

我们在这里大量使用 rrdcached,每秒对大量 RRD 文件进行数百次更新。

于 2014-11-02T21:54:03.600 回答