一週間ほど前、徒労日記が「データベースに接続できません」と出て表示されない状態になりました。その時に少し調べてはいたんですが、昨晩また発生。本日朝方までつながらなかった様です。見えなかったよ!という方、申し訳ありません。
OOM Killerに亭主を殺されて一週間が経ちました
原因は単純でした。増えすぎたhttpdによるメモリ逼迫→OOM Killerによるロシアンルーレット的メモリ解放にmysqldが引っかかって死亡。
OOM Killer(Out of Memory Killer)は,システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り,必要なメモリー領域を新たに確保できない場合に,プロセスを強制 終了させて空きメモリーを確保する,Linuxカーネルの仕組みです。OOM Killerは,空きメモリーが確保できないことによりシステム自体が停止するという最悪の事態を避けるために用意されています。
自分のBlogにそんなにアクセスがなかったせいか、今までhttpdのパラメータはKeepAliveをOffにしただけのデフォルトで動いていました。ただ一週間前はとうとう夜中のアクセスが一定数を超えてしまい、256個のhttpdプロセスが起動→killer来訪となった様です。
その時はhttp.confのMaxClientを下げ、httpd,mysqldをrestartして復旧、様子見としました。
しかし昨晩はそれでも実メモリを食いつくす状態となってしまい、service httpd restartコマンドですら
監査システムを開くことができません:メモリを確保できません
と言われ受け付けられない状態に。ピンチです。GoogleAnalyticsで観る限りそんなに同時アクセスは無いので一種の熱病にかかったんじゃないかと思いました。ただ発生の状態が見えたのは幸いでtopやps、sarで観察。するとhttpdのプロセス一つあたり仮想で300MB,物理で80MB前後使っていました。
とりあえず搭載メモリから計算して
<IfModule prefork.c> StartServers 10 MinSpareServers 10 MaxSpareServers 20 ServerLimit 50 MaxClients 50 MaxRequestsPerChild 1000
としました。Website speed testでテストするとトップページを表示するだけで60request位発生するので、重くなったなぁと感じるのは致し方ない所です。
→2014/09/06 追記
どうもWordpressはMaxClientを少なくすると極端に速度が落ちるようです。あまりにも酷いので100まで上げたら嘘のように動きが戻りました。あとはこれでOOMしなければいいのだけれど。
apple-touch-icon.pngを設置する
エラー調査の途中でhttpdのerror_logを見ると
[Fri Sep 05 08:02:06 2014] [error] [client xx.xx.xx.xx] File does not exist: /home/dolls/www/public_html/apple-touch-icon-120x120-precomposed.png [Fri Sep 05 08:02:07 2014] [error] [client xx.xx.xx.xx] File does not exist: /home/dolls/www/public_html/apple-touch-icon-120x120.png [Fri Sep 05 08:02:07 2014] [error] [client xx.xx.xx.xx] File does not exist: /home/dolls/www/public_html/apple-touch-icon-precomposed.png [Fri Sep 05 08:02:07 2014] [error] [client xx.xx.xx.xx] File does not exist: /home/dolls/www/public_html/apple-touch-icon.png
というエラーが多発している事に今更気づきました。
ググった所、iPhoneなどのiOSデバイスのSafariで
- ページをブックマークに登録する場合
- ホームに追加でボタンを作ろうとする場合
無条件でアイコンにするファイルを探している為と判明(参考:apple-touch-iconやbrowserconfig.xmlなどWebサイトのスマホ用アイコン指定の最新情報を調べてみた | Web担当者Forum)。
ちなみにSafariだけの様で、Chromeはアイコンを使わない為アクセスが発生しません。
大本のファイルは”apple-touch-icon.png”で、これをサーバのDocumentRootに置くだけでもアイコンが表示されるようになりました。
使用するapple-touch-icon.pngはどんなサイズでも勝手に変換してくれる為、試す限り個別に用意しなくても問題は無さそう。それでも残りの3ファイルを探す”File does not exist”エラーは出続けます。しかも要求サイズが120×120だったり114×114だったりiOSの世代によって急に変更される事があるようです。
その度にアイコン画像を作成するのも面倒くさく、バナーも丁度正方形なので
sudo ln -s banner/title_banner.png ./apple-touch-icon-120x120-precomposed.png sudo ln -s banner/title_banner.png ./apple-touch-icon-120x120.png sudo ln -s banner/title_banner.png ./apple-touch-icon-precomposed.png sudo ln -s banner/title_banner.png ./apple-touch-icon.png
と横着してシンボリックリンクで終わらせてしまいました。また次のサイズを求めてくる様になったらその度変更しようかと。
ちなみにフラットデザインになったiOS6でブックマークに使われるアイコンはわずかに四隅がカットされるだけ。当Blogの四角いバナーでもまぁセーフですが、ホームに登録しようとするとかなり角が丸く切り取られます。不格好ですね。
気になる人は専用の角丸画像を用意してiPhone Style Icon Generatorなどで処理するとベターでしょう。