ThreadsPerChild 指令

ThreadsPerChild 指令

当我将 ThreadPerChild 设置为 200 时,出现错误并且无法启动 Apache,尽管我仍有 60% 的可用 RAM。服务器是 Windows Server 2008 R2,具有 4GB RAM。在这种情况下,如何为 Apache 使用更多 RAM?

我的 Apache MPM 配置:

# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum  number of requests a server process serves
# Win32DisableAcceptEx: Use accept() rather than AcceptEx() to accept network connections
<IfModule mpm_winnt_module>
   ThreadStackSize 8388608
    ThreadsPerChild      170
    MaxRequestsPerChild    0
    #Win32DisableAcceptEx
</IfModule>

我在 apache 的 error_log 中得到的内容:

[2016 年 12 月 1 日星期四 18:23:04.459113] [mpm_winnt:notice] [pid 3396:tid 288] AH00354:子进程:启动 200 个工作线程。

[2016 年 12 月 1 日星期四 18:23:04.459113] [mpm_winnt:crit] [pid 3396:tid 288](OS 8)存储空间不足,无法处理此命令。:AH00355:子进程:CreateThread 失败。无法创建所有工作线程。使用 ThreadsPerChild 配置指令请求的 200 个线程中,创建了 190 个。

[2016 年 12 月 1 日星期四 18:23:04.474714] [mpm_winnt:notice] [pid 3644:tid 380] AH00422:父级:收到关闭信号 --

编辑:2016 年 12 月 9 日:

关注此页面https://support.microsoft.com/en-us/kb/106167将注册表中的 IRPStackSize 更改为 20 和 25。仍然无法启动 Apache 服务器。

谢谢。

答案1

任何系统上的多处理模块 (mpm) 的线程配置都受到某些限制、系统限制和编译的故障安全设置的限制,如文章中所述Apache MPM 常用指令

ThreadsPerChild 指令

此指令设置每个子进程创建的线程数。子进程在启动时创建这些线程,并且不会再创建更多线程。如果使用像 mpm_winnt 这样的 MPM,其中只有一个子进程,则这个数字应该足够高以处理服务器的整个负载。如果使用像 worker 这样的 MPM,其中有多个子进程,则线程总数应该足够高以处理服务器上的常见负载。

ThreadLimit 指令

使用此指令时必须特别小心。如果 ThreadLimit 设置为远高于 ThreadsPerChild 的值,则会分配额外的未使用共享内存。如果 ThreadLimit 和 ThreadsPerChild 都设置为高于系统可以处理的值,Apache httpd 可能无法启动否则系统可能会变得不稳定。不要将此指令的值设置为高于当前运行 Apache httpd 时 ThreadsPerChild 的最大预期设置。

他们还指出……

默认ThreadLimit 为 1920与 mpm_winnt 一起使用时为 64,与其他一起使用时为 64。

还有一个硬编码的编译限制,您可以通过重新编译代码来规避它,如下所述:

编译到服务器中的 ThreadLimit 有硬性限制,即 ThreadLimit 20000(或带有 event 的 ThreadLimit 100000,带有 mpm_winnt 的 ThreadLimit 15000)。这是为了避免因拼写错误而导致的不良影响。要进一步超过此限制,您需要修改 mpm 源文件中的 MAX_THREAD_LIMIT 值并重建服务器。

ThreadStackSize 指令

ThreadStackSize 指令设置处理客户端连接并调用模块来帮助处理这些连接的线程的堆栈(用于自动数据)的大小。在大多数情况下,操作系统默认的堆栈大小是合理的,但在某些情况下可能需要进行调整:

哪个是...

这是建议不要减少 ThreadStackSize,除非每个子进程需要大量线程。在某些平台(包括 Linux)上,128000 的设置已经太低,导致一些常见模块崩溃。

解决方案

如果您要增加 ThreadsPerChild 指令,则必须将 ThreadLimit 指令调整为相同值或略高一点,同时将 ThreadStackSize 指令降低为低于默认值,同时仍保持系统稳定。

一个可能的解决方案是:

<IfModule mpm_winnt_module>
    ThreadStackSize  6291456
    ThreadsPerChild      200
    ThreadLimit          200
    MaxRequestsPerChild    0
    #Win32DisableAcceptEx
</IfModule>

您将需要对这些值进行一些调整,以确定允许您使用最大可能的 ThreadsPerChild 设置运行稳定系统的设置。

答案2

该人称通过使用 64 位 Windows 和 Apache,他们能够最大限度地发挥他们的ThreadsPerChild.

https://www.apachelounge.com/viewtopic.php?t=5754

今天我尝试了与上面描述的相同的配置,但使用的是 x64 系统:
Windows Server 2012 (x64)
Apache 2.4.7 VC11 64 位
mod_fcgid 2.3.9
PHP 5.4.24 VC11 非线程安全

然而,在 64 位系统上,两个问题消失了:
1. mpm ThreadsPerChild 现在可以设置为 15000

相关内容