共享内存段被删除?

lem*_*eze -6 c linux mmap pthreads shared-memory

我在共享内存段中使用一个简单的 pthreads 进程共享互斥锁来协调多个服务器实例。

代码是直接的:
在启动时服务器附连到共享存储器段(如果存在),或创建它,如果它不:
shm_open()mmap(MAP_SHARED)

这在测试时效果很好,但是一旦部署一段时间后,我就会遇到服务器实例根本不协调的情况。我可以通过在服务器启动后删除共享内存段来复制这一点:未来的服务器实例将创建/使用一个新段,但现有的一个被困在没有人使用的旧段中,因此实际上它与其余部分隔离......

所以我的猜测是 /dev/shm 中的共享内存段以某种方式被删除了,而不是我。这是唯一有意义的事情......这里发生了什么?

使用 linux 4.9 运行 debian。

lem*_*eze 5

啊,看起来systemd是罪魁祸首:

dev-shm-files-disappearing

经过数小时的搜索和阅读,我找到了罪魁祸首。这是 systemd 的设置。将/etc/systemd/logind.conf包含默认的配置选项,与他们每个人的注释。该RemoveIPC选项默认设置为 yes。该选项告诉 systemd 为未登录的“用户帐户”清理进程间通信(IPC)。这不会影响“系统帐户”

就我而言,文件和目录是为用户帐户而不是系统帐户创建的。

有两种可能的解决方案:

  1. 使用/为系统用户创建文件——使用系统选项(adduser -radduser --system)创建的用户
  2. 编辑/etc/systemd/logind.conf,取消注释该行RemoveIPC=yes,将其更改为RemoveIPC=no,保存并重新启动系统

就我而言,我选择了选项 #2,因为用户已经创建。

另请参阅postgresql 邮件列表上的这篇文章