并发访问RRD(RRDTool)

时间:2020-03-06 14:43:29  来源:igfitidea点击:

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

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

我觉得这是可以尝试的,因为RRDTool使用了自己的锁定机制,但是我想那是不对的。

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

我可以想到几种方法:

  • 有1个线程创建一个队列,并且仅从单个线程提供RRD。
  • 在Python脚本中创建自己的锁定机制。 (我该怎么做?)

有什么更好的,还是我们之前遇到过这个问题?

解决方案

排他锁应该足以解决此问题:

  • Python文档页面
  • 使用例

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

编辑以回应评论:

如果我们在线程级别定义锁(" lock = new Lock()"),则每个运行线程将有一个锁对象,并且我们确实希望为文件rrdtool更新提供一个锁,因此此定义必须位于主要水平。

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

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

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