如何计算每个 prefork 线程需要多少 RAM 才能在 EC2 小型实例上获得最大 Wordpress 性能

two*_*ash 3 wordpress mpm-prefork amazon-ec2 apache-2.2

只需阅读使 WordPress 在 EC2-Micro 上稳定

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

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

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

从每个进程 53MB 到 613MB 的 RAM,他以某种方式获得了这个配置,而我没有得到:

<IfModule prefork.c>
 StartServers       10
 MinSpareServers    10
 MaxSpareServers   10
 MaxClients       10
 MaxRequestsPerChild  4000
</IfModule>
Run Code Online (Sandbox Code Playgroud)

他究竟是如何从每个进程 53MB 得到这个的,限制为 613MB?

奖金问题

从下面,在一个小实例(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
Run Code Online (Sandbox Code Playgroud)

cyb*_*x86 6

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

也就是说,我喜欢稍微不同地进行我的计算,但我稍后会解决这个问题。

来自 httpd.conf:

分叉前 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>
Run Code Online (Sandbox Code Playgroud)

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

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

值得一提的是,在内存受限的情况下,作为网络服务器,Nginx 可能比 Apache 更可取。此外,您肯定希望在 t1.micro 上有一些交换空间(尽管您不应该发现自己经常使用它)。