fragen stichworte

WINNT Apache MPM-Konfiguration "ThreadsPerChild" unter Windows Server 2008 R2

Ich bekomme eine Fehlermeldung und kann Apache nicht starten, wenn ich ThreadPerChild auf 200 eingestellt habe, obwohl ich immer noch 60% freien RAM habe. Server ist Windows Server 2008 R2 mit 4 GB RAM. Wie kann man in diesem Fall mehr RAM für den Apache nutzen?

Meine Apache MPM-Konfiguration:

# 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>

Was ich in apaches error_log bekomme:

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:notice] [pid 3396:tid 288] AH00354: Child: Starting 200 worker threads.

[Thu Dec 01 18:23:04.459113 2016] [mpm_winnt:crit] [pid 3396:tid 288] (OS 8)Not enough storage is available to process this command. : AH00355: Child: CreateThread failed. Unable to create all worker threads. Created 190 of the 200 threads requested with the ThreadsPerChild configuration directive.

[Thu Dec 01 18:23:04.474714 2016] [mpm_winnt:notice] [pid 3644:tid 380] AH00422: Parent: Received shutdown signal --

BEARBEITEN: 9. Dezember 2016:

Folge dieser Seite https://support.microsoft.com/de-de/kb/106167, um IRPStackSize in der Registrierung auf 20 und 25 zu ändern. Der Apache-Server konnte immer noch nicht gestartet werden.

Danke.

antworten

Diese Person sagt, dass sie unter Verwendung von 64-Bit-Windows und Apache ihre ThreadsPerChild maximieren konnten.

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

Today I've tried the same configuration as described above but using x64 system:
Windows Server 2012 (x64)
Apache 2.4.7 VC11 64bit
mod_fcgid 2.3.9
PHP 5.4.24 VC11 Non-thread-safe

However, on a 64bit system two problems went away:
1. mpm ThreadsPerChild can now be set to 15000

Die Thread-Konfiguration des Multi-Processing-Moduls (mpm) auf jedem System ist an bestimmte Einschränkungen, Systemeinschränkungen und kompilierte fehlersichere Einstellungen gebunden, wie im Artikel Apache MPM Common Direktiven

ThreadsPerChild-Richtlinie

This directive sets the number of threads created by each child process. The child creates these threads at startup and never creates more. If using an MPM like mpm_winnt, where there is only one child process, this number should be high enough to handle the entire load of the server. If using an MPM like worker, where there are multiple child processes, the total number of threads should be high enough to handle the common load on the server.

ThreadLimit-Richtlinie

Special care must be taken when using this directive. If ThreadLimit is set to a value much higher than ThreadsPerChild, extra unused shared memory will be allocated. If both ThreadLimit and ThreadsPerChild are set to values higher than the system can handle, Apache httpd may not start or the system may become unstable. Do not set the value of this directive any higher than your greatest predicted setting of ThreadsPerChild for the current run of Apache httpd.

Und sie weisen auch darauf hin, dass ...

The default value for ThreadLimit is 1920 when used with mpm_winnt and 64 when used with the others.

Es gibt auch ein fest codiertes kompiliertes Limit, das Sie umgehen können, indem Sie den Code neu kompilieren, wie hier erklärt:

There is a hard limit of ThreadLimit 20000 (or ThreadLimit 100000 with event, ThreadLimit 15000 with mpm_winnt) compiled into the server. This is intended to avoid nasty effects caused by typos. To increase it even further past this limit, you will need to modify the value of MAX_THREAD_LIMIT in the mpm source file and rebuild the server.

ThreadStackSize-Direktive

The ThreadStackSize directive sets the size of the stack (for autodata) of threads which handle client connections and call modules to help process those connections. In most cases the operating system default for stack size is reasonable, but there are some conditions where it may need to be adjusted:

Was sind ...

It is recommended to not reduce ThreadStackSize unless a high number of threads per child process is needed. On some platforms (including Linux), a setting of 128000 is already too low and causes crashes with some common modules.

Lösung

Wenn Sie die ThreadsPerChild-Direktive erhöhen, müssen Sie die ThreadLimit-Direktive auf denselben Wert oder nur etwas höher ausrichten, während Sie die ThreadStackSize-Direktive zusätzlich auf einen niedrigeren Wert als den Standardwert reduzieren, während Sie weiterhin ein stabiles System beibehalten .

Eine mögliche Lösung wäre:

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

Sie müssen etwas mit diesen Werten herumspielen, um die Einstellung zu bestimmen, mit der Sie ein stabiles System mit der maximal möglichen Einstellung ThreadsPerChild ausführen können.