先日、NanoPi NEO(512MB版)にLAMPを導入したので、外出先(ノマド)で使っています。
WordPressを使っていて気がついたのが、異様な遅さ。
原因はCPUではなくディスクI/Oなので如何ともしがたいのが辛い。
しかも小さいながらもスワップしているし...。
NanoPi NEO にはUSBポートがあるので、USBメモリにスワップを退避させることも考えたもの、それだと本体がコンパクトであるメリットが無い。
追加出費もしたくないので、メディアを"UHS-I U3"にするつもりもありません。
ということで、ひとまず Apache の設定を見直すことにしました。
目次
前提
- 一人で使う
- DBはSQLite3(詳細は「WordPress で SQLite 3 を使う」をご参照ください)
- 使用メディアは、microSD 8GB(Class 10 / UHS-I)
※クラスなどの詳細は「SD規格の簡単まとめ」をご参照ください
設定変更詳細
対象バージョンは、Apache 2.4.18 です。
$ apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2017-09-18T15:09:02
対象ファイル
設定を変更するファイルは以下の2つです。
今回は設定を変更した後で、diff(差分)でご説明したいと思います。
$ sudo vi /etc/apache2/apache2.conf
$ sudo vi /etc/apache2/mods-enabled/mpm_prefork.conf
ファイル編集
変更前にファイルはバックアップを
変更前に必ずファイルはバックアップするようにしてください。
不慮の事態になった際、だいぶ精神的な負担が和らぎます。
変更内容
対象ファイル〜その1〜
/etc/apache2/apache2.conf
対象項目
- Timeout
リクエスト/レスポンスの送受信やCGI(PHP等)のタイムアウトとして使われます - MaxKeepAliveRequests
1つの接続で何回のリクエストに応えるのかを指定します。
指定した数値までリクエストを受け付け、超えた分は別のTCP接続が確立されます。
数値を大きくすると一度に処理できるリクエスト数が増える反面、他の接続が割り込むタイミングが遅れる影響が出ます。
変更内容
項目 | 変更前 | 変更後 |
---|---|---|
Timeout | 300 | 10 |
MaxKeepAliveRequests | 100 | 10 |
$ diff -u /etc/apache2/apache2.conf_org /etc/apache2/apache2.conf
--- /etc/apache2/apache2.conf_org
+++ /etc/apache2/apache2.conf
@@ -83,7 +83,7 @@
#
# Timeout: The number of seconds before receives and sends time out.
#
-Timeout 300
+Timeout 10
#
# KeepAlive: Whether or not to allow persistent connections (more than
@@ -96,7 +96,7 @@
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
-MaxKeepAliveRequests 100
+MaxKeepAliveRequests 10
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
対象ファイル〜その2〜
/etc/apache2/mods-enabled/mpm_prefork.conf
対象項目(Apache MPM prefork)
- ServerLimit
子プロセス数の設定可能な上限を設定します。
下記"MaxRequestWorkers"以上の値である必要があります。 - MinSpareServers
必要なアイドル状態(要求を処理しないプロセス)の子サーバプロセスの最小数を設定します。 - MaxSpareServers
設定以上のアイドル(要求を処理しないプロセス)がある場合、親プロセスは余分なプロセスを強制終了します。 - MaxRequestWorkers
同時に処理できるリクエストの上限数です。 - MaxConnectionsPerChild
1つの子プロセスが処理する最大のTCP接続数を指定します。
指定した数のTCP接続を処理すると対象の子プロセスは終了します。
なお、初期値 0 は無制限を表します。 - MaxMemFree
free() が呼ばれない限り、 主メモリアロケータが保持し続けられるメモリの最大量です。
変更内容
項目 | 変更前 | 変更後 | 旧名称(<= Apache 2.2) |
---|---|---|---|
ServerLimit | - | 15 | (変更なし) |
MinSpareServers | 5 | 15 | (変更なし) |
MaxSpareServers | 10 | 30 | (変更なし) |
MaxRequestWorkers | 150 | 10 | MaxClients |
MaxConnectionsPerChild | 0 | 20 | MaxRequestsPerChild |
MaxMemFree | - | 99 | (変更なし) |
※MaxConnectionsPerChild の初期値 0 は無制限を表します
※MaxMemFree の初期設定無しは無制限を表します
$ diff -u /etc/apache2/mods-enabled/mpm_prefork.conf_org /etc/apache2/mods-enabled/mpm_prefork.conf
--- /etc/apache2/mods-enabled/mpm_prefork.conf_org
+++ /etc/apache2/mods-enabled/mpm_prefork.conf
@@ -6,11 +6,13 @@
# MaxConnectionsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
+ ServerLimit 55
StartServers 5
- MinSpareServers 5
- MaxSpareServers 10
- MaxRequestWorkers 150
- MaxConnectionsPerChild 0
+ MinSpareServers 15
+ MaxSpareServers 30
+ MaxRequestWorkers 33
+ MaxConnectionsPerChild 99
+ MaxMemFree 4096
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Apache再起動
Apacheを再起動して設定をリロードします。
$ sudo systemctl daemon-reload
$ sudo systemctl restart apache2
※"ServerLimit"等の設定は"graceful"では反映されません(一番確実なのは、stop + start)
おまけ
diff コマンド
テキストファイルの差分を確認できるコマンドです。
Armbian 5.35(Ubuntu 16.04.3 LTS)では、バージョン3.3が導入されています。
$ diff -v
diff (GNU diffutils) 3.3
なお、diffコマンドはオプション"-u"(Unified形式)で同じファイルの文脈の中で上から順に差分を調べることができます。