lem*_*eze -6 c linux mmap pthreads shared-memory
我在共享内存段中使用一个简单的 pthreads 进程共享互斥锁来协调多个服务器实例。
代码是直接的:
在启动时服务器附连到共享存储器段(如果存在),或创建它,如果它不:
shm_open(),mmap(MAP_SHARED)等
这在测试时效果很好,但是一旦部署一段时间后,我就会遇到服务器实例根本不协调的情况。我可以通过在服务器启动后删除共享内存段来复制这一点:未来的服务器实例将创建/使用一个新段,但现有的一个被困在没有人使用的旧段中,因此实际上它与其余部分隔离......
所以我的猜测是 /dev/shm 中的共享内存段以某种方式被删除了,而不是我。这是唯一有意义的事情......这里发生了什么?
使用 linux 4.9 运行 debian。
啊,看起来systemd是罪魁祸首:
经过数小时的搜索和阅读,我找到了罪魁祸首。这是 systemd 的设置。将
/etc/systemd/logind.conf包含默认的配置选项,与他们每个人的注释。该RemoveIPC选项默认设置为 yes。该选项告诉 systemd 为未登录的“用户帐户”清理进程间通信(IPC)。这不会影响“系统帐户”就我而言,文件和目录是为用户帐户而不是系统帐户创建的。
有两种可能的解决方案:
- 使用/为系统用户创建文件——使用系统选项(
adduser -r或adduser --system)创建的用户- 编辑
/etc/systemd/logind.conf,取消注释该行RemoveIPC=yes,将其更改为RemoveIPC=no,保存并重新启动系统就我而言,我选择了选项 #2,因为用户已经创建。
另请参阅postgresql 邮件列表上的这篇文章。