mizkeiのブログスマートフォン用の表示で見るmizkeiのブログこの広告は、90日以上更新していないブログに表示しています。2016-09-23ISUCON6に参加してきましたいい感じにスピードアップすることを目的とする大会「ISUCON」の第6回予選に参加しました。結果としては、予選敗退でした。参加でしたが、苦しさと楽しさを感じることができて非常に勉強になりました。やったことまとめISUCON前チームは同じ職場のtkyshmさんとgurisugiさんと組みました。チーム名は「RedComp」。私はアプリを担当し、tkyshmさんがインフラ周り、gurisugiさんが司令塔といったような役割でした。isuconと去年のISUCON過去問を解きました。ループクエリにならないようにするなどをしました。普段の業務はPerlなので、それをGoでさっと書けるようにしました。redisを使った実装なども一通り触り、準備は十分かなという気になっていました。ISUCONISUCON予選本番でやったことは下記のようなことです。azureサーバ構築Goのコード読みMySQL周りの修正isudaとisutarを一つにPerlへの切り替え動いていたサービス自体の概要としては、あるキーワードについて、その内容が書かれている。記事の書かれたキーワードが他の記事に含まれているときにはそのキーワードのページへのリンクが作成される。各ユーザはスターをつけることができる。この中で私がやったことをつらつらと書いていきます。main分割してるのかと思ったのですが、開いてみると、isudaとisutarという2つにmain関数が存在していました。systemdで確認するとisupamというserviceも存在しており、これはなかなかに面白いのでは、と思っていました。一つにするのも簡単だなと思いました。テンプレートの中にループクエリがあるわけでもなく、メインの処理の中にも一つぐらいしか、ループクエリはありませんでした。この時私は、「インデックスをはって、isudaとisutarを一つにすれば、とりあえず、スコアは跳ね上がるだろうなー」とか思ってました。goのコードを変更せずにベンチを回すとタイムアウトの減点で0点でした。isudaとisutarを一つにisutarは処理はスターの登録とスターの取得でした。相互依存の関係にありました。gurisugiさんにisutarのテーブルをisudaのdbと同じところに作成してもらいました。スターの取得処理は単純にキーワードで引いているだけだったため、isutarからisudaにコピーするだけ。スター登録処理もisudaからポストしていた値をそのままスターのテーブルにinsertするだけ。初期化処理もtruncateするだけ。一瞬で統合は終わりました。統合自体はこの処理をmergeした後にしようと思っていました。結果から言えば、統合したコードは最後までmasterにはいることはありませんでした。キーワードの長さをdbに登録するようにしてもベンチはまだ0点。redisからkeywordを取ってくるキーワードをリンクにするのが重い、ということでループクエリになっていたキーワード取得の部分をredisから引くようにしました。キーワードの長さは既にdbに格納されるようになっていましたので、初期化処理の際にキーワードを値、キーワードの長さをスコアにするようにredisに格納しました。キーワードのinsertの際はredisにも値が格納されるようにし、ループクエリとなっていた箇所はredisからの所得に置き換わりました。これをしても点数は200点程度。初期実装のperlですら1800点ほど出しており、もう焦りが私を満たしていました。regexpをなくすこれ以上はどうにもということで、pprofを打ち込んだのですが、圧倒的にregexpの置換が支配的でした。みんなのGo言語にもありますが、Goは簡単な正規表現の範囲では、他の言語の正規表現実装よりも遅いです。MustCompileしてReplaceしている箇所を消して、strings.Replaceに変えました。これではキーワードの分だけ記事内容を全部舐めて置換する操作は消えないので、非常に重い。予選が終了した後にtwitterでも多く流れていましたが、Replacerで置換するのが良いです。傍観者と化すこの時点で既に16時半ごろでしたが、gurisugiがperlでぱぱっとキーワードの取得の部分をredisにしてくれました。この修正でいきなり4万点までいき、isudoとisutarを統合したら7万まで点数は伸びました。(同時になんかちょこちょことした修正はしましたが、おそらく大きくは効いていない)goでやったことと全く同じことをしただけでこの差でしたので、もう私の心は壊れかけていました。まとめ私はあまりにもGoを書きたいという思いが強すぎた。このような自体をおこさないようにするため、普段の業務からGoを書くようにしたい。(願望)goを捨てる決断をするときも、私はまだ心の中で「待ってろよ!必ず戻って来てみせる!!」とも思ってました。非常に悔しかったですね。開催されるときには挑戦したい。一緒にチームを組んでくれた二人には非常に感謝しています。運営の方々には、このような楽しいイベントを開催して頂いて、本当にありがとうございます。予選1日目1位通過しましたISUCON6に参加してきました月別アーカイブはてなブログをはじめよう!mizkei11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。