概要

一週間止まっていたサービスを何の考えもなしに最繁時間帯に再開するとどうなるか…

今まで考えないことはなかったのですが、具体的な対策もしていなかったので想定通り接続しづらい状態が続きました。
誤算は応答時間が通常通りになるまで2時間を要したことでした。

サーバーを現用に組み込む場合は慣らし運転をして十分にキャッシュにデータがのった後に組み込む必要がある…というのは知っていましたが「まあ、30分くらい耐えられば大丈夫だしなあ」と思って特に対策はしていませんでした。
※事実、今までも半日くらいサービスが止まることはありましたが、30分くらいで落ち着きました。

後述しますが、ErogameScapeはPHPが生成するキャッシュ機構を使ってキャッシュを生成しています。
その生成のためにIOwaitが発生し応答時間が遅延しました。

よくアクセスのあるページのキャッシュを生成するスクリプトを作る必要があるかなあ…と思いました。

詳細

2013年9月9日から2013年9月15日に発生した障害についてに記載したとおり、ErogameScapeは一週間ほどサービスが止まりました。
ハード的な障害ではなくソフトの問題でしたので、サーバーを再起動すれば復旧できました。
今までの経験からサーバーが止まって復旧させるとアクセスが集中して負荷が大変なことになることは分かっていました。

ErogameScapeのソフトの構成は以下のようになっています。
---- Apache ---- PHP  ---- pgpool  ---- PostgreSQL
                  |
                  |----- PHPのキャッシュ(HDD)
ErogameScapeは2台のサーバーで動かしています。
いつもは1台のサーバーでやりくりしているため、ApacheもPostgreSQLも同じサーバーで動かしています。
しかし、今回は多数のアクセスがあることが予想されたため、ApacheとPostgreSQLを別々のサーバーで動かすことにしました。

---- Apache ---- PHP  ---- pgpool  --------   ネットワーク    ---- PostgreSQL
                  |
                  |----- PHPのキャッシュ(HDD)
 
この状態で、twitterで「高負荷になるのでアクセスできない場合は時間をおいてアクセスしてください」とアナウンスして、組み込みました。

その結果
 Apacheを動かしているサーバーのLoad Average → 100越え
 PostgreSQLを動かしているサーバーのLoad Average → 最大でも10程度
と、そんな結果になりました。

「ああ、ErogameScapeって意外にPostgreSQLによる負荷って少ないんだなあ」と今更ながら思いました。
さて、Apackeの方がボトルネックになっているからなんとかしないといけないと思いました。

Apacheのhttpd.confのMaxClientsが大きすぎると接続数が多すぎて処理できないから、少なく設定してクライアントに待ってもらった方が結果的に応答時間が少なくなる…という記述を見たことがあったので、設定値を300から200にしてみました。

その結果、300の場合は応答時間が長いものの応答が返ってきていたのですが、200にしたらそもそも応答が返ってこなくなって、これはまずい…と元の設定に戻しました。

元に戻した途端に応答時間が通常通りになりました。

さて、何がボトルネックになっていて当時応答時間が遅かったのだろう…と思ってmuninのグラフを見て考えました。

無題

①はサーバーを組み込んだ後、応答時間が長かった間のApacheのアクセス数です。
通常50access/secondくらいは問題なく処理できるはずなのですが全然捌処理出来ていません。
キャッシュを生成しきった後と思われる②の時点では、通常通り処理できています。

また、Apacheのprocessesについて、③はサーバーを組み込んだ後で、MaxClientsの上限である300までいってしまっているのが見えます。その後、④で200に設定を変更しても応答がなくなってしまったので、あわてて300に変更したら200processes程度に落ち着いたのが分かります。

無題
当時のDisk throughputを見ると最大で3.8MB/secondの書き込みがあります。
②の段階では520kB/second程度にまで落ちています。
ErogameScapeは主要なページをキャッシュしています。
PHPがキャッシュを生成しまくって、最大で3.8MB/secondの書き込みをしている結果、応答が遅くなったのだろうなあと思います。

以上の事象を防ぐには、事前にキャッシュを生成するか、キャッシュを破棄するタイマーを一時的に長くして(通常は5分から1時間に設定しています)みることかなあ…と思います。

終わりに

商用でサービスを提供している技術者の方々には当たり前の内容な気がするのですが、多くのアクセスがある規模のサービスを提供する会社に入るのはすこぶる難しい気がして、でもそういう会社に入らないと学べないこともあると思うんですが、そういう会社に入るためにはそういう会社の当たり前なこと知らないと入れない気もして(求人の条件を見ると、そんな人は少ないんじゃないか…なものばかりに見えます)、できる人はよりできるようになるけど、できないけどやる気がある人は…昔よりは大規模サービスを運用している方々がいろんな本を書いてくださっているので学ぶことはできるのですが、昔よりすこぶる内容が難しくなっているし覚えることも多いし、大変だよなあ…と思います。
こう…なんといいますか、中間くらいの知識が欲しいです。
初心者でもないけど、大規模なサービス運用者でも全然なくて、サーバーが2,3台で済むくらいのサービス運用のノウハウ的な何か。
Webサービス以外の分野もそんな気がしますが、初心者向けの本(サーバーを構築してみよう的な)と、専門書(数百台規模のサーバーを運用します的な)は充実しているのですが、その中間というか、1台だったサーバーを2台で運用してみよう!的な段階の本があるとうれしいなあと思います。
実はあったら教えて欲しいなあと思います。