Apache2.2 prefork.c ServerLimit MaxClients

estis2010/05/29 (土) 07:37 に投稿

Apache2.2系のデフォルト

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

ServerLimit、MaxClientsのデフォルト上限値は、200000。

# httpd -t
WARNING: ServerLimit of 400000 exceeds compile time limit of 200000 servers,
 lowering ServerLimit to 200000.
WARNING: MaxClients of 400000 exceeds ServerLimit value of 200000 servers,
 lowering MaxClients to 200000.  To increase, please see the ServerLimit
 directive.

とのことなので、コンパイル時指定でServerLimitの上限が変更可能。
MaxClientsは、ServerLimitの上限が上限になる。

ServerLimit、MaxClientsと同じようなものがなぜあるのだろう。

# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start

とあって、ServerLimitの設定値をconfで変更した時に、反映させるにはApacheのstop start が必要で、
MaxClientsの設定値変更の反映はreloadで可能となっている。

設定反映の確認は、server-infoを有効にして、http://servername/server-info で確認。

Server Settings

Server Version: Apache/2.2.3 (CentOS)
Server Built: Apr 4 2010 17:19:54
Module Magic Number: 20051115:3
Hostname/port: 192.168.24.121:80
Timeouts: connection: 120 keep-alive: 120
MPM Name: Prefork
MPM Information: Max Daemons: 50000 Threaded: no Forked: yes

のように表示される MPM Information: Max Daemons:の数値を見る。

CentOS5.5 Apache2.2.3で確認。

Comments

Comment

preforkでの比較。Apacheへのアクセスはない状態。

ServerLimit 100000

# ps auxww|head -1;ps auxww|grep [h]ttpd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      7867  0.4  7.7  57672 34136 ?        Ss   07:12   0:00 /usr/sbin/httpd
apache    7869  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7870  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7871  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7872  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7873  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7874  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7875  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd
apache    7876  0.0  1.2  57672  5520 ?        S    07:12   0:00 /usr/sbin/httpd

ServerLimit 200000

# ps auxww|head -1;ps auxww|grep [h]ttpd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      7910  0.1 13.1  87748 57964 ?        Ss   07:15   0:00 /usr/sbin/httpd
apache    7912  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7913  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7914  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7915  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7916  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7917  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7918  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd
apache    7919  0.0  1.3  87748  5912 ?        S    07:15   0:00 /usr/sbin/httpd

ServerLimitの設定値を増やすと、メモリを喰うという話。
増やしておけばいいというわけではない。

Comment

httpd.conf内で、以下のようにコメントアウト。

<IfModule prefork.c>
#StartServers       8
#MinSpareServers    5
#MaxSpareServers   20
#ServerLimit      200000
#MaxClients       50000
#MaxRequestsPerChild  4000
</IfModule>

この状態で、http://servername/server-info で確認。

Server Version: Apache/2.2.3 (CentOS)
Server Built: Apr 4 2010 17:19:54
Module Magic Number: 20051115:3
Hostname/port: 192.168.24.121:80
Timeouts: connection: 120 keep-alive: 120
MPM Name: Prefork
MPM Information: Max Daemons: 256 Threaded: no Forked: yes
# ps auxww|head -1;ps auxww|grep [h]ttpd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      8983  0.0  2.3  27768 10392 ?        Ss   21:44   0:00 /usr/sbin/httpd
apache    8985  0.0  1.3  27900  5968 ?        S    21:44   0:00 /usr/sbin/httpd
apache    8986  0.0  1.3  27900  5892 ?        S    21:44   0:00 /usr/sbin/httpd
apache    8987  0.0  1.3  27900  5892 ?        S    21:44   0:00 /usr/sbin/httpd
apache    8988  0.0  1.3  27900  5844 ?        S    21:44   0:00 /usr/sbin/httpd
apache    8989  0.0  1.3  27900  5888 ?        S    21:44   0:00 /usr/sbin/httpd

で確認すると、
StartServers のデフォルトは、「8」ではなく、「5」のようだ。
ServerLimit の値は、簡単には確認できないが、

<IfModule prefork.c>
#StartServers       8
#MinSpareServers    5
#MaxSpareServers   20
ServerLimit      256
MaxClients       256
#MaxRequestsPerChild  4000
</IfModule>

とした時、

# ps auxww|head -1;ps auxww|grep [h]ttpd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      9195  4.4  2.3  27768 10388 ?        Ss   22:07   0:00 /usr/sbin/httpd
apache    9197  0.0  1.1  27900  5156 ?        S    22:07   0:00 /usr/sbin/httpd
apache    9198  0.0  1.1  27900  5156 ?        S    22:07   0:00 /usr/sbin/httpd
apache    9199  0.0  1.1  27900  5156 ?        S    22:07   0:00 /usr/sbin/httpd
apache    9200  0.0  1.1  27900  5156 ?        S    22:07   0:00 /usr/sbin/httpd
apache    9201  0.1  1.1  27900  5156 ?        S    22:07   0:00 /usr/sbin/httpd

なので、おそらく「256」だろう。

Comment

Apacheポケットリファレンス』WINGSプロジェクト 髙江賢 著 山田祥寛 監修 株式会社技術評論社 2010年5月10日 のp.474には、

MinSpareServers 5
MaxSpareServers 10
MaxRequestsPerChild 10000

となっている。

Comment

http://httpd.apache.org/docs/2.2/ja/mod/prefork.html
http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html
を見てみると、

StartServers       5
MinSpareServers    5
MaxSpareServers   10
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  10000

が、preforkのデフォルト値である。