uzullaがブログ

uzullaがブログです。

ISUCONでした

今年もISUCON!!!!!!!!!!!

ISUCONがなんであるかは以下エントリをご覧下さい。
isucon.net

やったこと

私は足回り担当でした。OSと、ミドルウェアと、ライブラリと、GCPの操作そこらへんを全部担当です。
去年はガンガンコードもさわってたんですが、今回はいったんゲタを預けました。

理由は簡単で、3人いて、他2人はPerlが得意なのが共通で、私は得意でなく、他2人より、サーバー周り(Linuxの設定とかそういうの)は得意だと思っていたからです。

プロファイル周りもドンドンやりたかったんですが、NYTProfがなんかすごくむずかしくて、差し込んだりはずしたりも結構たいへんぽかったので、できなかった。

ログの集計でアクセスパターン解析とか、(あまり役にたたなかったけど)MysqlのSlowlogをとったりとか、どうしてもidleが余る…多分これはこのアクセスパターンが乗り越えられないから、とかそういうのの調査はしました。



事前目標

勿論予選突破!そして優勝!なのですが、その目標を分解して、今回自分で勝手にきめた自分のミッションは、30分でサーバーの設定を仕上げて、チームに引き渡す事です。

ISUCONで、コードを本格的に触り始めるまでの時間がどれだけ短くできるかって本当に重要なのが去年で解っていたので、ここに全力を投球することにしました。投球といいつつ、やる事は素振りです(後述)。当日より当日までが重要。

結果的に本番で30分はムリだったんですけど、どうしても練習できない最初のドキュメントを読んでどういう手順なのか、という確認もありましたし(そして何故かイメージを作るのにも普段より時間がかかった)、ここはむずかしいですね〜。読解能力を上げる練習だろうか。

いまどきはセットアップは「Ansibleでやれば一発じゃん!」というのはあるんですけど、他人のサーバーはどういう構成になってるか読めないので(ディストリやツールの暗黙的な了解を破ってる事とか)、私は秘伝のたれ(シェルスクリプトやコピペなど)をつかいました。来年もISUCONやるならタレをつくると思いますwあと、各環境毎にプリコンパイルしたバイナリがどっさりですね、調整したビルドは本当に時間がかかるので、先にビルドしておいた方が絶対に良い。

結果として(?)設定ファイルやPerlバイナリの場所がどうとかそういう所にはハマりませんでしたし、設定が終わった後は、チームメンバーがOSやミドルウェアで混乱することはなかったとおもいます。PerlのModuleも追加したのは数個だったらしい。

あ、一点だけmysqlのsockの位置だけはかえてもらっちゃったな。*1


事前の素振りについて

セットアップとは、
カーネルパラメータを入れ換えたり、
ulimit周りを適切にしたり、
あんま好きではない(し、チームメンバーもあんまり詳しくないであろう)systemdをsupervisordにさしかえたり、
3種類くらいのバージョンのPerlをいれたり、
Mysqlにタレをいれたり、
変な罠がないか見たり、
そしてできた足場をスナップショットとって配布したり、

そういうやつです。

ハッキリ言って、むずかしいことはなんもないんですけど、これをサッとできるかは素振りできまる。しかも何のディストリビュージョンがでてくるかわからないので、想定できる変数が沢山ある。

一応、Ubuntuだろう、というのはどっかのエントリにありました。こういう色々な情報を目をさらのようにして下調べして、「これがくるだろう」というのの予想をたてたりもしました。(こういう情報収集も、下回りをやる人間の役割だったと思います)

結果として、Ubuntuの14 LTS、あるいは15の可能性が高いな、と決めてはいたものの、念を入れて

CentOS系5,6,7
Ubuntu系14.04,14.10, 15.04
Debian jessie Wheezy

で、タレをつかえば一度もググらずセットアップができるように確認をしました。


実際予想の範疇でUbuntu 15がでてきました。systemdです。こいつは地味に面倒なんですが(ググらずにサービスの起動、再起動、非活性化、ulimitを上げる方法etcが私にはわからないwログは!?みたいになるw)、さっさとsupervisordにアプリ(PerlとNginx)を引き渡す最短ルートができていたので、ここではまったくハマらずに済みました。
*2*3

KVSもさっさとコンフィグを書いておいたので、スッといれて、再起動方法をチームに渡すだけでOKです。

結果、ミドルウェア周りの質問がチームメイトからほとんどとんでこなかったので、満足です。


感想

凄く楽しかったです。ISUCONでイヤなのは、朝早くおきなきゃいけないことくらいですね。

私はISUCONの楽しさって、素振りと感想戦(あるいは、来年に備えての新たな素振り)だとおもうんですよね。

漠然とさわってるとなにやっていいの?ってなるとおもうんですけど、最初のスタートダッシュを一瞬で終わらせるぞ!とか、ツールを用意するぞ!とかそういうのすごい楽しいわけですよ。

本番の(?)アプリチューニングとか、失敗したらお客さんからめちゃめちゃ叱責して、場合によっては懐まで痛くなるようなことがあるんだけど、ISUCONはないので楽しい。

まあ、予選突破できなかった私がいっても、「ハァ?」とおしかりを受けます。私の力不足や貢献不足もあり、*4やはり予選突破まで持って行けなかったことはチームメイトには大変申し訳ない。


(私たちがやった会場はdotsで、快適なWifiと大きいモニタやホワイトボードなどをお借りした)

後悔(?)

やっぱり私はPHPerなんだな。

(最後の2hくらいで、私は手があいてしまったので、PHPのコードをみはじめて、プロファイルやデバッグコードをいれまくったら、わりとここが悪いというのが見えてきた、そしてその情報をチームにシェアしたので、多少貢献できた…と言えるには時が遅すぎた。「いまさら言うの!?」という感じになってしまった。
ダメコードの改修は自分は割と普段からやっている分野で(もしかすると)私の得意分野かもしれないのに、それができてなかった。さっさとPHPでためしてココがいけない、というのを共有できればよかった。これは本当に反省である、私の手抜きといわれてもしかたない。
PHPはxhprofとかすごい優秀だし、デバッグもめっちゃやりやすいし、ガッと開発用のURLを追加してゴリッとSQL叩いたりもできるし、IDEつかえば関数の宣言ジャンプとかもできる。これは後日ブログに書きたいと思う)

なお、PHPの初期スコアは900である。さすがPHPである(?)

そして、PHPerだからと甘えて、Perlのコードをほとんどかかなかったのも大反省である。やはり最後は全員でコードを書かねばならぬ。

感謝

チームメイトのmoznionさん lestrratさん本当にありがとうございました。当方貢献がたりずに申し訳ない。次があれば今回を活かし、もっと活躍できるようにします。

ISUCON運営の皆さま、本戦はこの後ですし、まだまだ大変でしょうが、今回は本当に良い感じの問題ありがとうございました。大変勉強になりました、今後に活かしていけるとおもいます。

他の参加者の皆さまにも、色々刺激をいただき、すでに様々な知見がシェアされていて大変勉強になります。この後さらに増えるんでしょうが、漏らさず読んで、私もさらにがんばっていけるように、そしていつかは私もなにかをシェアできるようになりたいなと思います。

あと、会場のdots様、快適な環境ありがとうございました!
https://eventdots.jp/spaceeventdots.jp


本当に有り難うございました!また来年!!!!(?)


懇親会時の余談


私「ところで私の身近にPHPerなISUCONメイトがいないんですがこれは」
某「あなたが怖いんじゃないの?」
私「なにが?怖くないでしょ?」
某「怖いよ」
私「怖くないよ!」
某「ヒゲが」
私「ヒゲか」

ヒゲが悪いんですか?

*1:書き換える前にマスターイメージを渡してしまって、手戻りしたくなかった

*2:マニュアルに、systemdの説明がほとんどなかったので、systemdがわからんチームに対しては有利だったのでは?とおもった

*3:ところでsystemdは結局SYSVの設定もあって色々混在してるのがイヤですね、まったく

*4:Perlをもっとガンガンかければ、もっと貢献できるのにね、ダメですね、スコアに貢献できずに反省しています。反省会で強く感じました