php memory_limit 与 kubernetes 资源内存限制

php memory_limit 与 kubernetes 资源内存限制

我是 Kubernetes 的新手,我正在尝试弄清楚应该为我的 php webapp 设置什么资源限制。

我的第一个猜测是,如果我已经将 php fpm 配置为最大使用 256M 内存,那么我是否也应该将 kubernetes 配置为限制为 256M。

设置如下:

  1. 在构建php容器的Dockerfile中,我将php memory_limit设置为256M:

    sed -i '/^;php_admin_value\[memory_limit\]/cphp_value[memory_limit] = 256M' /usr/local/etc/php-fpm.d/www.conf
    
  2. 在我的 Kubernetes 中,Deployment我在 fpm 容器上设置了如下资源限制:

    resources:
      requests:
        cpu: "500m"
        memory: "128Mi"
      limits:
        cpu: "1"
        memory: "256Mi"
    

让我问这个问题的是PHP.net 的文档说:

memory_limit整数

这设置了允许脚本分配的最大内存量(以字节为单位)。这有助于防止编写不当的脚本耗尽服务器上所有可用内存。

php fpm 可以同时处理多个请求,我想每个请求都会运行一个完全独立的脚本。它们不会分享设置memory_limit。如果是这样的话,也许我的 Kubernetes 容器限制应该高于 phpmemory_limit设置?

好的,但是要高多少呢!?如果我限制,cpu: 1我猜这意味着不能进行真正的并行处理,但仍然可以有许多进程共享 CPU,当 IO 阻塞时,操作系统会切换。我认为 fpmpm.max_children设置会告诉我可以运行多少个脚本,因此最多可以占用多少内存。但这就是令人困惑的地方,因为在我们的非 Kubernetes 设置中,我们max_children根据实例有多少内存来选择。我们使用的公式是:

max_children = (RAM - 2Gb) / 80Mb

# Where:
#  * We Reserve 2Gb for the system.
#  * We saw that each request needs on average 40Mb of memory, so we chose 80Mb to be safe.

在 Kubernetes 世界中,这个等式不复存在,因为 RAM 是在运行时规定的,并且您不需要为系统保留任何内存,因为容器仅运行 php。

我正在考虑使用:

memory_limit = 256M
max_children = 10

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "1"
    memory: "2Gi"
  • 正常情况:10 个孩子,每个孩子使用 40M。内存使用量:400M
  • 高案例:10 个孩子,每个孩子使用 80M 内存使用量:800M
  • 最大情况:10 个子进程,每个进程使用 256M 内存使用量:2560M。这种情况不太可能发生,但如果发生了,Kubernetes 会将 Pod 设置为,OOMKilled我认为这是因为它超出了限制。

这种想法合理吗?我认为它不会允许很好的打包,因为 10 个孩子几乎不需要 2Gi 的限制。我们将使用羟脯氨酸如果资源紧张,则添加更多 pod。

您在 Kubernetes 设置中做了什么?

答案1

设置容器资源请求和限制是有效使用 Kubernetes 集群资源的第一步。设置好这些资源后,请确保您已设置好监控和警报,以确定是否需要调整这些值或升级集群。如果您的容器遇到内存压力,内核将积极地删除页面缓存条目以满足需求,并可能最终被 Linux 内存不足 (OOM) Killer 杀死。由于 K8s 禁用了交换(通过将 memory-swappiness=0 传递给 Docker),因此它对于错误配置来说是一个相当难以容忍的环境。

下面您可以找到一些适合阅读以了解 K8s 限制和请求的文章:

相关内容