Apache 子进程启动次数超过 ServerLimit,线程执行次数超过 ThreadsPerChild

Apache 子进程启动次数超过 ServerLimit,线程执行次数超过 ThreadsPerChild

使用以下版本的 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 还会从三个备用进程启动。

相关内容