WordPressでのメモリー不足

最近自分のサイトを開くとたまにデータベース接続エラーと表示される。
なぜ?と思いいろいろ調べてみた。

まずは、メッセージを見よう!!とのことでメッセージを確認したところ

# cat /var/log/message

Aug 27 15:52:56 ip-172-31-28-143 kernel: [183456.373334] httpd invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Aug 27 15:52:56 ip-172-31-28-143 kernel: [183456.377171] httpd cpuset=/ mems_allowed=0

他のログをみていると・・・

Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.367208] [13194]    48 13194   109725    19224     176        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.371059] [13196]    48 13196   109588    19099     176        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.374846] [13197]    48 13197   109886    19394     177        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.378619] [13216]    48 13216   107199    16524     172        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.382540] [13218]    48 13218   107135    15938     172        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.386221] [13219]    48 13219   107135    15976     172        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.389883] [13222]    48 13222   102463    11780     163        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.393367] [13223]    48 13223   102463    11756     163        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.397152] [13224]    48 13224   102463    11751     163        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.400916] [13225]    48 13225   102463    11755     163        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.404675] [13230]    48 13230    96412     6530     151        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.408512] [13231]    48 13231    95657     6629     153        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.412199] [13232]    48 13232    95657     6670     153        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.415833] [13233]    48 13233    95596     6646     152        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.419535] [13234]    48 13234    95676     6529     152        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.423401] [13235]    48 13235    95657     6670     153        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.427138] [13236]    48 13236    95657     6662     153        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.431058] [13237]    48 13237    95657     6670     153        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.434930] [13246]    48 13246    93714     3154     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.438695] [13247]    48 13247    93069     3136     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.442423] [13248]    48 13248    93069     3136     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.446185] [13249]    48 13249    93036     3359     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.450102] [13250]    48 13250    93069     3346     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.453901] [13251]    48 13251    93036     3362     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.457654] [13252]    48 13252    93069     3223     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.461439] [13253]    48 13253    93069     3216     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.465041] [13254]    48 13254    93198     3235     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.468633] [13255]    48 13255    92776     3122     146        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.472232] [13256]    48 13256    93133     3250     145        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.475685] [13257]    48 13257    92051     1422     140        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.479273] [13258]    48 13258    92051     1423     140        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.482884] [13259]    48 13259    92051     1423     140        0             0 httpd
Aug 27 15:53:17 ip-172-31-28-143 kernel: [183458.486327] [13260]    48 13260    92051     1417     140        0             0 httpd

apacheの子プロセスが大量に作成されており、メモリー不足を招いていてようだった。

スポンサーリンク

対策を考える。

apacheのアクセスログを確認したところ、DOS攻撃を受けているようにも見えないため、単純なアクセス増加による影響だと判断した。
子プロセスが多すぎて困るのであれば、その数を制限すればいいのではと思い調べたところ・・・。

原因としては以前Wordpressを構築するときにApacheの設定で以下の値で設定していたが、メモリーが少ない場合この値をもう一段階変更する必要がある。

構築当初はアクセスが少ないことを見込んで、Apacheのプロセスの循環をあげてメモリリークを防ぐ

StartServers       3
MinSpareServers    2
MaxSpareServers   10
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  20

「ServerLimit/MaxClients」の値だが、子プロセスの作成上限を設定する個所となっています。
現在は256なので256の子プロセスを作成することが可能となる。

子プロセスごとのメモリー使用状況を確認すると1子プロセス当たり5~6%のメモリーを消費している・・・。
15個以上の子プロセスを作成すると物理メモリーを超えてしまう・・・!
Wordpressはやはりメモリー消費量が多いみたいで、この値を制限する必要があるとにらみ現在10で様子をみている。
ちなみにいろいろ調べたところ「ServerLimit/MaxClients」の値はメモリーをスワップさせないようにするため以下の値にするといいらしい

物理メモリ > 子プロセスの平均メモリー使用量 × 「ServerLimit/MaxClients」

子プロセスの平均メモリー使用量はざっくりとした値でよければ「ps」コマンドで調べることができる。
何回かアクセスを行いメモリー使用量の平均値を計算する。

# ps aux
apache   15079  1.1  6.8 427624 70024 ?        S    00:14   0:08 /usr/sbin/httpd
apache   15090  1.0  7.6 435920 78356 ?        S    00:14   0:07 /usr/sbin/httpd
apache   15138  1.3  6.8 426704 69420 ?        S    00:21   0:04 /usr/sbin/httpd

WordPressの場合大体6.8~7.6%くらいとなっている。
Apache以外のプロセスでもメモリーを使うことを考えても10個が最大ですね。