沢山のアクセスが有った時に、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のプロセス数を決めて設定を行います。
- preforkが使える状態か確認
- 最大の同時接続数を試算
- 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>
各設定の意味は下記の通りです。
項番 | 項目 | 説明 | 補足 |
---|---|---|---|
1 | StartServers | Apache起動時の子プロセス数 | Apache起動時にまずはここで設定された数の子プロセスを起動します |
2 | MinSpareServers | 待機時の最小子プロセス数 | アイドルの子プロセスがMinSpareServersより少なくなったら、この値まで子プロセスを立ち上げます。 つまり高負荷が連続して待機プロセスが無くなったら、それでもこのプロセス数分追加しに行ってしまいます。 |
3 | MaxSpareServers | 待機時の最大子プロセス数 | アイドルの子プロセスがMaxSpareServersより大きくなったら、この値まで子プロセスを削除します。 |
4 | ServerLimit | 設定可能なサーバプロセス数の上限 | MaxRequestWorkers を256以上に設定したい場合はServerLimitも設定する必要があります。また設定値は、 ServerLimit ≧ MaxRequestWorkers とする必要があります。 |
5 | MaxRequestWorkers | 最大の子プロセス数 | 最大の同時接続数です |
6 | MaxRequestsPerChild | 1子プロセスが処理するリクエスト数 | ここで設定された数のリクエストを処理すると子プロセスが死にます。”0″にすると無制限にリクエストを処理します |
7 | MaxClients | Apache2 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に設定しているにもかかわらず
- 何故、子プロセスの番号がどんどん変わるか?
- 何故、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個まで減る事でプロセスが入れ替わっていくと考え今の設定をしているのですが、確かにプロセスが入れ替わっているけど、残っているプロセスの数が少なすぎるのが理解できないです。
もう少し設定についての調査を進めます。