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

mmc*_*coo 5 perl nfs locking fcntl

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

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

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

我相信正在发生的事情是,fcntl每隔30秒左右只检查一次信号.警报最终会回来.ctrl-c最终被抓住了.

有什么办法可以调整fcntl检查这些信号的频率吗?

Cos*_*imo 1

我绝对不是这方面的专家,但据我所知fcntl,正如您所说,这不适用于您的情况。fcntl 咨询锁仅在同一台机器内有意义。

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

我对 File::NFSLock 进行子类化/包装以修改其行为。我特别需要:

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

这几年来效果非常好。

直到请求量增加了 10 倍。也就是说,上个月我开始遇到第一个问题,两个后端同时写入一个非常繁忙的缓存文件,留下死锁。当我们每天的综合浏览量达到 9-1000 万左右时,我就遇到了这种情况,只是为了给您一个想法。

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

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)

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

总之,如果您的应用程序不是非常繁忙和流量,那么请选择 File::NFSLock,我认为这是您最好的选择。您确定仍想使用 NFS 吗?