今年もこの季節がやってきました。
今年のISUCON4は出題がクックパッドになりました。自分たちは去年に引き続き @sugyan @tagomoris とLINE選抜チームを組んで参加しました。
共催枠なので予選免除で本選には出れるのですが、場数も重要だと去年参加して分かったので予選も参加しました。参加は1日目の土曜日です。
結果は「51192」ランキングには入りませんが、10位相当のスコアになります。言語はPerlです。ちなみに、2日目のベンチマークツールでも実行しましたが同等のスコアがでました。
準備
とりあえず、会社のchatに専用のchannelをつくり、@sugyan @tagomorisと簡単に確認し、去年の自分たちが用意したwikiを読み直しておこうと話をしました。
去年の本選前と同じく、使うであろうソフトウェアについては、コピペでインストールができるように準備しておきました。とは言っても去年とほぼ同じでいくつかバージョンがあがっているぐらいです。
準備したソフトウェアは
- memcached
- openresty
- mysql
- 使うであろうperl moduleを書いたcpanfile
なかんじ。
開始〜
去年の経験から、コードに手を付けるよりもまず、どんなサイトか確認し、冷静にプロファイルを取ろうということで、アクセスログの解析と、pt-query-digestをつかってMySQLのプロファイルをとりました。
そこで、今回のアプリケーションがログインの機能しかなく、アクセスするURLもクエリの種類も非常にすくなく、データ量もそれほど多くないことがわかりました。
この時点ですべてのデータを1つのプロセスの中でもつ、ISUCON用語でインメモリDBアプリにしたらよいスコアでるよね〜と分かりましたが、その本選に向け、スケールするような構成で行きたいということで現状のアプリケーションを改善していく方向でやりました。開催枠なので予選を通過出来るスコアをだせばいいやという余裕もありました。
ソフトウェアインストール
アプリケーションはmemcachedにデータを移動し、MySQLを使わないアプローチに決まったので、sugyanとtagomorisはアプリケーションの改善を行い、自分はソフトウェアのインストールや入れ替えを行いました.
perlの初期スコアが「1495」、workloadを4にあげて「3186」、ここからnginxをopenrestyに入れ替え、秘伝のタレnginx.confをいれ、StarmanをStarletに入れ替えるなどして「3489」。次にMySQLをこれまたチューン済みのmy.cnfとともに入れ替えてworkload 8で実行「2964」
この次に、使わなくなる予定のMySQLのインデックスの追加を行ってみました。すると、「cannot assign requested address」などのエラーがでたので、あぁ、keepalive効かないんだーと思って、sysctl.confにいくつか足してチューニング、ファイルデスクリプタもlimits.confを弄るなどして増やした。
すると、workload 4で「38417」、workload 8で「40690」とかいう数字がでた。
このあたりで13時。
わーい。トップきた- #isucon
— masahiro nagano (@kazeburo) September
27, 2014
ではここで運営枠のLINE選抜(青の線)が自重しない様子をご覧ください #isucon pic.twitter.com/WDqpV86LWt
— くしい (@941) September 27,
2014
アプリケーションの変更
ここから主に sugyanとtagomorisのアプリケーション変更。初期化フェーズでmemcachedに入れるところ、アクセス拒否を行うためのカウント、ログなどと段階的に進んでました。自分はその裏で、index.htmlを静的に吐き出したり、Starletを改造したり細かいチューニングをしていましたが、それほど効果なかったように思えます。
途中でreportが合わない問題に当たってなかなかスコアが上がらない時間が続きましたが、memcachedにデータを移しつつ、SQLがなくなっていく毎に45k=>50kとスコアがあがり、最後にプロセス数を弄ったりしつつ、50000〜52000ぐらいのスコアがでるようになりました。
バグに苦しんでた4万中盤で、5万点ぐらいは行きたいなーと思っていたので、その点数がでて一安心。
本選に向けて
事前の話通りに、プロファイルをとり方向性を明確にした上で取りかかり、実装できたところが良かった。それでも上はまだいるので本選に向けて予選の復習と、あれこれ作戦をチームで考えていきたい所存です。
クックパッドの皆様、そして941さんとりあえず予選おつかれさまでしたー。本選もよろしくお願いします!