1

我有一个长期运行的 PHP 应用程序,它生成多个子进程以在 CentOS VM 上运行任务,它使用 SysV IPC 消息队列(通过 msg_get_queue() 等)将事件发送到父进程。

问题是即使孩子们在退出之前很好地执行了 msg_remove_queue(),消息资源似乎仍然停留在系统级别。最终这会填满消息队列,直到到达 kernel.msgni。

有趣的是,当我跑步时

ipcs

作为运行此脚本的用户,我看到消息队列按预期出现和消失。但是,当我以 root 身份运行相同的命令时,队列列表会缓慢而持续地增长,其中很多都在列表中:

0x00000000 1031634944 <user>  0          0            0 

我不是 SysV 消息队列方面的专家,所以我有点不确定这里的最佳解决方案,或者是否有一个好的解决方案。目前,我已将 kernel.msgni 设置为 100,000(!)。我不确定这在 1GB 盒子上是否是个好主意。

请注意,权限为 0,使用的字节数也为 0。所以理论上这些队列不占用任何空间,尽管在某些时候我希望系统迭代这些是系统的负载。

我的问题是:

  1. 为什么会这样?
  2. 这些资源是否会过期、超时或以其他方式消失?
  3. 有没有我没有看到的解决方案?
4

0 回答 0