对RRD(RRDTool)的并发访问

2 投票
4 回答
3110 浏览
提问于 2025-04-11 09:22

我正在使用RRDTool(http://oss.oetiker.ch/rrdtool/)来存储性能数据并绘制图表。这是通过一个Python脚本里的RRDTool命令行工具来实现的。

我遇到的问题是,这个脚本是多线程的,每个线程都在快速更新RRD。有时候,一个线程在访问RRD文件时,另一个线程也想访问它,这就导致更新失败。

我原以为这样做没问题,因为RRDTool有自己的锁机制,但看来并不是这样。

有没有人有好的办法来处理对RRD的同时访问呢?

我想到几种解决方案:

  1. 让一个线程创建一个队列,然后只通过这个线程来更新RRD。

  2. 在Python脚本里自己创建一个锁机制。(我该怎么做呢?)

你有没有更好的建议,或者之前遇到过这个问题吗?

4 个回答

2

在rrd-users讨论组中,有一个帖子可能对你有帮助。rrdtool的作者提到,它的文件锁定功能可以处理同时进行的读和写操作。

3

你也可以试着用rrdcached来进行更新。这样,所有的写入更新都会通过rrdcached来处理。当你想读取RRD数据来生成图表时,你可以告诉这个程序去刷新数据,这样磁盘上的RRD就会显示最新的状态。

所有的RRD工具如果通过一个环境变量指向这个缓存程序,就会自动完成这些操作。

1

对于这个问题,使用独占锁就足够了:

把你的锁对象定义在主级别,而不是线程级别,这样就可以了。

根据评论的编辑:

如果你把锁(lock = new Lock())定义在线程级别,那么每个运行的线程都会有一个锁对象。这样的话,你就会有很多锁,而你其实只需要一个锁来处理文件的rrdtool更新,所以这个定义必须放在主级别。

撰写回答