我正在为数据导入运行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
现在,我试图在Docker容器中运行脚本,该容器是从同一iMac上的VirtualBox VM启动的。 VirtualBox VM有2048MB内存,运行脚本的Docker容器也有相同的内容。
至关重要的是,PHP脚本报告的内存使用量与Docker统计数据相同,并导致脚本在消耗了近2GB后迅速爆炸。 docker容器中的PHP CLI版本是相同的。
我确信这必须与docker转换内存使用情况报告的方式有关,而后者又由http://php.net/manual/en/function.memory-get-usage.php php报告方法获取。 Mac上的过程也没有显示出高使用率。
我对Docker的虚拟化错综复杂知之甚少。是否有可靠的系统调用我可以使用(通过passthru())来获得“真正的”内存使用?
正如所建议的那样,我在同一个(Ubuntu 14.04)虚拟机VM中安装了PHP,该虚拟机具有docker和我的容器。再次运行脚本显示与OSX上相同的行为,即内存使用量永远不会超过100MB。
上图显示了顶级运行,同时脚本在docker容器(1.306g)内运行,脚本在VM上运行(~83Mb)。两个进程都正在运行相同的脚本(VM通过NFS挂载,容器在VM上有数据卷)。
启动容器时,我确实看到以下消息(警告:您的内核不支持交换限制功能,内存限制没有交换。):