使用以下版本的 Apache。(MPM:事件)
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>
我了解 ServerLimit、ThreadsPerChild 和 MaxRequestWorkers 之间的关系。(ThreadsPerChild * ServerLimit = MaxRequestWorkers)
在上面的配置中,我期望运行 1 个父进程 + 3 个子进程,总共 4 个进程。
但是,由于某种原因,发生了以下情况,启动了父进程 1 + 子进程 5。
ps -ylC httpd
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 0 1234082 1 1 80 0 62164 85197 - ? 00:00:00 httpd # Parent
S 48 1234083 1234082 0 80 0 55936 88443 - ? 00:00:00 httpd # Child1
S 48 1234084 1234082 0 80 0 55860 88787 - ? 00:00:00 httpd # Child2
S 48 1234085 1234082 0 80 0 63784 697650 - ? 00:00:00 httpd # Child3
S 48 1234086 1234082 0 80 0 61732 648482 - ? 00:00:00 httpd # Child4
S 48 1234087 1234082 0 80 0 65812 648482 - ? 00:00:00 httpd # Child5
当通过发送大量Http请求进行加载时,只有Child3、4、5的RSS有所增加,而Child1和2的变化不大。由此,我推测Child3、4、5是我们期望看到的正常进程,而Child1和2是由于某些特殊原因而创建的进程。
我还有一个问题。关于每个子进程中的线程数,我预计是 25thread。但是,它看起来像这样
ps aux -L | grep httpd | grep -v grep | perl -awln -F'\s+' -e 'print "$F[0] $F[1]"' | sort | uniq -c
1 root 1234082 # Parent
1 apache 1234083 # Child1
1 apache 1234084 # Child2
81 apache 1234085 # Child3
65 apache 1234086 # Child4
65 apache 1234087 # Child5
由于某种原因,Child3、4 和 5 超过了 ThreadsPerChild 的值 25,达到了 65 和 81 这样的数字。(Child1 和 Child2 的异常在这里也很明显。)
问题 1:Child1 和 Child2 进程在做什么?为什么它们要额外启动?
问题2:为什么 Child3、4 和 5 超过了 ThreadsPerChild 并且拥有很大的线程数?
补充说明一下,使用以下设置也可以获得类似的结果。
<IfModule mpm_event_module>
StartServers 4
ServerLimit 4
ThreadsPerChild 25
MaxRequestWorkers 100
</IfModule>
启动了四个被认为正常的子进程和两个被认为不正常的子进程。
ps -ylC httpd
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 0 1235661 1 2 80 0 62540 85203 - ? 00:00:00 httpd
S 48 1235663 1235661 0 80 0 56108 88443 - ? 00:00:00 httpd
S 48 1235664 1235661 0 80 0 56176 88786 - ? 00:00:00 httpd
S 48 1235665 1235661 0 80 0 66036 697656 - ? 00:00:00 httpd
S 48 1235666 1235661 0 80 0 63992 648488 - ? 00:00:00 httpd
S 48 1235667 1235661 0 80 0 63992 664872 - ? 00:00:00 httpd
S 48 1235668 1235661 0 80 0 63968 664872 - ? 00:00:00 httpd
ps aux -L | grep httpd | grep -v grep | perl -awln -F'\s+' -e 'print "$F[0] $F[1]"' | sort | uniq -c
1 root 1235661
1 apache 1235663
1 apache 1235664
81 apache 1235665
65 apache 1235666
65 apache 1235667
65 apache 1235668
提前致谢。
答案1
Child1 和 Child2 由 Apache 多处理模块在启动时创建。这些通常被称为“备用”或“额外”进程。在配置中,您指定了“StartServers 3”,这意味着除了父进程之外,Apache 还会从三个备用进程启动。