在Docker容器中运行的脚本报告的内存要比外部高得多

我正在运行一个PHP cli脚本进行数据导入。 它定期检查其内存使用情况,如果它接近极限,则会优雅地轰炸。

if ($percentage = (memory_get_usage() / ini_get('memory_limit')) > 0.95) { $message = sprintf("%s Memory used %d Mb of %d Mb", ImportException::MEMORY_LIMIT_REACHED, (memory_get_usage() / 1024/1024), (ini_get('memory_limit') / 1024/1024)); $this->logger->emergency($message); throw new ImportException($message); } 

在OSX(El Capitan iMac 3.5Ghz i7)上通过自制PHP CLI(v5.6.18)运行时,脚本运行良好,内存使用率从未超过100MB左右

在这里输入图像说明 现在,我正在尝试在同一个iMac上从VirtualBox VM启动的Docker容器中运行脚本。 VirtualBox虚拟机有2048MB的内存,运行这个脚本的Docker容器也是一样的。

Virtualbox设置

显示内存分配的Docker容器启动脚本

Docker统计信息显示高内存使用率

至关重要的是,PHP脚本报告与Docker统计数据相同的大量内存使用情况,并导致脚本在消耗近2GB后提早popup。 Docker容器内的PHP CLI版本是相同的。

我相信这必须与docker转换内存使用情况报告的方式有关,后者又被http://php.net/manual/en/function.memory-get-usage.php php报告方法。 Mac上的进程不会显示高使用率。

我只是不太了解虚拟化与Docker的复杂性。 有一个可靠的系统调用,我可以使用(通过passthru())获得“真实”的内存使用情况?

正如所build议的,我在同一个(Ubuntu 14.04)有docker和我的容器的虚拟机VM中安装了PHP。 再次运行脚本显示与OSX相同的行为,即内存使用率不超过100MB。

在这里输入图像说明

上面的图片显示了在Docker容器(1.306g)内运行的脚本和在VM(〜83Mb)上运行的脚本的顶部运行。 两个进程都正确运行相同的脚本(虚拟机通过NFS装载,容器在虚拟机上有数据卷)。

我在启动容器时看到以下消息(警告:您的内核不支持交换限制function,内存限制不交换。):

在这里输入图像说明