gpt4 book ai didi

linux - IPC msgsnd 意外等待

转载 作者:行者123 更新时间:2023-12-04 17:09:19 24 4
gpt4 key购买 nike

[虽然我在 perl 工作,但我相信这个问题与 Linux System V IPC 有关API 和限制,而不是任何特定于 perl 的内容。]

我有两台 Centos 机器,每台机器都是 CentOS Linux 7.9.2009 (Core) 版本。

我有一个程序可以 fork 一个 child ,然后使用 System V IPC 消息与 child 通信, child 准备答案并将它们发送给 parent 。

在一台机器上,我们看到了预期的行为。 child 产生一批消息, parent 消费它们。有时 child 的工作速度比 parent 快一点,因此可能会填满队列,然后 child 会等待,直到 parent 消费了一些消息并继续。

我们可以使用 ipcs -q 检查队列大小,发现偶尔会达到每个队列 10 条消息的默认限制,子进程暂停,然后我们看到队列如预期的那样为空。

我们相信队列限制在 /proc/sys/fs/mqueue/ 中的文件中指定,例如 msg_max 被认为是预期的 10。这些两台机器上的值相同。

我们还可以使用 ulimit -q 查看与队列相关的用户 ulimits,并在两台机器上看到一个超过 800,000 字节的值。

令人困惑的是,在我们的第二台机器上,我们看到 child 向队列中写入了三条消息并尝试写入第四条消息并等待 - 我们故意不设置超时。就好像作者认为队列已满,即使 ipcs -q 显示队列中只有 3 个项目。此时 parent 尚未尝试阅读消息。

------ Message Queues --------
key msqid owner perms used-bytes messages
0x0000002a 1474560 dave 600 15020 3

问题:除了队列已满,还有什么会导致 msgsnd() 暂停?停顿似乎无限期地继续, child 继续当 parent 变得活跃并阅读一些消息。

我们有很多机器可以毫无问题地运行这段代码。它在三台新机器上失败。大概有一些特定于环境的功能与我们的代码交互?

perl 代码在系统调用之上使用了一个瘦库(省略了细节)

$mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
msgsnd( $mQueue, pack("l! a*", length($msg), $msg);

最佳答案

问题是 队列的默认最大大小 内核设置设置为较低的值。

可以使用 ipcs 的 -l 选项查看此 cal。

ipcs -q -l

------ Messages Limits --------
max queues system wide = 3671
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

有问题的内核设置存储在

/proc/sys/kernel/msgmnb

并且可以使用命令更改(作为 root)

 sysctl -w kernel.msgmnb=65536
kernel.msgmnb = 65536

关于linux - IPC msgsnd 意外等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69799187/

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