如何在 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_kids 的文章(,我最终可能会成为一个占用所有剩余内存空间的 pod,并且无法为其他服务分配。我的问题有意义吗?还是我缺少一个想法?

基于这篇文章,因为我的工作有 3.75 GB RAM,而其他服务已经消耗了 1.5GB RAM,所以我最好的目标是 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 子进程。

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

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 的数量,而不是管理和扩展子进程的数量。

最新更新