如何计算每个prefork线程需要多less内存,以便在EC2小实例上获得最大的WordPress性能

只要阅读让EC2-Micro上的WordPress稳定

在“调整Apache”部分,我不能完全弄清楚他是如何为自己的preforkconfiguration提供数字的。

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

或者每个进程大约53MB …在这种情况下,十个线程应该是安全的。 这意味着,如果我们收到超过10个并发请求,其他请求将排队,直到一个工作线程可用。 为了最大限度地提高性能,我们还将configuration系统使这个线程数始终可用。

从每个进程53MB,与613MB的RAM,他不知何故得到这个configuration,我不明白:

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

他是如何从每个进程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 

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

也就是说,我喜欢稍微改变一下我的计算方法,但是我会在稍后解决。

从httpd.conf:

prefork MPM

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

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

所以,假设是你的服务器上的其他所有内容都会使用大约80MB的内存 – 530MB。 除以你的平均进程大小(53MB)得到10个进程。

我build议这个假设是有一点的。 如果你在服务器上运行其他任何东西(比如MySQL),你肯定需要保留更多的内存。 此外,没有考虑变化的空间。为了估计,我将为操作系统和其他服务留出至less120MB的空间,然后将差额减less10%。 所以,大约有8个apache进程。

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

所以,以上 – 最多有8个进程。 我们只是开始2.我们希望在任何时候至less有一个闲置 – 但不超过3空闲。 此外,由于内存是一个问题,MaxRequestsPerChild已经减less。

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

作为提及的一点,在内存受限的盒子上,Nginx可能比Apache更适合作为networking服务器。 另外,你肯定希望在t1.micro上有一些交换空间(尽pipe你不应该使用它)。

将MinSpareServers设置为与MaxSpareServers相同的值并没有什么意义 – 这相当于支持需求pipe理的滞后目的。

我没有看到你引用的post中的“调整Apache”部分。 我可以看到,似乎没有提供作者如何测量Web服务器的足迹的任何解释。 看到这个问题和答案 。

5的keepAliveTimeout似乎很高 – 也没有提供任何解释。

我没有看到将maxKeepAliveRequests设置为“大约三分之二的MaxClients”的逻辑

假设一个平均53Mb的进程(这对我来说似乎相当大)和613Mb的空闲内存,我会从如下开始:

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

但是如果你有很多从每个页面引用的静态文件,那么你可能想强制更多的服务器运行。

maxrequestsperchild设置为1000可能是好的。