くるのプログラミング記録

プログラミングの感想とか解説とか。

ISUCON13 参加記録

こんにちは、webエンジニアの くる です。

くる、amanekoくん、タコス君の3人構成のチーム「たこたこ」で先日行われたISUCON13に参加しました。
そのときの感想。

先に結果だけ書くと、スコアは13,119点で、全然でした。残念。
isucon.net


2日前ぐらい?
ちょうどいい感じの祭日があったので、3人で練習をしようと決めていた。12:00~16:00ぐらいで軽く調整。
3人でISUCONに出るのは去年ぶり2回目で、若干役割みたいなのができてた

タコス: PM太郎。ソース書かない。pprofとかdbのslow query出したりとか、環境構成的なところやってくれる。
amaneko: adhocに色々動いてくれる。シェル書くときはamanekoくんが一番多い。あとはソース修正などなど。
くる: 人力CI。あとはソース修正などなど。

ざっとこんな感じ。

練習日は、「ISUCONって何してたっけ」「ssh久々すぎる。コンテナ世代すぎて触らん」「AWSの使い方わからん」「pprofどうやってたっけ」「人力CIやるにあたってのPAT (personal access token) のpermittion謎」
みたいな感じで、何もわからんムーブになってたが、まあいけるやろって感じで練習を終えた。良い感じ。
去年はこれを当日に言ってたので、だいぶ改善である。

タコスけ君が今年は、dbだけじゃなくてnginxのログからエンドポイントの統計情報みたいなの出してくれる準備もしてた。


当日
10:00に何とかみんな集合。始める。

開始してインスタンス周りの準備はとりあえずタコスの仕事。僕は待ちながら、githubのrepositoryを空で作ったり準備してた。
インスタンスが出来上がってsshできるようになったら、僕はとりあえず1号機のwebappをgit化する準備を。
タコス君は何やってたかよくわかってないけど、多分なんか準備してた。

amaくんは、とりあえずdbにindex貼るのを初手でやってくれてた。
最初1時間ぐらいでとりあえず人力CIの準備が出来上がり、ama君がindex修正をマージして最初のベンチ。この時点で1時間ぐらいで5000点ぐらいだった。
去年と違ってタコス君がインフラに専念する感じで分業して、dbとかnginxの準備もできてたので、かなりスムーズだった。

初期initにdbのtableの再構築内の最初ちょっと気づかなかったのをスッと直したぐらい。



ここからはひたすら改善。

amaくんが N+1っぽいところのsql直したり、僕が全取得してselectしてるところを直したり。

12:00ぐらいで色々直して、この時点で10248点で 12 位になった。嬉しい。

このあと3000点しか上がらないとは思いもしなかった。。





この辺でやっと当日マニュアルを真面目に読んで、ドメイン的な側面を理解し始めたりしてた。投げ銭システムらしい。
昼過ぎからはもうちょいシビアに得点狙おうということで、大きい改善点を探した。

とりあえずインスタンスを1台しか使ってなかったので、分散させようということに。
2号機をdb専用にするタスクが、色々あってくる担当になった。結構手こずってしまった。
dbに新しいユーザー作って、port開けて1号機から繋げるの確認したらenvの値書き換えるだけなんだけど1時間ぐらいかかっちゃった。なんか微妙に躓く。オンプレ不慣れすぎて不甲斐ない。

このあと、powerDNSってやつ使ってる別のテーブルがあるのにも気づいた。全然仕組みわかってなくて、とりあえずこれも分散させたらいいんじゃね?とか言ってこれのdbの向き先を3号機にした。
ベンチ動かしたらエラーになって、戻すか、と思って戻しても。。直らなくなってしまった。。。

ここでかなりハマってしまった。。

結局当日マニュアルを読み直してリセットできるコマンドを見つけて解決するけど、これで1時間ぐらい潰しちゃった気がする。
https://gist.github.com/kazeburo/bccc2d2b2b9dc307b5640ae855f3e0bf#dns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6


治ったものの、dns触るのはちょっと知識不足すぎるということで一旦やめようという感じに。
残りはアプリケーションの修正をしていく。


残り3時間ぐらいで、点数差も開いてきて、dns分離しないとやっぱり厳しそう?みたいな流れになってきた。
dnsの向き先変えてリセット試してもエラーになるから、なんか違うんだろうなと思ってたところで、pdns用のconfってenv.shと別にあるんじゃね?ということにやっと気づく。
etcかどっかの下を漁って、pdns系の設定値を見つける。

https://hobby.sugio-garden.com/ja/node/3 のブログを見つつ、gmysql-hostを変えればいいんやな、うんうん。と設定を足し込むも、設定が変わらない。。
再起動のやり方が悪いかな、と思い色々試すも、全然うまくいかない。
30分ぐらいして、設定ファイルのさらに一個下のディレクトリに、gmysql-hostだけ上書きするconfigがあった。気づかなかった。。。。

これも直して何とか分散できた。
ただdnsのdbの向き先変えただけなのと、pdnsの設定とか全然変えてなかったので、そんなに点数上がらなかった。
13000点ぐらいフィニッシュ。。。


僕がdbとdnsやってる間二人も色々改善してくれてたけど、午後からはちょっとうまくヒットしなかった感がある。残念。上振れしてたら20000点ぐらい行ったかなって感じもあった。8時間の動き方が難しい。。

ってな感じで、フワーっと終わったisuconだったが、去年よりは本質的な部分に取り組めた気がするので、まあよかった。楽しかった。初手の動き出しはかなり洗練された気がする。



アプリケーションを読むのは速度も上がるし全体掴むのも業務で慣れてはくるけど、インフラの全体理解を爆速でやるのは全然だなーと感じさせられてしまった。dnsとかわかってないのも、普段から触ってない領域に弱すぎるって感じで悲しい。僕が普段やってることはアプリケーション領域だけなんだなあとわからされた。


amanekoくんとソース読みつつ、修正内容を二人で把握しつつ、分担して直してるときは楽しかった。ハッカソンっぽい。


タコス君のintellijが謎すぎて、必要なimportも削除してPR出してきてて最悪だった、ウケてた。





今の業務で使う技術力、みたいなのはそこそこついてるかなって感覚が自分の中であったけど、ピュアな技術力は全然だなとISUCONで改めて感じた。コンフォートゾーンにいると気づけないねえ。




といった感じで雑な参加記でした。運営の皆様ありがとうございました。来年も出たいね。おしまい。