刚刚读使 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 可能没问题。