在Windows Server 2008 R2上WINNT Apache MPM“ThreadsPerChild”configuration

我得到错误,无法启动Apache时,我将我的ThreadPerChild设置为200,虽然我仍然有60%的可用RAM。 服务器是Windows Server 2008 R2,带有4GB RAM。 如何在这种情况下使用更多的RAM到Apache?

我的Apache MPMconfiguration:

# 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中得到了什么:

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:notice] [pid 3396:tid 288] AH00354:Child:启动200个工作线程。

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:crit] [pid 3396:tid 288](OS 8)没有足够的存储空间来处理这个命令。 :AH00355:子:CreateThread失败。 无法创build所有工作线程。 使用ThreadsPerChildconfiguration指令创build了200个线程中的190个。

[Thu Dec 01 18:23:04.474714 2016] [mpm_winnt:notice] [pid 3644:tid 380] AH00422:Parent:收到关机信号 –

编辑:2016年12月9日:

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

谢谢。

在任何系统上的多处理模块(mpm)的线程configuration都受到某些限制,系统限制和编译的故障安全设置的约束,如Apache MPM通用指令

ThreadsPerChild指令

该指令设置每个subprocess创build的线程数。 孩子在启动时创build这些线程,从不创build更多。 如果使用像mpm_winnt这样只有一个subprocess的MPM,则该数字应该足够高,以处理服务器的整个负载。 如果使用像worker这样的MPM,在有多个subprocess的情况下,线程总数应足够高,以处理服务器上的常见负载。

ThreadLimit指令

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

他们也指出…

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

还有一个硬编码的编译限制,你可以通过重新编译代码来解决这个问题:

ThreadLimit 20000(或带有事件的ThreadLimit 100000,带有mpm_winnt的ThreadLimit 15000)被硬编译到服务器中。 这是为了避免错别字造成的恶意效果。 要进一步增加此限制,您需要修改mpm源文件中的MAX_THREAD_LIMIT值并重build服务器。

ThreadStackSize指令

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

哪个是…

build议不要减lessThreadStackSize,除非每个subprocess需要大量的线程。 在某些平台(包括Linux)上,128000的设置已经太低了,并导致一些通用模块的崩溃。

如果要增加ThreadsPerChild指令,则必须将ThreadLimit指令alignment到相同的值或略高,同时还要将ThreadStackSize指令的值减小到比默认值更小的值,同时仍保持稳定的系统。

一个可能的解决scheme是:

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

您将必须使用这些值进行一些操作,以确定可以使用最大可能的ThreadsPerChild设置运行稳定系统的设置。

这个人说,通过使用64位Windows和Apache,他们能够最大化他们的ThreadsPerChild

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

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

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