我使用RRDTool(http://oss.oetiker.ch/rrdtool/)作为存储性能指标的绘图后端。这是通过RRDTool CLI从Python脚本完成的。在
我的问题是脚本是多线程的,每个线程都以相当快的速度更新RRD。有时更新失败是因为一个线程正在访问RRD文件,而另一个线程也试图访问它。在
我觉得这是可以尝试的,因为RRDTool使用它自己的锁定机制,但我想这不是真的。在
有没有人有一个好的方法来并发访问RRD?在
我可以想出几个办法:
让1个线程创建一个队列,并且只从一个线程馈送RRD。
在Python脚本中创建我自己的锁定机制。(我该怎么做?)
有什么更好的或者你以前遇到过这个问题吗?在
对于这个问题,独占锁应该足够了:
在主级别而不是线程级别定义锁对象,就完成了。在
根据评论进行编辑:
如果您在线程级别定义锁(
lock = new Lock()
),则每个运行的线程将有一个锁对象,并且您确实希望为rrdtool更新文件提供一个锁,因此此定义必须在主级别。在您也可以尝试使用rrdcached进行更新。然后所有写更新都将通过rrdcached序列化。当您想读取RRD以生成图形时,您告诉守护进程刷新它,磁盘上的RRD将代表最新状态。在
如果通过环境变量指向缓存的守护进程,那么所有RRD工具都将透明地执行此操作。在
rrd用户列表中的This thread可能有用。rrdtool的作者声明其文件锁定处理并发读写。在
相关问题 更多 >
编程相关推荐