ISUCON6に参戦した
先日の前田の 外国語学習支援制度で英語を学ぶ という記事中で
(ISUCON6の) 詳細は自分でISUCON問題を作ってしまうぐらいISUCON大好きな伊藤がブログで書いてくれると思います。
と紹介された伊藤です。
期待通りにISUCON6参戦レポートを詳細に書きたいところなのですが、今週頭に39℃を超える発熱をしてしまってISUCON6の記憶が一部破損してしまったため (苦しい言い訳ですね)、大まかに紹介したいと思います。当日までの様子は以下の記事をご覧ください。
ISUCON6当日
今年も去年と同じメンバー(伊藤,下條,前田)で参戦しました。下條と前田が名古屋におり私だけが浜松にいるのですが、リモートISUCONは辛そうなので彼らがいつも仕事をしている ベースキャンプ名古屋 に行き、3人で仲良くISUCONです。
ぼくが最近趣味でGoを書いているので、仕事でバリバリ使っているRubyを捨てて、Goで行く!?という案もありましたが、3人で楽しくワイワイやりたかったのでRubyで挑戦しました。
最初の1時間ぐらいはマニュアルをじっくり読んだり、どんなミドルウェアが動いているのかを確認したり、速度改善するアプリケーションはどんなものかをブラウザから見て理解するなどしていました。
isupam という謎のプロセスが動いていたのですが、理解に時間がかかりそうなのでとりあえず放っておいて、isuda と istar のアプリケーションが相互に通信しあっている部分を解消することから取り掛かりました。(その他DB、SQLのクエリ、Nginx周りの細かな改善もちょこちょこやっていました。)
12時
上の対応が終わったのがおそらく12時頃で当時のスコアがこんな感じでした。それまでずっとスコア0点だった状況から一気に9位に来たので急いでスクショ撮りました!
昼ごはんをモグモグしながら、残りの改善箇所は htmlify と isupam の2箇所かなぁと話をしていて、それぞれ次のような方針で行くことにしました。
- htmlify: 初期データでDBに入っている(リンクを張るべき)単語を用いて、事前に記事の内容を htmlify しておく。記事を表示する際にはベンチマーク開始後に追加された単語 のみ を対象に htmlify してのリンクを追加する。ただしこの方法だと 単語の長い順にマッチさせてリンクを張る という仕様が崩れてしまうため、ベンチマーカーのリクエストのうち数回はレスポンスエラーになり減点されるだろうという想定のもと取り掛かりました。(処理が軽くなる分スコアが上がるか、レスポンスエラーが増えてスコアが下がるかドキドキ)
- isupam: こちらはおそらくスパムの単語数に上限があるだろうなと推測し、スパム文字を含む記事のタイトル一覧を書き出しました。そのタイトル一覧を文字列でアプリケーション内に持っておき、投稿されたタイトルがそれらに合致すればスパムと判定するという処理に切り替えました。
16時
上の対応が終わった段階で16時ぐらいになりこの時のスコアが38000点ぐらいで8位でした。
ただ、 htmlify を元の仕様通りに実装していないため、ベンチマーカーのエラーが10~20種類ぐらい出ていました。エラーレスポンス1件に付き-50点とマニュアルに記載がありましたが、10種類x-50 = -500点ではなくて、何回も同じエラーのレスポンスを返していてかなり減点されていた感じがしました。(10種類x100回x-50 = -50000点 のように)
エラーになっている状況を詳しく説明すると、
例えば ボール
という単語が初期データとして登録されていたとして、記事中の文章が
#原文
サッカーボールを蹴った
の場合、事前処理されて(ベンチマーカー走行前に)予め
#事前処理後の状態
サッカー<a href="#ボールへのリンク">ボール</a>を蹴った
の状態でDBに入っています。
ベンチマーカー走行中に サッカーボール
の単語が登録された場合、期待されるレスポンスは
#期待されるレスポンス
<a href="#サッカーボールへのリンク">サッカーボール</a>を蹴った
なのですが、事前にリンク付きの状態に変換してしまうと サッカーボール
に一致する文字列がないため サッカーボール
→ <a href="#サッカーボールへのリンク">サッカーボール</a>
に変換できず
#私たちのレスポンス
サッカー<a href="#ボールへのリンク">ボール</a>を蹴った
となってしまい、期待された結果を返せないという問題が起きていました。
この場合、サッカー<a href="#ボールへのリンク">ボール</a>
→ <a href="#サッカーボールへのリンク">サッカーボール</a>
というように置換をして対応をするしかありません。
どうしようかと悩みながら、何度かベンチマーカーを流しているとこのような問題が起こる単語の種類にも上限があることが分かり、上のような置換をベタ書きでどんどん書いていけば、あたかも正しく変換しているかのように振る舞うことができそうだということがわかりました。(↑のような変換を手書きで20個ぐらい書くということです!笑)
これに気づいた段階で競技終了まで残り30分ぐらいとなっていて、全てのパターンに対応するのは難しそうだけど、これでうまくいくか1つ2つやってみよう!ということで挑戦したのですが、何故かうまくいかず…
(理屈の上ではうまくいくと思うので、ぼくの実装がおかしかったんだと思います…)
結局、あーだめだーーーとなってインスタンスが再起動に耐えられることだけ確認だけして、競技終了になりました。ベストスコアは44245点でした…
本戦出場の最低スコアが90214点だったので、まだまだですね。。。
ただ昨年と比べると、チームでISUCONした感が出ていて、終わった後は3人ともすごくスッキリしていたのでその点は大変良かったと思います!
反省点
- isupamの結果情報を文字列で持つようにして頑張ってたけど、今思えばRedisなりMemcacheなりでisupamのレスポンスのキャッシュを取っておいて、知らないのが来たらisupamに投げれば良いだけだった。。その分の作業時間がもったいなかったですね。
- htmlifyのリンク変換順序おかしい問題について。終了後にNginxのアクセスログを見て、もし全部正しいレスポンスができていた場合のスコアを計算したら207137点だったので、最後全員でデバッグしてもうちょっと頑張ってみても良かったかなと思いました。isupamで時間を取られていなければできたかもですね。。(それにしても15万点も減点されていたとは…)
- 去年と同じように、最後の1~2時間ぐらいでスコアに伸び悩む問題が再発して、どうにかして改善したいです。が、この問題はどのようにすれば解決できるのでしょうか。。(単純に能力不足…??)
余談
その1
(ISUCON7があるのかわかりませんが)来年は私の諸事情により下條と前田とチームを組む可能性が低めなのですが、聞くところによるとどうも彼らの来年の目標はISUCON決勝進出ではなく、ぼくのチームよりもハイスコアを叩き出すことだそうです!笑
来年のISUCONが楽しみですね????????????
その2
個人活動の宣伝で恐縮ですが、またまた自作ISUCON作りました。ISHOCON2です。前回の ISHOCON1は爆買いECサイトがテーマでしたが、今回のテーマはオンライン選挙です。まだRuby実装しかできていませんが、そのうちGoとPython実装は作ろうかと思っているので興味がある方は遊んでみてください。
現在MMMではISUCONに興味があるエンジニアも興味がないエンジニアも大募集中です!フロントエンドからバックエンドまで幅広く採用活動を強化中ですので、興味がある方は是非ご連絡ください。
株式会社MMMの採用/求人一覧 - Wantedly