使用 boost 进程间库的 php exec 共享内存和 Cloudfoundry 容器问题

Posted

技术标签:

【中文标题】使用 boost 进程间库的 php exec 共享内存和 Cloudfoundry 容器问题【英文标题】:Shared memory and Cloudfoundry container issue with php exec using boost interprocess library 【发布时间】:2019-01-29 13:45:41 【问题描述】:

我们的自定义 php-buildpack 在 cloudfoundry 容器中运行。 问题是 apache start -> php-fpm (这里共享内存代码运行良好)。 php-fpm exec() 启动的 php 脚本 -> php-cli(它在共享内存代码上核心转储)。

对于共享内存,我们使用 boost-1.56.0 示例:-

<?php
 exec("php  anotherscript.php");
 ?>

另一个脚本.php

<?php
  custom extention call i.e c/c++ code 
?>

=========== sample.cpp(使用 boost 创建共享内存)

permissions perms;
perms.set_unrestricted();
managed_shared_memory segment(create_only, SharedDataShmSegmentName, segmentSize, 0, perms);
interprocess_sharable_mutex *mutex= segment.construct<interprocess_sharable_mutex>(SharedDataShmMutexName)();

它将核心转储为 - Signal 11 (segmentation fault)(core dumped)

我们怀疑子 exec() 将拥有比主进程更少的权限,或者子 exec() 将没有像 CAP_IPC_LOCK 功能那样的共享内存权限。

由 exec() 创建的 Cloudfoundry 容器子进程是否存在共享内存(boost - 1.56.0)问题?

【问题讨论】:

您尝试为每个容器分配多少共享内存? 共享内存的默认值。对于主内存,我们在 manifest.yml 中给出内存:200M。 【参考方案1】:

您的 Cloud Foundry 管理员需要启用特权容器,否则 CF 会丢弃 CAP_IPC_LOCK 功能。见https://docs.cloudfoundry.org/concepts/container-security.html

共享内存也是一种“特殊”内存。例如,Docker 默认只允许 64MB 的共享内存。当然也可以通过特殊参数--shm-size=""增加——见https://docs.docker.com/engine/reference/run/

但是 CF 不使用 Docker,而是 Garden-runC 可能需要特殊参数来确定共享内存大小。

【讨论】:

它对主进程(即 php-fpm )工作正常,但是当 exec() 调用它时,将 php-cli 作为子进程启动并在那里进行核心转储。

以上是关于使用 boost 进程间库的 php exec 共享内存和 Cloudfoundry 容器问题的主要内容,如果未能解决你的问题,请参考以下文章

用户可能无法在 Linux 系统上打开共享内存对象的原因

如何在提升进程间构造具有给定计数的向量并向其添加元素

boost::python::exec(anything) 调用时崩溃

boost库的安装和使用

Boost::thread库的使用

(如何)我可以在不安装完整的 boost 库的情况下使用 boost::spirit X3 吗?