apache マルチプロセッシングモジュール (MPM)の調整

この記事は約5分で読めます。

MPMとは

マルチプロセッシングモジュール (MPM)の略。
マルチコアなサーバーで、WEBサーバーの処理を、どうこなすか・・・
apache 1.3時代は一つでしたが、最近は、「3つ」の方法があります。

prefork
worker
event

の3つの手法です。

デフォルトでは、初期の時代からある「prefork」です。
最新の技術を用いて、nginxのように高速/大量の処理をしてくれるのが、「event」になります。

参考サイト

マルチプロセッシングモジュール (MPM) - Apache HTTP サーバ バージョン 2.4

稼働しているapacheが、どのタイプか・・・

# /usr/local/apache2/bin/httpd -V | grep MPM
Server MPM: event

↑と、コマンドラインから確認ができます。
上記では、「event」となります。

メモリ逼迫のサーバー

あるサーバーのメモリ状態を見てみると、メモリの空きがない状態・・・

1  [                                                                            0.0%]
2  [                                                                            0.0%]
3  [*                                                                           0.7%]
Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1.80G/1.95G]
Swp[||||||||||||||||||||||||||||||||||||||||||||||||                     2.39G/4.00G]

↑htopコマンドで、見てみると、実メモリの他にスワップも使っています。
「Mem」のところが実メモリです。「1.80G/1.95G」と空きがない状態です・・・

# ps aux --sort rss

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
www 32168 0.1 5.9 2814884 121052 ? Sl 16:04 0:27 /usr/local/apache2/bin/httpd -k start
www 32184 0.3 14.8 2889100 304092 ? Sl 16:04 0:59 /usr/local/apache2/bin/httpd -k start
www 32169 0.2 24.6 2869284 503544 ? Sl 16:04 0:42 /usr/local/apache2/bin/httpd -k start
www 32292 0.7 34.1 2935508 699420 ? Sl 16:05 1:53 /usr/local/apache2/bin/httpd -k start

↑httpd (apache)のメモリ利用率が高いです。

●プロセスとスレッド

apache mpmにおいて、「event」(及び、workerも)では、「スレッド」で、リクエストを待ち受けます。

メモリが逼迫している状態で、スレッドの数を見てみましょう。

# ps -efL |grep http |grep -v grep |wc -l
110

↑110ほどのスレッドが起動しています。

# ps -ef |grep http |grep -v grep|wc -l
6

↑プロセスは、6です。

apache mpm調整

httpd-mpm.conf
ファイルで、

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

↑が、デフォルトの設定です。

<IfModule mpm_event_module>
    ServerLimit              2
    StartServers             2
    MinSpareThreads         50
    MaxSpareThreads         50
    ThreadsPerChild         25
    MaxRequestWorkers       25
    MaxConnectionsPerChild   0
</IfModule>

↑今回、上記のように設定しました。

1  [                                                                            0.0%]
2  [                                                                            0.0%]
3  [                                                                            0.0%]
Mem[||||||||||||||||||||||||||||||||||||||||||||||#######****************1.12G/1.95G]
Swp[||||||||||                                                            462M/4.00G]

↑メモリ利用率が抑えられました。

MaxRequestWorkers」が重要です。
この数は、リクエストを待つスレッド数の最大数です。
この数が多いと、メモリを多く使います。

サーバーの実装メモリと、サーバーの応答状態などのバランスをみて、調整をしましょう。

 

タイトルとURLをコピーしました