我正在使用PHP在Kubernetes上运行一些计划的命令。
在本地docker上运行命令时,PHP RAM的使用至少比Kubernetes少70%。
我在本地和Kubernetes上都使用了相同的Docker镜像。
一个示例脚本:
<?php
use Symfony\Component\Process\Process;
require __DIR__ . '/vendor/autoload.php';
$remotePath = 'https://server/file.csv'; // Around 150MB
function downloadViaCurl($remotePath)
{
$commandline = sprintf(
'curl -o %s %s',
'/tmp/file.csv',
$remotePath
);
$process = new Process($commandline);
$process->disableOutput();
$process->setTimeout(null);
$process->run();
}
downloadViaCurl($remotePath);
$memory = memory_get_peak_usage(true) / 1000000;
echo sprintf("Used %.2fMB of RAM" . PHP_EOL, $memory);
本地Docker的输出:
Used 2.10MB of RAM
K8S上的输出:
Used 6.29Mb of RAM
可以在https://github.com/InFog/memory_issues上找到Dockerfile和job.yaml
最佳答案
我发现了问题。
1-K8S部署将应用程序设置为开发模式。这是一个使用Doctrine ORM的Symfony应用程序。 Doctrine ORM的分析处于 Activity 状态,这使其能够收集内存中的所有查询,从而大大增加了所需的内存量。对于运行多达一百万个查询的长时间运行的进程,它使用的内存约为500MB,将其更改为未配置文件后,其使用的内存少于30MB。
经验教训:始终检查生产参数。
2-第二个问题:cronjob每次运行K8S都会运行一个没有Symfony缓存的新容器。这也将影响内存使用。我通过在将镜像推送到注册表之前预热Symfony缓存来解决此问题。
关于php - PHP脚本至少需要Kubernetes上ram数量的3倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62191070/