php - 如何计算 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
在我的集群上,我有一个 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 子进程的问题。
感谢您阅读到最后,并提前感谢您的投入。
解决方案
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 的数量,而不是管理和扩大子进程的数量。
推荐阅读
- httpclient - HTTPClient 4.x Auth 缓存未在上下文中设置
- r - 使用 auto.arima 拟合模型时出错
- java - 有没有办法检查是否在 java 的 3rd 方库中调用了方法?
- c# - c#抽象类中私有构造函数的用途是什么?
- node.js - 空闲的 postgres 连接没有关闭
- swift - 基于 State int 的 SwiftUI ForEach
- laravel - 为数据库laravel中的用户生成api令牌
- java - 是否可以以编程方式访问 Android Q (SDK >= 29) 上的下载文件夹?
- javascript - 当单击第 1 帧中的 div 时,如何向第 2 帧显示隐藏文本?
- d3.js - 如何禁用酒窝js中的值排序