如何确定每个预分叉线程需要多少 RAM 才能在 EC2 小型实例上实现 Wordpress 的最大性能

如何确定每个预分叉线程需要多少 RAM 才能在 EC2 小型实例上实现 Wordpress 的最大性能

刚刚读使 WordPress 在 EC2-Micro 上稳定运行

在“调整 Apache”部分,我不太明白他是如何得出他的 prefork 配置的数字的。

他解释了如何获得平均过程的数字,我得到了。但是:

或者每个进程大约 53MB...在这种情况下,十个线程应该是安全的。这意味着如果我们同时收到十个以上的请求,其他请求将排队,直到有可用的工作线程。为了最大限度地提高性能,我们还将配置系统以始终有这么多的线程可用。

从每个进程 53MB,RAM 为 613MB 开始,他以某种方式获得了这个配置,而我却无法获得:

<IfModule prefork.c>
 StartServers       10
 MinSpareServers    10
 MaxSpareServers   10
 MaxClients       10
 MaxRequestsPerChild  4000
</IfModule>

在 613MB 的限制下,他是如何在每个进程 53MB 的情况下实现这一目标的?

附加问题

从下面来看,在一个小的实例(1.7 GB 内存)上,好的设置是什么?

bitnami@ip-10-203-39-166:~$ ps xav |grep httpd
 1411 ?        Ss     0:00      2     0 114928 15436  0.8 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1415 ?        S      0:06     10     0 125860 55900  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1426 ?        S      0:08     19     0 127000 62996  3.5 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1446 ?        S      0:05     48     0 131932 72792  4.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1513 ?        S      0:05      7     0 125672 54840  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1516 ?        S      0:02      2     0 125228 48680  2.7 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1517 ?        S      0:06      2     0 127004 55796  3.1 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1518 ?        S      0:03      1     0 127196 54208  3.0 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf
 1531 ?        R      0:04      0     0 127500 54236  3.0 /opt/bitnami/apache2/bin/httpd -f /opt/bitnami/apache2/conf/httpd.conf

答案1

计算背后的理念是,您需要为其他事物保留一些内存 - 操作系统和实例上运行的其他服务。之后,将剩余的内存除以平均使用内存(常驻集大小 - RSS 列),以获得服务器在不耗尽内存的情况下可以处理的最大线程数。

话虽如此,我喜欢以稍微不同的方式进行计算,但我稍后会解决这个问题。

来自httpd.conf:

prefork MPM

  • StartServers:要启动的服务器进程数
  • MinSpareServers:保持备用的最小服务器进程数
  • MaxSpareServers:保持备用的最大服务器进程数
  • ServerLimit:服务器生命周期内 MaxClients 的最大值
  • MaxClients:允许启动的最大服务器进程数
  • MaxRequestsPerChild:服务器进程处理的最大请求数

您显示的配置将保持 10 个进程持续运行:您启动 10 个进程 (StartServers),并且您允许的最大服务器进程数为 10 个 (MaxClients)。在这种情况下,MinSpareServers 和 MaxSpareServers 不应发挥作用。服务器进程处理了 4000 个请求后,它将被终止,并在其位置创建一个新进程(以尝试限制内存泄漏等)

因此,假设服务器上的其他所有程序将使用大约 80MB 内存 - 剩下 530MB。用该值除以平均进程大小 (53MB) 可得到 10 个进程。

我认为这个假设有点不准确。如果你在服务器上运行其他程序(例如 MySQL),你肯定需要保留更多内存。此外,没有考虑到变化的空间。为了进行估算,我会为操作系统和其他服务保留至少 120MB,然后将剩余部分减少 10% 以适应变化。因此,最多大约 8 个 Apache 进程。

<IfModule prefork.c>
 StartServers       2
 MinSpareServers    1
 MaxSpareServers   3
 MaxClients       8
 MaxRequestsPerChild  1000
</IfModule>

因此,根据上述情况,最多有 8 个进程。我们只启动 2 个。我们希望在任何给定时间至少有一个空闲进程,但空闲进程不超过 3 个。此外,由于内存是一个问题,MaxRequestsPerChild 已减少。

现在,我更喜欢通过实际运行服务器一段时间,然后停止 Apache 并查看系统其余部分使用了多少内存来计算该数字。从总数中减去该数字,取 90%,然后除以平均 Apache 进程大小。特别是对于更复杂的设置,这会给出更现实的值。

需要指出的是,在内存受限的机器上,Nginx 可能比 Apache 更适合用作 Web 服务器。此外,您肯定希望在 t1.micro 上有一些交换空间(尽管您不会经常使用它)。

答案2

将 MinSpareServers 设置为与 MaxSpareServers 相同的值并没有多大意义 - 它反而违背了支持需求管理滞后的目的。

我没有在您引用的帖子中看到“调整 Apache”部分。我看到的内容似乎没有提供任何关于作者如何测量 Web 服务器占用空间的解释。请参阅这个问题和答案

keepAliveTimeout 为 5 似乎太高了 - 并且也没有提供任何解释。

我不明白将 maxKeepAliveRequests 设置为“大约 MaxClients 的三分之二”背后的逻辑

假设一个平均 53Mb 的进程(对我来说似乎很大)和 613Mb 的自由的记忆,我会从类似的事情开始:

keepAliveTimeout 1
maxKeepAliveRequests 15

<IfModule prefork.c>
   StartServers       5
   MinSpareServers    2
   MaxSpareServers    4
   MaxClients        10
   MaxRequestsPerChild  4000
</IfModule>

但是如果每个页面都引用了很多静态文件,那么您可能需要强制运行更多服务器。

maxrequestsperchild 设置为 1000 可能没问题。

相关内容