Apache应对10000并发请求的内存测算及进程异常问询
Apache进程角色与并发内存估算问题
环境信息
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)
MPM Event配置
<IfModule mpm_event_module> StartServers 3 ServerLimit 3 ThreadsPerChild 25 MaxRequestWorkers 75 </IfModule>
进程无负载运行状态
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
进程负载后运行状态
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
问题解答
1. Child1和Child2进程的任务
在Apache的event MPM模式下,进程分为两类:
- Listener进程:专门负责监听TCP端口,接收客户端连接请求,随后将连接转交给Worker进程处理。这类进程不参与HTTP请求的业务逻辑处理,内存占用始终稳定,负载状态下RSS不会明显增长。
- Worker进程:实际执行HTTP请求的处理逻辑,包括解析请求、生成响应、调用后端服务等,负载时会随着请求处理占用更多内存,RSS随之增长。
你看到的Child1、Child2就是Listener进程,Child3-5是Worker进程。event MPM默认会启动少量Listener进程分散连接接收压力,避免单Listener进程成为瓶颈,这就是实际进程数比配置的StartServers多2个的原因。
2. 10000并发请求的内存估算是否合理?
你的估算逻辑是成立的:
- 单Worker进程可处理
ThreadsPerChild=25个并发请求,高负载下每个Worker进程RSS约85MB - 处理10000个并发需要
10000/25=400个Worker进程 - 总内存需求约
400*85MB=34GB
补充细节:
- RSS是驻留集内存,包含进程独占内存和与其他Apache进程共享的内存(如Apache二进制代码段、共享库等)。实际运行中共享内存部分不会重复计算,因此实际总内存消耗会略低于34GB,但在你假设的“内存为唯一瓶颈、其他资源充足”的前提下,这个粗略估算可作为参考。
- 若要获得更精准数值,可通过
pmap工具分析进程内存组成,区分共享与独占内存后再计算。
参考资料:《如何确定所需的核心数和内存容量?》
内容的提问来源于stack exchange,提问作者fsk5304
相关产品推荐
相关产品推荐

