gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:51:24 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

我绝对不是这方面的专家,但我的知识是 fcntl ,正如您所说,在您的情况下不起作用。 fcntl 建议锁仅在同一台机器内有意义。

所以如果这与主题无关,请忘记我。我用过 File::NFSLock解决缓存 Storm /狗堆/冲压问题。有多个应用程序服务器在 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 + 我们的 mods 或应用程序中的某些错误引起的。

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

    关于perl - 我可以让 fcntl 和 Perl 警报合作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781613/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com