计算Apache响应大量请求所需的RAM

Calculating the RAM required for Apache to respond to a large number of requests

提问人:fsk5304 提问时间:6/13/2023 更新时间:6/14/2023 访问量:86

问:

我想调查一下当 apahce 处于负载状态时,单个进程消耗了多少 RAM。
我需要知道可以毫不拖延地响应 10,000 个并发 HTTP 请求的 RAM 量。

我正在使用以下版本的 Apache:

httpd -V
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
Server built:   Jun 15 2022 08:27:14
Server's Module Magic Number: xxxxxxxx:xx
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)

我有以下设置:

<IfModule mpm_event_module>
    StartServers 3
    ServerLimit 3
    ThreadsPerChild 25
    MaxRequestWorkers 75
</IfModule>

使用上述设置,我期望有 4 个进程(1 个父进程 + 3 个子进程)。

但是由于某种原因,父进程 1 + 子进程 5 启动。

ps  -ylC httpd
S   UID     PID    PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0  877361       1  1  80   0 62512 85183 -      ?        00:00:00 httpd # Parent
S    48  877362  877361  0  80   0 56156 88418 -      ?        00:00:00 httpd # Child1
S    48  877363  877361  0  80   0 56228 88762 -      ?        00:00:00 httpd # Child2
S    48  877364  877361  0  80   0 66152 713989 -     ?        00:00:00 httpd # Child3
S    48  877365  877361  0  80   0 64104 648435 -     ?        00:00:00 httpd # Child4
S    48  877366  877361  0  80   0 64104 664819 -     ?        00:00:00 httpd # Child5

当发送大量 Http 请求并应用负载时,只有 Child3、4、5 RSS 增加。

ps  -ylC httpd
S   UID     PID    PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0  877361       1  0  80   0 62512 85183 -      ?        00:00:00 httpd # Parent
S    48  877362  877361  0  80   0 56164 88418 -      ?        00:00:00 httpd # Child1
S    48  877363  877361  0  80   0 56236 88762 -      ?        00:00:00 httpd # Child2
S    48  877364  877361  0  80   0 86996 713989 -     ?        00:00:02 httpd # Child3 : RSS increased
S    48  877365  877361  0  80   0 83868 648435 -     ?        00:00:02 httpd # Child4 : RSS increased
S    48  877366  877361  0  80   0 85908 664819 -     ?        00:00:02 httpd # Child5 : RSS increased

Child1 和 Child2 进程在做什么?

儿童3,4,5 平均RSS: (86996KB+83868KB+85908KB)/3≒85MB

综上所述,当由于一次大量访问导致负载较高时,每个进程使用 25 个线程进行处理,此时每个进程消耗 85 MB。

10000/25*85MB=34GB

这是否意味着我需要大约 34GB 的 RAM 才能立即响应 10000 个并发请求? (当然,这并不严格,但粗略的值是可以的。并假设内存是瓶颈,流量、RDBMS 和其他资源(如 CPU)都足够了。

提前致谢。

Linux Apache HTTP Web 服务器 RAM

评论

0赞 Olaf Kock 6/13/2023
由于结果将在很大程度上取决于 (1) 完成的工作量(例如动态请求) (2) 网络带宽,包括上游 (3) 延迟 (4) 处理请求所需的持续时间 (5) 请求/响应的大小 (6) 数据的“可缓存性”和 (7-n) 许多其他因素,这个问题无法在 stackoverflow 的焦点内回答。投票决定以固执己见的方式关闭,请参阅帮助中心
0赞 fsk5304 6/13/2023
我在服务器上放置了与实际用户假设的 HTTP 请求相同的负载,因此我可以对 (1)、(4)、(5) 和 (6) 进行类比。此外,(2)和(3)可以忽略,因为准备了足够的资源。(7-n)根据您现在拥有的数据估计一般结果也很重要。

答:

0赞 fsk5304 6/14/2023 #1

以下网站使我确信我走在正确的轨道上。

https://kb.vmware.com/s/article/1036729

示例:假设使用 worker 设置了 ThreadsPerChild 25 和 MaxClients 50,并且两个子进程在满载下分别使用 128MB 的 RAM 和 5% 的 CPU。您可以大致预期 8 个子项 (MaxClients 200 = 25 x 8) 在满载下使用 1GB RAM 和 40% 的 CPU。