読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

ウェブサーバのチューニングについて考えてみた

エッセイ エッセイ-インフラ

前回(http://d.hatena.ne.jp/masudaK/20101111/1289468376)の記事で書いたように、apacheのチューニングって分かったようで分からない。
ただし、過去の経験から言って、多分そーだろーなーと現段階で思えるのは、

  • 無闇にプロセス数が変わるようなことはしない
  • ピーク時に、プロセスを作ったり殺すことは厳禁
  • 最初からフル稼働でよいじゃない


ということだと思っている。んで、それに合わせた設定が、


StartServers 100
MinSpareServers 100
MaxSpareServers 100
MaxClients 100
MaxRequestsPerChild 500

というような設定であるとも述べた。んじゃ、どうしてそうなのか、具体的にどの値(ここでは100)にしたらいいのかということを書いてみようかなーと思う。


んで、内容を書くわけですが、基本的に考えとしては、http://blog.nomadscafe.jp/2010/09/apachestartservers-minmaxspareservers-maxclients.htmlここに書かれているものと変わりません。個人的に一番理に適っていると思うし、対策がしやすいので。


ただ同じ内容だったら上記URL見ていただいたほうがいいし、自分のためにもならないので、ちょっと違った視点で書いてみる。
それが「戦で例えてみる」ということでございます。あくまで個人的な理解に過ぎませんので、間違っていれば是非ご指摘を。


どうしてすべて同じ値にすべきか(MaxRequestsPerChildは除く)。
これに対する答えは明確で、リーダーは暇ではないということだと思ってる。


たとえば、あなたが近畿地方を中心に活動している武将で、明日の24時ごろに、どばーっと大群が攻めてくるという場合を考えてみる。
自分でもそうだったのだけれど、チューニングを学びたいなというときは、わりと負荷が大人しいときだったりして、遭えて擬似的にabベンチでちょうどよさそうな値を取ったりして、
うーん、これでいこうなんていってたりする。


これは武将で言えば、「うーん、明日の夜に大群が来るのか。多分これぐらいどばーと来て、過去こんな感じだったから、これぐらい兵用意しておくか」みたいな。なんかふわふわしてる。
いわば理に適っていない感じがするのです。もちろん、擬似的に環境を作り出すことは悪いことではないし、過去の経験からこんな感じだったから、これぐらい兵を用意するってのは、すごーい経験に裏づけされているのならいいのかもしれない。でも、正直あまりリーダーシップないかなーとも思ったりする。


んで、自分もこんな感じで、多分なんか勝てそうな値だから、これでやってみようよ的なノリでチューニングとか言ってたりする。


そんなこんなで、その時間が来たとする。実際大体の予想というのは大雑把だから、過去の経験があたればうまく乗り切って、兵の消耗は防げるし、下手すれば破滅になる。
たとえば、MinSpareServersが5で、MaxSpareServersが20とかだったとする。


この武将(リーダー)は今は忙しくないし、兵もそんなたいして襲ってこないから、待機中の兵は5人いれば十分だよといっている。
そして、戦となりました。


いっぱい兵が来るので、待機中の兵は当然いなくなり、後方から兵を呼び出さないといけません。
当然待機中の兵は0なので、どんどん兵を量産していく。5, 10, 20と。


んで、50兵ぐらい作って、やっと五分五分の戦いができて、相手の兵の数が減ってきたとする。
そうすると、休める兵が10, 20, 30と増えていくわけです。


MaxSpare、つまり暇していい兵の最大数は20なので、30とかだと10余計なので、早く休めとある意味killをします。
んで、どんどん落ち着いてくると、自然と徐々にMinSpare、つまり暇していい最小の兵の数。つまり5兵まで減っていきます。
でも、いつまた来るか分からないから、5兵は用意しておくみたいな。


正直、こんなリーダーって頼りがいないなーと思うわけです。いっぱしの武将、少なくともある地域を支配するぐらいの武将なら、
相手と五分五分に持っていくまでやたら時間がかかるようなやつだと信用ならないし、監視している兵が5人しかいなくていいの?みたいに僕だったら不安に思っちゃうわけです。


んで、この一連の流れのなかで一番何が問題であるか。


それは、「相手の兵に追いつかないときに、武将が声をかけられる人数には限界がある」ということだと思っている。


正直、近くの10兵ぐらいなら、声をかけられるかもしれません。でも、一気に100とか200声かけられるかというと、ぶっちゃけ無理だと思っている。
んで、ここがチューニングの肝で、このような流れのままにしておくと、


「早く戦いたいんだけど、指令がこないーーーーーー」っていう兵がいっぱいいるということかなと思っている。
悲劇的に賢いことに兵という兵、みなさんお休み中のときは、決まってお休みの格好をしております。


武将に準備せい、突っ込んで来いといわれるまで、何も準備してない。
だから、武将の掛け声がすぐ飛んでこないと、こやつらぜんぜん働く姿勢になってないのです。


しかも、武将が声かけるのに精一杯になってて、自分のところまで声かけてくれないから、ぽかーんとしている。


んで、こんな設定がデフォルトでなされているもんだから、正直そういうのは避けようよというのが、チューニングなんだと思っています。
じゃ、できる武将ってのはどんなものか。
これは至極簡単で、

「兵をターミネーターだと思ってるから、24時間常に稼動できるMAXの兵を配置しておく」

ということであります。


ちなみにMAXでどれぐらい配置できるのかってのはサーバによって変わるので、一概に言えないわけですが、たとえばtopコマンドで以下のような感じだったとします。


そうすると、RES、SHEの項目の比較ができ、(SHE-RES)で、大体の1プロセスの使用メモリ数が分かります。23−14ぐらいで9MBみたいな。んで、全体のメモリをfreeコマンドで出し、その9割とか8割を充てる。もちろん、そのサーバの用途もウェブ専用であれば8割ぐらい充てられるかもしれないけど、そうじゃないサーバもあるので、そこらへんは微調整で。(もちろん、psでプロセスのID把握。/proc以下でstatusを見て考てもよいのでしょうが、今のところそこまでやらなくてもよさそうなので、上の方法とってますです)


んで、900MBをapacheに使ってみようかな、じゃ9*100=900MBになるよねってことで、100を設定しましょうってことになる。


この場合、戦としてはどうなるのか。


24時間フルに働ける兵が最大限配置されてます。これ以上は自分の軍隊のキャパを超えるし、ほんとこれが限界というまで配置されておりますです。
MinSpare、つまり暇な兵の最小数は100なので、100匹と戦う集団が襲ってこない限りは、常に戦闘体制(準備完了)している兵がいっぱいおりますです。でも、こやつら暇です。


その一方で、MaxSpare、つまり暇していい最大数も100なので、暇なやつらが100匹います。


もちろん、暇といっても、2,3兵ぐらいは常に誰かと戦っているので、こやつらはbusyとなってますが、大概はidleという暇人でございます。
んで、すごいピーク時になったときも、武将は「行け」としか指令出しません。お前の出番だ、早く準備しろ、行け行けなんて、めんどいことはしない。


すでに用意してるから、あとは勝手にやってくれぃ。これで勝てなかったら、うちらには無理じゃ。という感じになっている。
これが、自分なりに今までの体感で得たpreforkのチューニングかなぁと思っている。


もちろん、そんな負荷なんてないし、別に大丈夫だよーって思ってる人はapacheのプロセスが100もあることに違和感持つかもしれないし、まぁさばければいいさーって思う人にはそこまで必要ないことなのかもしれないです。ただ、多分チューニングとかで検索したりしてくる人は、なんかピンチだったり、もっと理解したいという人が大半だと自分だったらそう思うので、


自分なりに勉強も兼ねて書いてみました。

まぁ、この設定だったら、ピーク時に100使いきるのが分かった時点でスケールアウトしたほうがよいかなとか、IDLEが基本なんでそこまでCPUも使わないしまぁよいでしょ、と思えるので、僕は今のところこの設定が好きだったりします。


まぁ、長々と書きましたが、こんな感じでございますよということで。


P.S.
MaxRequestsPerChildに関しては、どれくらいリクエストをさばいたらkillしてふかーつさせるかなので、これは今のところ明確な基準もってないかもなぁ。メモリリークしそうだから、100とかに下げるってやっても、それはapacheのせいじゃない気がするし、だいたい500から1000あたりを割り振ってる気がしますです。何かご助言があればぜーひー。