首页 > 解决方案 > 如何计算 Kubernetes 集群上的 php-fpm 子进程

问题描述

出于扩展的原因,我最近将我的应用程序从带有 docker 的单个服务器迁移到了 Google Kubernetes Engine。我是 Kubernetes 平台的新手,我可能还没有完全理解它的概念,但我确实掌握了基础知识。

我已成功将我的应用程序迁移到cluster size of 3 each with 1vCPU and 3.75 GB RAM

现在我发现了在 kubernetes 集群中运行的 php-fpm 进程的最佳配置是什么。我已经阅读了一些关于如何设置 php-fpm 进程的文章,例如

https://serversforhackers.com/c/php-fpm-process-management

https://www.kinamo.be/en/support/faq/determining-the-correct-number-of-child-processes-for-php-fpm-on-nginx

在我的集群上,我有一个 Elasticsearch、Redis、Frontend 和一个 REST Api 以及我对 kubernetes 的理解,每个都有自己的 pod 在我的集群上运行,我尝试访问 REST Api 的 pod 并看到 1 个 vCPU 和 3.75 GB RAM是我在集群规格上设置的。RAM 只剩下 1.75GB,所以我认为还有其他服务或 pod 正在使用内存。

所以现在我想根据我上面分享的文章增加以下的大小。

pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 4
pm.max_spare_servers = 8 

但我的问题是,由于 pod 位于工作人员身上,如果我根据剩余的可用内存更改配置(基于我在上面分享的关于计算 pm.max_children 的文章),我可能最终会消耗掉剩余的所有内存空间,并且将无法分配给其他服务。我的问题有意义吗?还是有我想念的想法?

基于这篇文章,因为我的员工有 3.75 GB RAM,而其他服务已经在消耗 1.5GB 内存,所以我的最佳目标是 1 GB RAM。

pm.max_children 将我们带到 1024 Mb / 60 Mb = 17 max_children

pm.max_children = 17
pm.start_servers = 8
pm.min_spare_servers = 7
pm.max_spare_servers = 10
pm.max_requests = 500

这让我想到了当有其他服务或 pod 共享相同资源时,如何计算 Kubernetes 集群上的 php-fpm 子进程的问题。

感谢您阅读到最后,并提前感谢您的投入。

标签: phpdockerkubernetesgoogle-cloud-platformgoogle-kubernetes-engine

解决方案


GKE 带有多个系统 pod(例如 kube-DNS 和 fluentd)。其中一些 Pod 的扩展性不大,这意味着如果您添加额外的节点,它们将拥有更多可用资源。

这些节点也在运行一个操作系统,因此一些内存被分配给它。您还可以使用查看每个节点可用的资源kubectl describe no | grep Allocatable -A 5

这将显示节点消耗后剩余的资源量。使用kubectl describe no | grep Allocated -A 5您可以查看当前 pod 已请求的内存量和 CPU 量。

综上所述,您应该根据需要选择子进程的数量。一旦你知道 pod 需要的内存量,设置资源请求和限制到你的 pod 配置,以便 kubernetes 调度程序可以将 php-fpm 放在具有足够资源的节点上。

Kubernetes 的优势在于你告诉它你想要什么,它会努力做到这一点。与其过分担心可以容纳多少,不如根据您的预期/所需性能为您的 pod 选择一个数量,并告诉 kubernetes 您需要多少内存。这样,您还可以使用 HPA 增加 pod 的数量,而不是管理和扩大子进程的数量。


推荐阅读