我正在使用RRDTool (http://oss.oetiker.ch/rrdtool/)作为图形化后端来存储性能指标。这是通过RRDTool脚本中的Python完成的。
我的问题是,脚本是多线程的,每个线程都以相当快的速度更新RRD。有时更新失败是因为一个线程正在访问RRD文件,而另一个线程也试图访问它。
我的印象是,这是可以尝试的,因为RRDTool使用自己的锁定机制,但我想这不是真的。
对于并发访问RRD,有谁有一个很好的方法?
我可以想出几种方法:
有什么更好的吗,还是你以前遇到过这个问题?
发布于 2008-09-25 15:32:22
独占锁应该足以解决这个问题:
在主级别定义锁对象,而不是在线程级别定义锁对象,您就完成了。
编辑以回应评论:
如果在线程级别定义锁(lock = new Lock()),则每个正在运行的线程将有一个锁对象,并且您确实希望为rrdtool更新文件设置一个锁,因此该定义必须位于主级别。
发布于 2010-02-04 11:37:12
您也可以尝试使用rrdcached进行更新。然后,所有的写更新都将通过rrdcached序列化。当您想要读取RRD以生成图形时,请告诉守护进程刷新它,然后磁盘上的RRD将表示最新的状态。
如果通过环境变量指向缓存的守护进程,所有RRD工具都将透明地执行此操作。
发布于 2010-07-22 11:40:09
这个帖子中的rrd-用户列表可能是有用的。rrdtool的作者指出,它的文件锁定处理并发读和写。
https://stackoverflow.com/questions/133774
复制相似问题