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

Posted

技术标签:

【中文标题】我可以让 fcntl 和 Perl 警报合作吗?【英文标题】:Can I get fcntl and Perl alarms to cooperate? 【发布时间】:2010-09-23 18:56:49 【问题描述】:

我使用的是 linux,nfs,涉及多台机器。

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

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

我认为正在发生的是 fcntl 仅每 30 秒左右检查一次信号。警报最终还是会回来。 ctrl-c 被抓住了,……最终。

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

【问题讨论】:

锁定 NFS 很难。使用 File::NFSLock 可能会为您提供一个 Just Works 的解决方案,而无需您编写任何代码。 File::NFSLock 有一些自己的漏洞。它试图用硬链接和其他东西玩一些技巧,但如果你的文件系统过载,你很容易出现竞争条件,从而产生两个具有相同锁的进程。 它确实有一些记录在案的缺点,包括在高度争议的情况下饿死等待进程的倾向,是的。但是,对于您要解决的问题,它仍然很可能是正确的权衡。我真的不能说,因为你没有进一步描述你的情况。然而,我可以从使用 File::NFSLock 的经验谈起:与我正在做的大多数其他事情相比,我从未见过它的方法使我的任何进程挨饿,即使在有很多争用的情况下也是如此。依赖于它的模块数量似乎也表明它对大多数人来说已经足够了 @rafl:请发布一些内容作为答案。人们需要一些东西来 +1。 @mmccoo:不要指望奇迹,NFS 上的文件锁定根据定义是损坏的,可能不可靠。不管是什么编程语言。一般来说,如果您需要共享锁定,是时候考虑部署真正的分布式文件系统,例如GlusterFS。给你的雇主/IT/客户一个提示。 【参考方案1】:

我绝对不是这方面的专家,但我知道fcntl,正如你所说的,在你的情况下不起作用。 fcntl 咨询锁只在同一台机器上才有意义。

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

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

持久锁,当 File::NFSLock 对象超出范围时不会消失。使用常规 File::NFSLock,当对象超出范围时,您的锁将消失。这不是我需要的。 实际的锁文件还包含获得锁的机器名称。进程 id 显然不足以决定一个进程是否被终止,所以我可以安全地窃取 lockfile。所以我修改了代码,把锁文件写成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 -->

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

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

【讨论】:

以上是关于我可以让 fcntl 和 Perl 警报合作吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过网页使 perl 脚本可执行

Perl在使用警报超时时出现分段错误

Twitter Bootstrap 警报可以淡入淡出吗?

如何让选中的复选框在警报时显示

应用程序可以决定在收到推送通知时根据用户字典显示警报吗?

我可以在警报功能中使用滚动和单击动作脚本吗?