Httpd worker MPM Configuration: Difference between revisions
Line 80: | Line 80: | ||
* http://httpd.apache.org/docs/current/mod/mpm_common.html#threadlimit | * http://httpd.apache.org/docs/current/mod/mpm_common.html#threadlimit | ||
[[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] directive sets the number of threads created by each child process. ''The child creates these threads at startup and never creates more''. Default in 25. The value of ThreadsPerChild ''can be modified during restart'', however it cannot be set to a value over ThreadLimit. The ThreadLimit directive sets the maximum configured value for ThreadsPerChild for the lifetime of the | [[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] directive sets the number of threads created by each child process. ''The child creates these threads at startup and never creates more''. Default in 25. The value of [[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] ''can be modified during restart'', however it cannot be set to a value over [[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]]. The [[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]] directive sets the maximum configured value for [[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] for the lifetime of the httpd process. Any attempts to change this directive during a restart will be ignored. The default value is 64. | ||
It is possible to configure ThreadsPerChild to a value higher than ThreadLimit, httpd won't complain at startup but the value will be silently ignored and each child will actually create 'ThreadLimit' threads. | It is possible to configure [[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] to a value higher than [[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]], httpd won't complain at startup but the value will be silently ignored and each child will actually create 'ThreadLimit' threads. | ||
For clarity, it's probably best to explicitly configure ThreadLimit and ThreadsPerChild to the same value. | For clarity, it's probably best to explicitly configure [[[[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]] and [[#ThreadsPerChild_and_ThreadLimit|ThreadsPerChild]] to the same value. | ||
==Idiosyncrasies== | |||
* Declare ThreadLimit ''before'' MaxClients in the configuration file. Doing otherwise would lead to someting similar to (for the below, ThreadLimit was set to 100, but declared ''after'' MaxClients): | * Declare [[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]] ''before'' MaxClients in the configuration file. Doing otherwise would lead to someting similar to (for the below, [[#ThreadsPerChild_and_ThreadLimit|ThreadLimit]] was set to 100, but declared ''after'' MaxClients): | ||
<pre> | |||
ServerLimit 16 | ServerLimit 16 | ||
StartServers 16 | StartServers 16 | ||
Line 96: | Line 96: | ||
ThreadLimit 100 | ThreadLimit 100 | ||
ThreadsPerChild 100 | ThreadsPerChild 100 | ||
</pre> | |||
<pre> | |||
starting httpd ... WARNING: ThreadsPerChild of 100 exceeds ThreadLimit value of 64 | starting httpd ... WARNING: ThreadsPerChild of 100 exceeds ThreadLimit value of 64 | ||
threads, lowering ThreadsPerChild to 64. To increase, please see the | threads, lowering ThreadsPerChild to 64. To increase, please see the | ||
ThreadLimit directive. | ThreadLimit directive. | ||
</pre> | |||
</ | |||
=MinSpareThreads= | =MinSpareThreads= |
Revision as of 03:13, 2 January 2017
Internal
Overview
Diagram
The configuration elements described below are represented on the mod_jk Concepts Diagram.
Enabling woker MPM Mode
If you configure httpd yourself, make sure you compiled it with worker MPM support.
If you use Red Hat EWS, worker support comes pre-compiled into $APACHE_HOME/sbin/httpd.worker, make sure the start script is using that.
For more details about compiling httpd with the right MPM mode, see:
MaxClients, MaxRequestWorkers
- http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients
- http://httpd.apache.org/docs/current/mod/mpm_common.html#maxrequestworkers
"MaxClients" and "MaxRequestWorkers" are equivalent, since 2.3.13 "MaxClients" was renamed "MaxRequestWorkers", but for the time being, both names are valid and supported.
MaxClients represents the maximum number of connections that will be processed simultaneously by the entire server, seen as the sum of all active children processes. The default value is 400 = 16 (ServerLimit) * 25 (ThreadsPerChild). The directive restricts the total number of threads that will be available to serve clients.
Any connection attempts over the MaxClients limit will normally be queued, up to a number based on the ListenBacklog directive. Once a child process becomes available after handling at least one of its current requests, the connection will then be serviced.
Even if ServerLimit is set to a high value (ThreadsPerChild left to default), the number of concurrent connection is limited by MaxClients. This was tested and proven.
MaxClients Idiosyncrasies
- MaxClients must be at least equals with ThreadsPerChild. If not, httpd will warn at startup and automatically adjust the value to be equals with ThreadsPerChild.
- MaxClients must be an integer multiple of ThreadsPerChild. If it's not, it will be adjusted automatically, and the server will issue an error message similar to the one presented below:
MaxClients (12) is not an integer multiple of ThreadsPerChild (10), lowering MaxClients to 10
ServerLimit
Upper limit on configurable number of httpd processes. Default is 16. It is a hard limit, any attempts to change this directive during a restart will be ignored.
Note: if ServerLimit is n, ps will show n + 2 server processes. For a ServerLimit value of 1:
[webr@rangiroa ~]$ ps -ef | grep httpd root 7535 1 0 11:15 ? 00:00:00 /home/webr/httpd-2.2.21-worker/bin/httpd -k start webr 7536 7535 0 11:15 ? 00:00:00 /home/webr/httpd-2.2.21-worker/bin/httpd -k start webr 7537 7535 0 11:15 ? 00:00:00 /home/webr/httpd-2.2.21-worker/bin/httpd -k start
The first one (7535) is root-owned, the second one (7536) is ? and the third one (7537) is the actual child.
If ServerLimit is set to a value much higher than necessary, unused shared memory will be allocated. If both ServerLimit and MaxClients are set to values higher than the system can handle, Apache may not start or the system may become unstable.
Use this directive only if your MaxClients and ThreadsPerChild settings require more than 16 server processes (default). Do not set the value of this directive any higher than the number of server processes required by what you may want for MaxClients and ThreadsPerChild.
StartServers
The StartServers directive sets the number of child server processes created on startup. Default is 3. As the number of processes is dynamically controlled depending on the load, there is usually little reason to adjust this parameter.
ThreadsPerChild and ThreadLimit
- http://httpd.apache.org/docs/current/mod/mpm_common.html#threadsperchild
- http://httpd.apache.org/docs/current/mod/mpm_common.html#threadlimit
ThreadsPerChild directive sets the number of threads created by each child process. The child creates these threads at startup and never creates more. Default in 25. The value of ThreadsPerChild can be modified during restart, however it cannot be set to a value over ThreadLimit. The ThreadLimit directive sets the maximum configured value for ThreadsPerChild for the lifetime of the httpd process. Any attempts to change this directive during a restart will be ignored. The default value is 64.
It is possible to configure ThreadsPerChild to a value higher than ThreadLimit, httpd won't complain at startup but the value will be silently ignored and each child will actually create 'ThreadLimit' threads.
For clarity, it's probably best to explicitly configure [[ThreadLimit and ThreadsPerChild to the same value.
Idiosyncrasies
- Declare ThreadLimit before MaxClients in the configuration file. Doing otherwise would lead to someting similar to (for the below, ThreadLimit was set to 100, but declared after MaxClients):
ServerLimit 16 StartServers 16 MaxClients 10 ThreadLimit 100 ThreadsPerChild 100
starting httpd ... WARNING: ThreadsPerChild of 100 exceeds ThreadLimit value of 64 threads, lowering ThreadsPerChild to 64. To increase, please see the ThreadLimit directive.