Apache2 preforkでチューニング(試行中)

Apache2 preforkでチューニング
Apache2 preforkでチューニング

沢山のアクセスが有った時に、Raspberry Pi4の能力が許す鍵り素早く応答を返すように設定を行います。そのための手段として、Apache2のMPMを使用します。このブログではPHPと相性が良くシステムとして安定性の高いpreforkを採用しています。

プロセスのメモリ使用量の試算や、効果測定の方法が難しく、このページはまだ試行中としています。サーバのアクセス数に適した設定を考える上で、試行している様子もこのページに記載しています。

原理を簡単に説明

Apache2.4に標準でMPM(マルチプロセッシングモジュール)という仕組みが準備されていて、複数のプロセス、スレッドを使って、同時アクセスの効率的な処理と性能を超えるアクセスに対する制限をかける機能を持っています。

MPMには複数の方式(worker,event,prefork)があります。

PHPで開発されているWordPressを安定して稼働させるため、メモリリークが発生しても一定間隔でプロセスの再起動を行いながら運用できるpreforkを使用しています。

MPMのpreforkとは(Apache2.4以降)

  • あらかじめApacheの子プロセスを複数起動し、同時アクセスに対して各プロセスが同時に処理を行うことで、応答速度の改善を図っています。
  • あらかじめ起動しているプロセスより多くのアクセスが有れば、一定間隔で起動プロセスを追加して、増える負荷に対応します。
  • 設定している最大数を超える同時アクセスには、キューイングを行い先行のアクセスに対する処理の終了を待って順次処理を行います。

Raspberry Pi4の持つ性能を最大限引き出すために、その設定方法を解説します。

Apacheに使用可能なメモリの確認

今回のサーバに使用しているRaspberry Pi4の実装メモリは4GBです。

サーバの起動直後の空きメモリを、下記のコマンドで確認します。

$ free
               total        used        free      shared  buff/cache   available
Mem:         3884404      207868     3091224       94624      585312     3504692
Swap:         102396           0      102396

赤字の数字がサーバの起動直後の空きメモリで、約3.5GBのメモリが空いています。

空きメモリの内、ざっくりどのぐらいの割合でApacheの為にメモリを使用するかを決めます。

3.5GBの空き領域に対して下記の方針を立てました。

  • 最大2GBをApache2のprefork用に確保
  • 1GBをMariaDBなど他のチューニング用に確保
  • 0.5GBをメモリキャッシュ、コマンド実行など保守用に確保

という事で空きメモリの2.0GBをApache2のprefork用に割り当てて使用します。

チューニングの手順

下記の順にpreforkで起動するApache2のプロセス数を決めて設定を行います。

  1. preforkが使える状態か確認
  2. 最大の同時接続数を試算
  3. apache2およびpreforkの設定

preforkが使える状態か確認

Raspberry Pi OSのリポジトリからApache2をインストールすると、デフォルトでpreforkが使えるようになっています。

確認方法は下記の通りです。

Server version: Apache/2.4.57 (Debian)
Server built:   2023-04-13T03:26:51
Server's Module Magic Number: 20120211:127
Server loaded:  APR 1.7.2, APR-UTIL 1.6.3, PCRE 10.42 2022-12-11
Compiled using: APR 1.7.2, APR-UTIL 1.6.3, PCRE 10.42 2022-12-11
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

赤字の通り Server MPM: prefork となっていれば大丈夫です。

もし違っていれば、下記手順で切り替えができます。

最大の同時接続数を試算(ここが難しい)

下記の記事に基づきApacheの子プロセスが使用するメモリを実測します。

結果、1プロセス当たりに使用されるメモリが約20MBで行けそうであることがわかりました。

最大の同時接続数=Apache向けの空きメモリ2GB ÷ 20MB/プロセス = 100

preforkの標準の設定と設定内容の意味

preforkの設定ファイルのインストール直後の設定は下記の通りです。

$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf
<IfModule mpm_prefork_module>
        StartServers              5
        MinSpareServers           5
        MaxSpareServers           10
        MaxRequestWorkers         150
        MaxConnectionsPerChild    0
</IfModule>

各設定の意味は下記の通りです。

項番項目説明補足
1StartServersApache起動時の子プロセス数Apache起動時にまずはここで設定された数の子プロセスを起動します
2MinSpareServers待機時の最小子プロセス数アイドルの子プロセスがMinSpareServersより少なくなったら、この値まで子プロセスを立ち上げます。
つまり高負荷が連続して待機プロセスが無くなったら、それでもこのプロセス数分追加しに行ってしまいます。
3MaxSpareServers待機時の最大子プロセス数アイドルの子プロセスがMaxSpareServersより大きくなったら、この値まで子プロセスを削除します。
4ServerLimit設定可能なサーバプロセス数の上限 MaxRequestWorkersを256以上に設定したい場合はServerLimitも設定する必要があります。
また設定値は、 ServerLimit ≧ MaxRequestWorkers とする必要があります。
5MaxRequestWorkers最大の子プロセス数最大の同時接続数です
6MaxRequestsPerChild1子プロセスが処理するリクエスト数ここで設定された数のリクエストを処理すると子プロセスが死にます。”0″にすると無制限にリクエストを処理します
7MaxClientsApache2 2.4からはMaxRequestWorkersで指定します。

設定内容を試算したプロセス数で設定します。

設定をどう考えるかを以下の章で試行して決めていきます。

試行1 このブログのアクセス状況を検証

このブログで、瞬間にどれだけのアクセスが有るかを確認してみます。

preforkのプロセス数の設定

同時のアクセス数が、apache2のプロセスの数として残るよう設定します。

最大100個までの同時アクセス数まで確認できます。ただ、MaxConnectionsPerChildを300に設定しているので、300回アクセスが有るとプロセスが終了します。(子プロセスの数が減ります)

【設定内容】

$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         100
        MaxRequestWorkers       100
        ServerLimit             256
        MaxConnectionsPerChild  300
</IfModule>

設定が終わったらApache2を再起動します。

$ sudo systemctl restart apache2.service

これで準備は終わりです。

サーバの初期状態を確認します。

メモリの空き容量は、3,542MBです。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         176        3316           6         300        3542
Swap:           1023           0        1023

apache2のプロセス数は、親プロセス数1+子プロセス数5の6個になります。

$ systemctl status apache2.services
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-01-12 00:35:01 JST; 3min 14s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 2154 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 2158 (apache2)
      Tasks: 69 (limit: 4470)
        CPU: 45.112s
     CGroup: /system.slice/apache2.service
             tq2158 /usr/sbin/apache2 -k start
             tq2159 /usr/sbin/apache2 -k start
             tq2160 /usr/sbin/apache2 -k start
             tq2161 /usr/sbin/apache2 -k start
             tq2162 /usr/sbin/apache2 -k start
             tq2163 /usr/sbin/apache2 -k start

ここに表示されるapache2の子プロセスの数が同時にアクセスの有った数となります。

次に、apache2の子プロセスが使っているメモリ容量を下記のコマンドで確認します。

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|gt"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
2158    1       31.9    25.0    6.9
2159    2158    9.4     9.3     0.1
2160    2158    9.4     9.3     0.1
2161    2158    9.4     9.3     0.1
2162    2158    9.4     9.3     0.1
2163    2158    9.4     9.3     0.1

赤字が子プロセスの使っているメモリの容量です。

SHAREDが親プロセスと共有しているメモリの容量です。

PRIVATEが子プロセスが使用しているメモリの容量です。

従いまして、子プロセスが使用しているメモリ容量は、0.1MB×5=0.5MBです。

本日のサーバの状況を確認します。(2023/1/13 1:00)

実際にはインターネットからもアクセスが有るので、現時点下記の状況となっています。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         900        2472          73         419        2744
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
2158    1       31.9    31.0    0.8
2159    2158    71.1    57.7    13.4
2160    2158    67.3    53.3    14.0
2161    2158    66.4    54.5    11.9
2162    2158    70.7    56.2    14.5
2163    2158    47.3    34.1    13.2
2188    2158    66.1    52.9    13.3
2190    2158    47.5    38.6    8.9
2191    2158    48.4    38.6    9.8
2227    2158    46.8    39.1    7.7
2228    2158    47.0    39.2    7.8
2229    2158    71.6    53.7    17.9
2230    2158    68.3    59.2    9.1
2236    2158    47.3    39.3    8.0
2237    2158    68.1    59.0    9.0
2238    2158    69.2    60.1    9.2
2239    2158    70.6    60.8    9.8
2240    2158    47.2    39.2    7.9
2241    2158    90.9    74.7    16.2
2242    2158    47.1    39.3    7.8
2243    2158    47.3    39.3    8.0
2252    2158    68.6    59.5    9.1
2253    2158    72.7    61.4    11.3
2254    2158    90.1    77.6    12.4
2255    2158    72.4    57.9    14.5
2256    2158    72.8    58.3    14.5
2257    2158    72.4    58.0    14.5
2258    2158    72.9    58.3    14.6
2259    2158    46.9    39.3    7.7
2260    2158    72.5    58.1    14.4
2261    2158    72.6    58.1    14.4
2262    2158    72.4    57.9    14.4
2263    2158    93.1    78.3    14.8
2264    2158    92.4    79.8    12.6
2265    2158    90.2    77.7    12.5
2266    2158    55.0    46.4    8.5
2267    2158    72.7    58.2    14.4
2272    2158    10.4    10.1    0.3
2273    2158    69.0    59.9    9.1
2274    2158    53.3    42.3    10.9
2275    2158    72.1    61.8    10.2
2276    2158    67.2    58.6    8.6
2277    2158    9.5     9.4     0.2
2278    2158    56.0    42.9    13.1
2279    2158    46.6    40.0    6.6
2280    2158    47.3    40.3    7.0
2281    2158    10.4    10.1    0.3
2282    2158    53.6    42.8    10.9
2283    2158    46.3    39.8    6.6
2284    2158    53.2    42.3    10.9
2285    2158    46.3    39.8    6.6
2286    2158    51.2    41.9    9.2
2287    2158    46.3    39.8    6.6
2288    2158    53.2    42.3    10.9
2289    2158    46.3    39.8    6.6
2290    2158    53.2    42.3    10.9
2292    2158    46.3    39.8    6.6
2293    2158    53.2    42.3    10.9
2294    2158    46.4    39.8    6.6
2295    2158    53.3    42.3    10.9
2296    2158    46.3    39.8    6.6
2297    2158    51.2    41.9    9.2
2298    2158    46.3    39.8    6.6
2299    2158    47.1    40.4    6.7
2300    2158    51.2    41.9    9.2
2301    2158    46.3    39.8    6.6
2302    2158    51.2    41.9    9.2
2303    2158    32.1    28.8    3.3
2304    2158    46.3    39.8    6.6
  • 空きメモリ 2,744MB  当初3,542MB - 現在2,744MB = 減少メモリ798MB
  • apache2の子プロセス68個の使用メモリ は、
    SHARED約100MB + PRIVATE666MB = 766MB
  • Apache2の子プロセス一個の平均の使用メモリは約11.3MBです。

上記の通り減少メモリと子プロセスが使用しているメモリに大きな差異は無いようなので、これで様子を見てみます。

12日経ったサーバの状況(2023/1/25 0:00)

12日経ったサーバの状況を報告します。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793        1562        1239         118         990        2036
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
434     1       32.3    30.6    1.7
40522   434     105.6   93.1    12.5
40523   434     107.6   93.4    14.1
40524   434     107.0   92.5    14.5
40525   434     87.0    78.4    8.6
40526   434     120.6   105.5   15.0
40529   434     98.1    84.5    13.6
40538   434     112.5   100.4   12.1
40543   434     129.9   103.9   26.0
40777   434     114.8   97.2    17.6
40783   434     96.9    79.3    17.5
40794   434     134.5   110.0   24.5
41764   434     116.0   102.3   13.7
41766   434     91.8    83.3    8.5
41767   434     96.6    87.0    9.6
41769   434     97.9    83.0    14.9
41770   434     86.1    77.6    8.5
41771   434     108.6   88.9    19.8
41772   434     102.9   89.2    13.7
41773   434     72.4    60.6    11.8
41774   434     126.7   107.2   19.5
41775   434     92.2    79.3    12.9
41776   434     100.6   90.9    9.6
41777   434     70.0    59.9    10.2
41778   434     101.6   88.6    13.0
41779   434     131.1   111.6   19.5
41780   434     99.6    85.7    13.9
41781   434     76.7    61.1    15.6
41782   434     62.8    51.1    11.8
41783   434     123.5   104.9   18.6
41784   434     86.8    78.9    7.8
41785   434     69.4    62.4    7.0
41786   434     98.0    83.0    15.0
41787   434     78.4    70.0    8.4
41788   434     78.5    66.4    12.1
41789   434     84.4    72.1    12.3
41790   434     98.5    79.5    19.0
41791   434     112.0   101.6   10.5
41792   434     97.8    84.9    12.9
41793   434     122.6   105.1   17.5
41794   434     96.0    85.6    10.4
41795   434     75.5    63.6    11.9
41796   434     82.0    70.0    12.0
41797   434     77.0    64.8    12.2
41798   434     79.7    66.9    12.8
41799   434     95.9    82.3    13.6
41800   434     127.9   109.2   18.7
41801   434     116.2   100.5   15.7
41802   434     85.1    78.6    6.5
41803   434     80.7    66.9    13.8
41804   434     91.7    82.0    9.7
41805   434     85.8    71.8    14.1
41806   434     66.7    59.7    7.0
41807   434     90.0    77.7    12.3
41808   434     82.3    72.5    9.9
41809   434     94.8    82.2    12.7
41810   434     92.5    82.5    10.0
41811   434     86.1    76.8    9.4
41812   434     87.9    79.3    8.6
41813   434     86.5    78.5    8.0
41814   434     86.5    72.8    13.7
41815   434     96.3    83.7    12.6
41816   434     90.2    77.9    12.3
41817   434     60.7    51.6    9.0
41818   434     99.9    88.6    11.4
41819   434     71.6    60.5    11.1
41820   434     109.7   88.6    21.2
41821   434     89.0    78.0    11.0
41822   434     98.3    83.0    15.2
41823   434     88.9    78.7    10.2
41824   434     61.2    48.7    12.6
41825   434     87.4    79.2    8.2
41826   434     69.9    59.9    10.0
41827   434     99.7    79.3    20.4
41828   434     79.6    64.4    15.2
41829   434     77.8    68.5    9.3
41830   434     91.3    78.9    12.4
41831   434     90.4    79.1    11.3
41832   434     113.3   97.6    15.8
41834   434     78.1    66.9    11.2
41835   434     105.6   91.3    14.3
41836   434     95.6    83.1    12.5
41837   434     84.5    77.9    6.5
41838   434     81.2    67.6    13.6
41839   434     94.8    82.7    12.0
41840   434     106.4   83.9    22.5
41845   434     103.6   83.1    20.5
41846   434     97.6    84.4    13.2
41848   434     107.1   88.0    19.1
41850   434     76.7    68.5    8.3
41852   434     99.5    84.5    15.1
41853   434     100.6   87.5    13.1
41854   434     90.6    77.7    12.8
41855   434     107.5   86.8    20.7
41856   434     82.8    69.9    12.9
41857   434     84.8    79.8    5.0
41858   434     87.0    70.5    16.4
41859   434     96.9    85.9    11.0
41860   434     88.2    79.0    9.2
41861   434     80.4    65.1    15.3
41862   434     86.3    78.3    8.1
  • 空きメモリ 2,036MB  当初3,542MB - 現在2,036MB = 減少メモリ1,506MB
  • apache2の子プロセス100個の使用メモリ は、
    SHARED約120MB + PRIVATE1,309MB = 1,439MB
  • Apache2の子プロセス一個の平均の使用メモリは約14.4MBです。

上記の通り減少メモリと子プロセスが使用しているメモリに大きな差異は無いようです。

これで、メモリの測定の方法に大きな問題は無いことが確認できました。

ここからわかることは、同時に100以上のアクセスがあり、MaxRequestWorkersの指定に基づきApache2の子プロセス100個で処理を続けたという事です。

100を超える同時アクセス分は、Apache2の子プロセスの処理終了までキューイングされます。キューイングされるアクセスの最大数は既定で511(Apache2.4)です。

キューイングできる数を超えると、クライアントにエラーが帰ります。

このブログで100以上の同時アクセスが発生している事が確認できました。

こうなると、当初のチューニングの方針が変わってしまいます。まさかここまでアクセスがあるとは思っていませんでした。

少し経った後のサーバの状況(2023/1/25 0:43)

先程のメモリ測定から僅かな時間が経ったところでメモリ測定をしてみました。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         368        2454          88         970        3260
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
434     1       32.5    30.5    2.0
51232   434     54.7    42.5    12.2
51233   434     79.7    66.4    13.3
51234   434     65.0    52.2    12.8
51235   434     76.7    62.7    14.1
51236   434     79.8    67.6    12.1
51238   434     52.7    41.5    11.2
51240   434     74.8    61.7    13.0
51249   434     109.1   92.6    16.4
51250   434     84.9    62.5    22.4
51251   434     54.7    42.0    12.7
51252   434     53.9    42.0    11.9
51257   434     74.4    61.5    12.9
  • 空きメモリ 3,260MB  当初3,542MB - 現在3,260MB = 減少メモリ282MB
  • apache2の子プロセス12個の使用メモリ は、
    SHARED約110MB + PRIVATE165MB = 275MB
  • Apache2の子プロセス一個の平均の使用メモリは約22.9MBです。

ここでも、減少メモリと子プロセスが使用しているメモリに大きな差異は無いようです。

Apache2のプロセスの数が100個から12個に一気に減りました。

MaxConnectionsPerChildに指定された300に基づき、1個のApache2の子プロセスが300回以上のアクセスをこなし、後続の処理が無くなり消滅していったと想像します。

つまり、このブログ全体のダウンロードをした人がいるか、大量に同時アクセスされた時間が継続して300回以上のアクセスがあり、アクセスがひと段落して順次消滅していったと考えられます。

試行1の考察

子プロセスの使用メモリの測り方

今回の試行で、下記のメモリの測定で十分精度が出る事が確認できました。

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
434     1       32.5    30.5    2.0
51232   434     54.7    42.5    12.2
51233   434     79.7    66.4    13.3
51234   434     65.0    52.2    12.8
51235   434     76.7    62.7    14.1
51236   434     79.8    67.6    12.1

SHAREDは共有メモリのサイズです。親プロセスと共有しているメモリなので、全子プロセスと同じメモリを共有しています。従いまして、一番大きいメモリのサイズが使用メモリとして計算します。

PRIVATEは、子プロセスが使用しているメモリなので、全子プロセスのメモリを足します。

赤字の部分を足せば、子プロセスが使用しているメモリの量が解ります。

SHARED:67.6MB + PRIVATE:64.5MB = 132.1MB

プロセスのメモリ使用量

今回の試行で、最大使用メモリが1.5GBで、1子プロセスの使用メモリ 約15MBである事が判明しました。

子プロセスの平均使用メモリが22.9MBの時もあったので、まだ試行を続ける必要が有るかと感じています。

【設定内容】

$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         100
        MaxRequestWorkers       100
        ServerLimit             256
        MaxConnectionsPerChild  300
</IfModule>

試行2 子プロセスの消滅機会を減らす

試行1では、MaxConnectionsPerChildが300に設定されているので、子プロセスが起動されてから300回以上アクセスが有った後、アイドル状態になった時に消滅します。

そこで、極力消滅を避ける為アクセスの回数の制限を取り払って、Apache2の子プロセスの消滅を防ぎます。

この場合、子プロセスの数がMaxRequestWorkersの数で存在し続ける可能性が高くなり、最大使用メモリの1.5GBの状態が続く事が予想されます。

もう一点、PHPのメモリリークの影響を受けやすくなり徐々に子プロセスの使用メモリが増えていく可能性があります。

今回MaxConnectionsPerChildの設定を300から0(アクセス回数の制限無)に変更して、使用メモリの様子を確認します。

【設定内容】

$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         100
        MaxRequestWorkers       100
        ServerLimit             256
        MaxConnectionsPerChild  0
</IfModule>

サーバの初期状態(2023/2/2 0:15)

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         217        2576           6         999        3494
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
109650  1       31.9    25.2    6.7
109651  109650  9.4     9.3     0.1
109652  109650  9.4     9.3     0.1
109653  109650  9.4     9.3     0.1
109654  109650  9.4     9.3     0.1
109655  109650  9.4     9.3     0.1
  • 空きメモリ 3,494MB  当初3,542MB - 現在3,494MB = 減少メモリ48MB
  • apache2の子プロセス5個の使用メモリ は、
    SHARED約25.2MB + PRIVATE0.5MB = 25.7MB
  • Apache2の子プロセス一個の平均の使用メモリは、約5.1MBです。共有メモリは考慮しません。

サーバの状況2023/2/4 15:05

2日間経った状況を報告します。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         438        2273          78        1081        3201
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
109650  1       32.6    30.8    1.8
126173  109650  92.9    80.1    12.8
126174  109650  95.9    79.7    16.1
126175  109650  123.7   98.3    25.5
126176  109650  115.5   97.5    18.1
126177  109650  91.1    77.2    13.9
126188  109650  99.3    86.2    13.1
126290  109650  99.3    82.5    16.7
126293  109650  120.9   98.3    22.6
126664  109650  100.0   79.6    20.4
126673  109650  92.0    83.9    8.0
126682  109650  99.7    79.8    19.9
127353  109650  99.1    86.0    13.1
129598  109650  99.2    79.3    19.9
  • 空きメモリ 3,201MB  当初3,542MB - 現在3,201MB = 減少メモリ341MB
  • apache2の子プロセス13個の使用メモリ は、
    SHARED約98.3MB + PRIVATE220.1MB = 318.4MB
  • Apache2の子プロセス一個の平均の使用メモリは、約16.9MBです。共有メモリは考慮しません。

上記の事より、この2日間で瞬間的な同時アクセスは13のようでした。ここ一週間のブログのアクセス数は落ちていないのですが、瞬間的なアクセス数は増えていないようです。

サーバの減少メモリも約318MBと安定しています。

WordPressはPHPという言語で開発されています。

PHPを使用するとメモリがリークすると言われていますが、今の所その兆候は見られません。

もう少し稼働状況を見てみます。

サーバの状況2023/2/8 23:55

一週間経った状況を報告します。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         531        1583         101        1678        3085
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
109650  1       32.8    30.8    1.9
151730  109650  135.6   118.1   17.5
151731  109650  137.1   115.9   21.2
151732  109650  137.6   115.1   22.5
151733  109650  118.3   102.9   15.3
151734  109650  120.9   104.4   16.5
151735  109650  126.9   102.8   24.1
151740  109650  126.4   102.9   23.5
151743  109650  123.6   103.8   19.8
151746  109650  140.0   118.9   21.1
151747  109650  119.4   102.7   16.7
151748  109650  129.8   106.0   23.8
151749  109650  139.7   119.4   20.3
152047  109650  124.0   102.7   21.3
156024  109650  91.9    80.5    11.4
156026  109650  90.4    80.1    10.2
156027  109650  115.5   98.6    16.9
  • 空きメモリ 3,085MB  当初3,542MB - 現在3,085MB = 減少メモリ457MB
  • apache2の子プロセス16個の使用メモリ は、
    SHARED約120MB + PRIVATE302.1MB = 422.1MB
  • Apache2の子プロセス一個の平均の使用メモリは、約18.9MBです。共有メモリは考慮しません。

MaxConnectionsPerChildに0を設定しているので、子プロセスが終了するきっかけが無い筈なですがプロセスの番号が変わっています。

もう少し調査を進めてみます。

サーバの状況2023/2/9 12:00

前回の測定から半日程度の状況です。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         519        1586         106        1687        3091
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
109650  1       32.8    30.9    1.9
158663  109650  144.9   118.3   26.7
158664  109650  137.3   117.4   19.9
158665  109650  133.4   117.7   15.8
158666  109650  129.2   114.9   14.3
158667  109650  132.2   116.2   16.0
158669  109650  121.2   106.2   15.0
158675  109650  121.6   106.8   14.8
158692  109650  125.5   105.2   20.3
158801  109650  126.5   105.5   21.0
158802  109650  115.0   102.9   12.1
158803  109650  138.9   119.7   19.2
158804  109650  129.5   113.3   16.2
158805  109650  130.4   113.9   16.5
161831  109650  91.8    79.8    12.1
161837  109650  91.7    78.9    12.8
161838  109650  93.9    80.9    13.0
161839  109650  113.6   98.3    15.3
161840  109650  83.2    70.7    12.5
  • 空きメモリ 3,091MB  当初3,542MB - 現在3,091MB = 減少メモリ457MB
  • apache2の子プロセス18個の使用メモリ は、
    SHARED約145MB + PRIVATEMB293.5 = 438.5MB
  • Apache2の子プロセス一個の平均の使用メモリは、約18.9MBです。共有メモリは考慮しません。

プロセスがどんどん入れ替わっていってます。

プロセスが切り替わる理由の調査を今後続けていきます。

新たなる問題が出て再起動 2023/2/12 0:56

2023/2/12 2:00頃、突然ブログからPermission deny がブラウザに表示される様になりました。また、SSHでRaspberry Pi4に接続ができなくなりました。

接続できる前に、インターネットに接続したままRaspberry Pi4とUSBでつながるSSDを移動させました。それが原因でSSDがオフラインになったと考えられます。

/にマウントされていたSSDが障害でオフラインになった事が原因と考えられます。

過去何回か経験があって、オフラインになった瞬間からどのログにも痕跡が残らず再起動後も原因追及ができませんでした。

早速再起動をかけ状況を検証を進めています。

サーバの状況 2023/2/12 22:30

再起動後約一日の状況を報告します。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         845        2340          99         608        2773
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
464     1       32.4    31.0    1.4
785     464     115.8   92.2    23.6
786     464     126.4   102.6   23.9
787     464     109.2   92.3    16.9
788     464     109.5   89.6    19.9
789     464     81.1    73.6    7.5
792     464     103.7   90.4    13.3
796     464     124.1   104.3   19.8
800     464     107.4   95.9    11.5
803     464     103.1   88.5    14.6
813     464     140.8   115.5   25.4
815     464     109.0   92.0    17.0
3149    464     122.2   101.5   20.7
3152    464     89.4    80.6    8.8
3153    464     97.0    83.7    13.3
3154    464     88.8    79.2    9.5
3155    464     91.6    78.9    12.7
3156    464     92.3    80.1    12.2
3157    464     89.4    79.9    9.5
3158    464     107.1   93.9    13.3
3159    464     107.9   91.3    16.5
3160    464     121.5   102.1   19.3
3161    464     88.6    80.5    8.1
3167    464     98.5    83.2    15.2
3168    464     117.2   98.7    18.6
3169    464     95.7    82.2    13.5
3170    464     93.0    80.6    12.4
3171    464     74.0    60.5    13.5
3173    464     92.9    80.1    12.8
3174    464     81.7    71.6    10.1
3176    464     74.4    62.3    12.1
3180    464     96.5    86.9    9.5
3181    464     108.4   88.2    20.2
3182    464     90.7    80.7    10.0
3183    464     96.2    82.6    13.7
3184    464     117.0   102.1   14.9
3185    464     92.6    80.9    11.8
3186    464     68.6    60.6    7.9
3187    464     103.1   88.0    15.0
3188    464     108.7   91.0    17.7
3189    464     87.5    79.5    7.9
3190    464     78.8    64.1    14.6
3191    464     102.4   88.9    13.5
3192    464     87.3    74.1    13.1
3193    464     101.4   81.1    20.3
3194    464     97.3    87.9    9.4
3195    464     80.8    71.1    9.7
3235    464     121.6   102.6   19.0

apache2の子プロセス47個の使用メモリ は、SHARED約123MB + PRIVATE673.7MB = 796.7MB

Apache2の子プロセス一個の平均の使用メモリは、約14.3MBです。共有メモリは考慮しません。

現時点48プロセスが残留しています。通常土曜日日曜日のアクセスは少ないのですが、既に48プロセスが残留しているので同時アクセスが発生していると考えられます。

この結果から、平日100を超える同時アクセスが有り、100を超えるプロセスが削除された事が予想されます。

試行3 設定内容を変更して様子を見ます。

設定内容を下記の内容にします。

$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
        StartServers            5
        MinSpareServers         5
        MaxSpareServers         100
        MaxRequestWorkers       120
        ServerLimit             256
        MaxConnectionsPerChild  0
</IfModule>

MaxConnectionsPerChildを0に設定しているにもかかわらず

  1. 何故、子プロセスの番号がどんどん変わるか?
  2. 何故、MaxSpareServers 100に設定しているのに残留子プロセスの数が減るか?

その原因を確認する為、MaxConnectionsPerChildを0に、MaxRequestWorkers 120を設定して、多数の同時アクセスの痕跡を子プロセスの残留数が100個となる状況探りたいと思います。

サーバの初期状態 2023/2/12 23:44

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         202        3348          32         242        3492
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
505     1       31.5    30.6    0.9
534     505     55.2    39.8    15.4
535     505     52.8    45.5    7.3
536     505     46.5    39.3    7.1
537     505     46.2    39.1    7.1
538     505     9.6     9.4     0.2
665     505     9.5     9.3     0.1
669     505     9.5     9.3     0.1
671     505     9.5     9.3     0.1

Raspberry Pi4の再起動直後でもアクセスが来ているので正確ではないのですが、現時点約3,500MBの空きメモリが有るので、初期の空きメモリを3,500MBとします。

MaxRequestWorkersに120を設定し、同時アクセス120個の子プロセスまで可能とし、同時アクセスが沈静化すると、100個の子プロセスがシステムに残留する筈です。

明日以降の結果が楽しみです。

サーバの状況 2023/2/14 13:49

恐らくサーバのアクセスの多い時間帯と思われるサーバの状況を採取しました。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         941        2248          78         603        2698
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
505     1       32.4    31.5    0.9
8952    505     114.7   96.2    18.5
8953    505     98.3    85.4    12.9
8954    505     91.1    80.4    10.7
8955    505     104.2   87.3    16.9
8956    505     114.8   99.6    15.1
8960    505     93.2    80.1    13.0
8965    505     106.2   86.5    19.7
8971    505     90.1    79.2    10.9
8973    505     102.7   80.8    21.8
9194    505     86.9    79.8    7.0
9195    505     101.2   87.2    14.0
9196    505     92.1    79.1    13.0
9197    505     81.4    70.4    10.9
11499   505     72.3    59.7    12.6
11502   505     80.0    67.5    12.5
11503   505     51.6    43.4    8.2
11504   505     59.0    51.1    7.9
11505   505     54.0    44.0    10.0
11506   505     56.9    50.8    6.2
11507   505     46.3    42.8    3.6
11508   505     57.3    50.9    6.4
11509   505     54.4    44.0    10.3
11594   505     70.7    61.7    8.9
11595   505     77.2    69.5    7.7
11596   505     51.6    43.5    8.1
11597   505     48.9    40.0    8.9
11598   505     11.2    10.6    0.6
11599   505     49.2    42.3    6.9
11600   505     11.1    10.6    0.5
11601   505     50.3    43.0    7.3
11603   505     46.2    39.5    6.7
11604   505     71.9    63.3    8.6
11605   505     10.6    10.4    0.2
11606   505     11.3    10.6    0.7
11607   505     10.8    10.5    0.3
11608   505     61.9    53.8    8.1
11609   505     50.3    43.0    7.3
11610   505     58.9    50.8    8.1
11611   505     69.5    59.0    10.5
11612   505     49.1    42.2    6.8
11613   505     61.8    44.2    17.6
11614   505     48.9    42.1    6.8
11615   505     10.8    10.5    0.3
11616   505     10.8    10.5    0.3
11617   505     52.3    43.8    8.5
11618   505     89.9    78.0    11.9
11619   505     79.2    69.2    10.0
11620   505     68.7    60.0    8.7
11621   505     58.1    53.2    4.9
11622   505     70.6    61.7    8.8
11623   505     46.8    39.9    6.9
11624   505     61.2    53.1    8.1
11625   505     70.6    61.6    9.0
11626   505     71.7    62.0    9.7
11627   505     95.0    80.4    14.6
11628   505     46.4    39.6    6.9
11629   505     68.3    58.9    9.4
11630   505     69.3    59.9    9.4
11631   505     58.9    50.8    8.1
11632   505     68.7    59.2    9.6
11633   505     54.6    44.9    9.6
11634   505     75.5    68.3    7.2
11635   505     57.2    44.7    12.5
11636   505     71.2    58.9    12.2
11637   505     65.4    58.2    7.2
11638   505     52.0    44.0    7.9
11639   505     50.4    43.0    7.4
11640   505     49.2    42.6    6.6
11641   505     66.8    57.7    9.1
11642   505     46.6    40.0    6.6
11643   505     61.7    44.1    17.6
11644   505     59.1    44.1    15.1
11645   505     54.0    43.6    10.4
11646   505     58.2    44.0    14.2
11647   505     56.9    50.8    6.2
11648   505     91.4    79.0    12.5
11649   505     58.5    50.3    8.2
11650   505     47.5    42.3    5.2

apache2の子プロセス78個の使用メモリ は、SHARED約100MB + PRIVATE713.5MB = 813.5MB

Apache2の子プロセス一個の平均の使用メモリは、約10.5MBです。

日中のアクセスの多い時間帯に同時アクセス数もそこそこ伸びています。

瞬間的なアクセスは、更に多いのかもしれません。

さて、時間が経ってもMaxConnectionsPerChild 0で、MaxSpareServers 100を設定しているので、今の78個のプロセスが残り続ける筈と思っています。

サーバの状況 2023/2/15 10:18

前回から約一日経ったところで確認してみました。

$ free -m
               total        used        free      shared  buff/cache   available
Mem:            3793         412        2702          78         678        3227
Swap:           1023           0        1023

$ sudo echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep apache2|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done
PID     PPID    RSS     SHARED  PRIVATE
505     1       32.7    30.7    1.9
18351   505     102.0   80.0    22.0
18352   505     83.5    70.5    13.0
18353   505     113.6   97.1    16.5
18354   505     96.9    79.5    17.4
18355   505     90.4    79.4    11.0
18431   505     95.2    79.8    15.4
18443   505     90.4    78.5    11.9
18446   505     111.9   97.3    14.6
18607   505     117.0   97.8    19.2
18611   505     91.9    79.4    12.5
18612   505     87.9    77.8    10.2
19298   505     90.2    77.9    12.3
19299   505     85.8    76.7    9.1
19300   505     81.6    69.1    12.6
19929   505     97.0    78.0    19.0

子プロセスの数が、78個から15個と63個も減っています。

また、プロセスIDを見ると子プロセスが全て入れ替わっています。

うーーーーん 今の設定では、子プロセスが入れ替わることがあっても、100個を下回る事が無い筈ですが実際はここまで減っています。

100個を超えて120個になった後、100個まで減る事でプロセスが入れ替わっていくと考え今の設定をしているのですが、確かにプロセスが入れ替わっているけど、残っているプロセスの数が少なすぎるのが理解できないです。

もう少し設定についての調査を進めます。

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