ISUCON6でイスコーン

前日

pixiv isuconの練習問題を、チームメイトの@chigichan24と一緒にやった。
( ・´ー・`)「適当にindex貼ってnginxで静的ファイル配って、いい感じにキャッシュすればワンチャンあるっしょw」

とか言いながらpprofのというものの存在を知り、使い方を学ぶ

dsas.blog.klab.org このページを参考に勉強(遅い

当日

朝8時に起きて急いで準備をして8時25分の電車で学校に向かう(外はどしゃぶり

バスで学校に行くのを忘れていて待ち合わせの時間に遅れる(申し訳ない

開始15分前にネットワークに接続できるようになり、5分前にチョコレートを食べる

チョコレートおいしい

開始

azureのデプロイが遅くてキレた(15分くらいかかった)

とりあえずベンチマークを走らせると、4000点くらいで、ここで終了したら勝ちじゃんと盛り上がる

まぁとりあえずgolangで動かすか、となってperlを切ってgolangを動かしてローカルで動くように諸々準備する

準備に1時間ほどかかってしまう(もったいない

ベンチマーク走らせる

Failed

( ・´ー・`)「なるほどね」

そこからボトルネックになっている部分を探すためにアクセスログを吐いたりプロファイラを走らせる

同時に、動きを見るためにコードを把握していく

mysqlのレコード数とか少なくて適当にindex貼ってもこれ無理ではとなる

実装を見て、なんだこの実装は(困惑)となりつつ読み解いていく

  • dbが2つあってspamのプロセスを除くと、2つのプロセスが動いているが、ISUCONにおいてはおそらく無駄なので一緒にしてよさそう
  • htmlifyの中の正規表現が重すぎる
  • 毎回regexpのmatcherを作るのは頭悪そう
  • スライスのcapは多めにとってよさそう

実装

htmlifyの修正を@orisanoにお願いして、isutarをisudaにマージする

htmlifyの修正の内容は、毎回keywordを取得するところを先に取得しておくようにしたり、いらないfieldの取得をやめる等

スコア 0

( ・´ー・`)「つらい」

めちゃめちゃタイムアウトしててだめっぽい

本格的にボトルネックの部分をどうにかしようととりかかる

明らかにregexpが遅すぎる

golangregexpが遅いというのを聞いたことがあったので、そこの改善策を考える

すべてのkeywordに対してregexpしてるのがまずそうだから、一致したkeywordのエントリをテーブルに保存して次回以降はそれを参照すれば早そうということに、10分ほど考えて気づく

でも後から考えたらわざわざテーブルじゃなくて普通にキャッシュしたほうがよさそう

実装し終えてベンチに投げるが、バグがあるらしく、Failedしてた

golangのFindAllStringでハマっていて、containsで含んでいるか全部見てとりあえず解決(ここの実装は@orisanoさんがやってくれた

それ以外のも少しハマって、順位表凍結後にようやくPASS

42000

ずっとスコア0だったのでめちゃめちゃ嬉しかった

そこから正規表現で動くようにいじってもらって、ベンチ見ると10000くらいになってたのでロールバックした

あとはnginxのログ切ったりとかの最後のあがきで最終スコアは44205だった

まとめ

全体的に実装力が無くてそこに時間を取られて思いついたアイデアを実装するに至らなかった

それぞれローカルで動かす環境を整えたり、プロファイルを取り始めるのが遅くて最初の3時間のうち1時間くらい無駄だった気がする

もっと効率的にやらないとやりたいことができない

ただ、思いついたアイデアを実装して、ちゃんと効果が現れているのを見れて楽しかった

学生枠として本選に通ったので、頑張りたい