我可以让fcntl和Perl警报合作吗?

时间:2010-09-23 18:56:49

标签: perl locking nfs fcntl

我在Linux上,nfs,涉及多台机器。

我正在尝试使用fcntl来实现文件锁定。我一直在使用flock,直到我发现它只能在同一台机器上的进程之间工作。

现在当我用F_SETLKW调用fcntl时,perl警报(用于添加超时)不像以前一样工作。这通常没问题,但是ctrl-c也没有用。

我相信正在发生的事情是,fcntl只是每30秒检查一次信号。警报最终会回来。 ctrl-c被捕获,......最终。

我能做些什么来调整fcntl检查这些信号的频率吗?

1 个答案:

答案 0 :(得分:1)

我绝对不是这方面的专家,但我的知识是fcntl,正如你所说的那样,对你的情况不起作用。 fcntl咨询锁仅在同一台机器中有意义。

如果这个偏离主题,请忘记我。我使用File::NFSLock来解决缓存风暴/ dogpile / stampeding问题。有多个应用程序服务器在NFS卷上读取和写入缓存文件(这不是一个好主意,但这就是我们的开始)。

我继承/包装File :: NFSLock来修改它的行为。特别是我需要:

  • 持久性锁定,当File :: NFSLock对象超出范围时,它们不会消失。使用常规的File :: NFSLock,当对象超出范围时,您的锁将消失。这不是我需要的。
  • 实际锁定文件还包含获取锁定的计算机名称。进程ID显然不足以决定进程是否终止,因此我可以安全地窃取锁文件。所以我修改了代码,将锁定文件写为machine:pid,而不仅仅是pid

这已经有好几年了。

直到请求量增加了10倍。也就是说,上个月我开始遇到第一个问题,其中两个后端在同时写入了一个非常繁忙的缓存文件,留下了死锁。当我们每天达到大约9-10M的整体综合浏览量时,这发生在我身上,只是为了给你一个想法。

最终破坏的缓存文件如下所示:

<!-- START OF CACHE FILE BY BACKEND b1 -->
... cache file contents ...
<!--   END OF CACHE FILE BY BACKEND b1 -->
... more cache file contents ... wtf ...
<!--   END OF CACHE FILE BY BACKEND b2 -->

只有当两个后端同时写入同一个文件时才会发生这种情况......目前还不清楚这个问题是由File :: NFSLock +我们的mod还是应用程序中的一些错误引起的。

总之,如果你的应用程序不是非常繁忙和被贩运,那么去File :: NFSLock,我认为这是你最好的选择。您确定还想使用NFS吗?