ISUCON 2014 予選の記録 GoMiami

ISUCON4 予選に参加しました。

去年に引き続き2年目、前年同様 @sonots, @Spring_MT と。チーム名はGoMiamiで。今回もマイアミがすこし関係します!!

Go言語を選択すれば成長しないわけがない!!という意気込みのもとGoでいくことが決定。僕は少し前にA Tour of Go をひと通りやった程度。今回はインフラメインで2人はアプリコードメインに戦略立てるって感じで。

予選

事前準備

社内で1回前回大会の復習会をやったのと、チームで休日にあつまって前回予選課題を使って予行練習。当日どういう役割でどう動くかみたいなことを練習しました。この予行練習のお陰て今回予選はかなり余裕でました!! @sonots is our brain!

AM

午前中はボトルネック探しと、ベンチ特性、方針決めを中心にやった。ので午前中はチューニング作業は無し。

  • 開始と同時にメンバ分のインスタンス立ち上げ、本番用インスタンス立ち上げ
  • 本番環境整備(github pull&push環境)
  • ベンチ1回走らせて、プロファイリング。具体的にはnginxのアクセスログ、slowqueryログ、からベンチの特性分析
  • コード読んだり、画面見たり、ざっと。
  • my.cnf, nginx.confを予め用意しておいた内容で置き換え

MySQLのCPUが高いのはindexいれるとして、それ以外データベースであまりやることないことが分かって、事前に決めてた通りアプリにオンメモリで乗せる戦略にした。

MySQLは5.5が動いてて、一応5.6に上げる方針にした(けどこれは最終的にはオンメモリ戦略とるのでこの時点で上げる必要性はなかったかなと)

PM

飯食べながらさくっとMySQL5.6に上げたところで、じつはアプリのオンメモリ戦略の実装待ちで実はやることが無かった(笑)

アプリがfixしないうちに外を闇雲にチューンしてもはまるだけなので、焦っても仕方ないからこの時間帯はコード眺めたりしつつお茶を濁しておりました。やることないと色々手を動かしたくなるのですが、ここはぐっと押さえて。

アプリの改修が無事に終わって、MySQLのindexチューニングもいれて ここでスコアががくっと上がった。 詳細はsonotsブログが充実している。

アプリのオンメモリ戦略にてスコア上がった。さらにベンチ負荷上げて試したけどスコア頭打ち。CPU大して使ってないのにスコア上がらなくて。ネットワーク周りかなということでnetstat -an | grep TIME_WAIT | wc -l ってやると50kくらいポート使ってたので、以下のチューニングしたらport足りなくなる問題は改善しました。

net.ipv4.ip_local_port_range = 10000 64000 
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 65535

nginx-アプリ間はtcpで通信させててunix socketに変えれば良かったのだけど、martiniでunix socketに変えるやり方が分からなくて、上のチューニングでtcpで回ったのでよしとした。

結果としては最終的に40kあたりのレンジで他チームと横並びで、本戦出場は厳しそう…な感じですが、結果発表が楽しみです。

反省

Chef

予選はミドルウェアとか毎回同じなのでChefレシピ用意しといてインフラ担当が3人分開発環境まで揃えてあげればよかった。今回開発環境は各自お任せだったのでコード読み書きに専念させてあげればよかったなと。

Go

Go力足りてなくて速読できなかった(笑) Spring_MT氏はrubyでコードを把握した後Goをfixしたよと言っていた。なるほど。

所感

  • 前回大会に比べ今回は余裕をもって想定した力は発揮できたことは進歩
  • 個人的に次週に海外出張控えてて準備等々でISUCON準備できてなかったんですが2人が引っ張ってくれて助かったという感じです。

105 UPDATE

本戦出場決まりました!!!. 出張終えたら復習&&素振りやります。

というわけでリアルにマイアミ出張いってきます。