我在Linux上,nfs,涉及多台机器。
我正在尝试使用fcntl来实现文件锁定。我一直在使用flock,直到我发现它只能在同一台机器上的进程之间工作。
现在当我用F_SETLKW调用fcntl时,perl警报(用于添加超时)不像以前一样工作。这通常没问题,但是ctrl-c也没有用。
我相信正在发生的事情是,fcntl只是每30秒检查一次信号。警报最终会回来。 ctrl-c被捕获,......最终。
我能做些什么来调整fcntl检查这些信号的频率吗?
答案 0 :(得分:1)
我绝对不是这方面的专家,但我的知识是fcntl
,正如你所说的那样,对你的情况不起作用。 fcntl咨询锁仅在同一台机器中有意义。
如果这个偏离主题,请忘记我。我使用File::NFSLock来解决缓存风暴/ dogpile / stampeding问题。有多个应用程序服务器在NFS卷上读取和写入缓存文件(这不是一个好主意,但这就是我们的开始)。
我继承/包装File :: NFSLock来修改它的行为。特别是我需要:
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吗?