Apache / PHP-FPM 从 EBS 切换到 EFS 后性能下降

问题描述 投票:0回答:0

任何故障排除提示将不胜感激。

背景

  • m6a.24Xlarge - Red Hat Enterprise Linux 8.7 (Ootpa)
  • PHP 7.4.30(操作缓存)
  • Apache/2.4.37(红帽企业 Linux)
  • 200 多个 WordPress 站点
  • 所有站点都有一个符号链接到中央插件存储库 IE /mnt/files/sites/plugins
  • EFS 标准单区 14 TB
  • Redis 缓存(同一实例)与 w3-total-cache 插件

我们正在运行一个有多个站点的大型服务器 m6a.24Xlarge。我们有一个 15TB 的 EBS 卷,其中包含我们所有的网站。随着限制很快临近,我们决定切换到 EFS,以实现增加负载平衡的长期目标。在实施之前,我们将我们最大的客户之一置于 EFS 驱动器上。没有性能问题。

慢慢地,我开始将站点转移到 EFS 卷,在 EBS 上创建指向 EFS 卷的符号链接。转移时,我将冷访问 (IA) 设置为 1 天,以降低转移阶段的整体数据存储成本。初始传输完成后,我执行增量传输并一次切换每个站点。 IA 设置为 30 天。

一旦我们到达最后 25% 的站点,一切都会大大减慢。我以为可能是数据从 Cold storage (Infrequently Accessed) 转出。随着数据移出 IA,性能确实有所提高,但 2 周后我们仍然看到问题,下面的问题让我相信我们遇到了我无法定位的瓶颈。

当我将所有内容切换到 EFS 挂载时,服务器根本无法使用 EFS 中的插件文件夹(所有站点都通过符号链接将此文件夹用于 wp-contents/plugins)。我尝试使用 IA(标准单区)之外的所有文件,但它仍然无法正常工作。我认为,这显示了我们在服务器承受负载时看到的瓶颈示例。我最终将插件文件夹移动到本地 EBS 挂载。只要我们没有受到更高流量负载的影响,这现在就可以正常工作。

问题

在中/高流量期间,CPU 负载会飙升至 700 以上(在 96 核系统上),而总体 CPU 使用率始终处于 30-40% 之间。在 EBS 卷上,我们的 CPU 使用率在 30-70% 之间,具体取决于流量。 当 CPU 负载达到峰值时,PHP-FPM Worker 会飙升并以 D 状态坐在那里。它们似乎是等待 CPU 执行的负载。这会导致我们网站的整体速度变慢。增加 Apache 或 PHP 的工作人员似乎不会改变 CPU 使用率。

故障排除

  • 尝试增加 PHP worker 和 Apache 线程,零影响积极或消极
  • 使用 nload,网络负载峰值约为 1.5GBps 传入(或总计 2GBps)。这似乎不是瓶颈
  • RAM 在 370 GB 中平均有 170 GB 变化不大
  • PHP-FPM worker 上的 strace 没有显示任何奇怪的东西。一切似乎都在完成,没有任何明显的挂断
  • ps -ax | grep php | grep -c D
    在中/高负载下显示高数字。当这种情况上升时,网站会变慢。
  • EFS 统计 - IO 使用率大约为 35%,有一些峰值,但从未达到最大值。吞吐量使用率低于 30%。我们还没有触及我们的突发学分。
  • nfsiostat
    以低毫秒显示所有内容。我注意到无论服务器上的负载如何,nfsiostat 似乎都没有太大变化。
  • 我试过在 wireshark 中查看来自服务器的 tcpdump,但我无法找到任何明显的东西。我在这里的能力有限。我确实找到了 7 秒 RTT 的大量连接。
  • 增加
    ulimit
    到最大。这似乎确实有点帮助。我还尝试了 somaxconn 和 tcp_max_syn_backlog 的设置,但没有任何明显的效果。

EFS 挂载命令

 mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 172.00.00.1:/ /mnt/sitefiles

阿帕奇

</IfModule>
    ServerLimit              4000
    StartServers              21
    MinSpareThreads           400
    MaxSpareThreads          1024
    ThreadsPerChild           200
    MaxRequestWorkers      7000
    MaxConnectionsPerChild 0
</IfModule>

PHP-FPM

pm.max_children  = 2000

下一步?

基于 CPU 和 nfsiostat 的平稳性能,我的直觉告诉我们在某个地方遇到了默认的网络/系统瓶颈。我一直无法找到这可能是什么。如果有人对看什么有任何建议,请告诉我。任何输入将不胜感激!

php wordpress apache amazon-efs rhel8
© www.soinside.com 2019 - 2024. All rights reserved.