社内ISUCONには何度か参加したことあるものの、社外の人も参加するISUCONには初めての参加でした。 チーム名は「chatzmers」で、弊社の2013年新卒同期の @m0t0k1ch1 と @rg_gs と 僕 で出場し、最終スコア 21242 で予選総合4位で通過しました。
無事予選突破して、先輩エンジニアの方々と本選で戦えるのが本当に嬉しいです!
チームメンバーブログ
チームメンバーのブログエントリーです。 自分のエントリーより、詳細に丁寧に書かれているのであわせて読んでいただけたら幸いです。
- m0t0k1ch1 ISUCON5 と chatzmers - 予選4位通過編
- rg_gs ISUCON5 総合4位で予選突破!
前日までにやったこと
ISUCON予選前までに、メンバーで集まってISUCON4の問題にGCPを使って挑戦することをしていました。 主な目的としては、実際にやってみてGCPに慣れることと、 予選で使うであろうミドルウェアまわりの設定の方法やツール等の使い方を予習することでした。
僕は2回あるうちの1回しか練習に参加できなかったので、前準備はあまり力に慣れなかったけど @rg_gsが予選で使うであろう自動デプロイのツールつくったり、supervisorの設定をおぼえる、リポジトリつくるなどし、 @m0t0k1ch1がGazelleやkataribe, pt-query-digestを使ってみたりなどをやってくれて頼もしかったです。 詳しくは2人が、ブログ書いたらこちらにもリンクをはります。
当日やったこと
僕らが選択した言語はみんな大好きPerlでした。 そして最初に
- alp, pt-query-digest etcを使って遅いと思われる箇所を洗い出す (@m0t0k1ch1)
- systemdの設定 (@rg_gs)
- アプリのコードを完璧に理解する(自分)
をやってみて、「あーボドルネックだらけだな」ってなったので、
おもに重かった、/
と/friends
、/footprints
、/entries
を
すごいことをやろうとせず地道に直そうという方針で対応していきました。
主に自分がやった修正は一番多く叩かれてその上遅かった/
のまわりのコードの 改修で、
自分がした修正で効いたーってなったのは以下でした。
- friendsは数しか必要ないのでcountするようにする
- LIMIT 1000で取ってきている処理をよしなに直す
- entriesはページ上でcontentを使ってないので、titleだけ取ってくるようにする
これらの修正でスコアが伸びて1位に躍り出て「これがISUCONか」と鳥肌たちつつ、わいわいしてました。
トップきたー!!!!
— MacoTasu (@Maco_Tasu) September 27, 2015
(その後抜かれたのは言うまでもないです)
他にもN+1問題を直してみたりといったアプローチを入れてみたものの、 クエリの実行計画かわって逆に遅くなったりなどあり思うように伸びず。 少し直してはベンチ回して検証して、良かったらmasterへmergeということを地道にしていました。
@m0t0k1ch1は事前準備の知識を活かしながら
- InnoDB => MyISAM変更
- Gazelleを使うようにする
- userのデータはプロセスキャッシュに乗せてN+1の箇所でクエリが飛ばないようにする
- friendsはoneだけつかって取ってくるようにする
- Nginxで静的ファイルを返すようにする
- etc...
をやっていました。 Gazelleに変えた変更や、MyISAMに変えた変更でだいぶスコア伸びててさすがって感じでした。 (事前準備のかいあってシュッと変更していた@m0t0k1ch1もすごかった)
@rg_gsは主に
- 自動デプロイの設定
- footprintsで変なGroupByをしているクエリを適切にindexはりつつ直す
- entryのコメントの数をRedisを使ってうまくできないかチャレンジ
などをしてくれていました。commit&pushしたら自動でデプロイしてくれるなどの地盤作りがあったおかげで 本当に快適ベンチ回すことができました。最高です。 また、entryのcommentの数をRedisに入れるのは地味に苦戦して、予選当日はつらーってなってたけど 先程@fujiwaraさんのisucon予選のエントリーブログを見て aofを使ってて、そういう手があるのかーってなりました。さすがです...orz
それぞれがやったことベースでまとめましたが、時系列順にどう対応していったかはきっと他のチームメンバーがまとめてくれるはず...。
あと書き忘れありそう
やり残したこと
- entryのbodyがだいぶ大きいので、 gzip圧縮したら結構スコアが上がったんじゃないだろうか(予選中は思いつかなかった)
- CPUを使い切ることができなかったけど、ボトルネックは他にどこにあったのか
この2つができなかったので、またベンチかけれるなら挑戦してみたいです。
最後に
今回一緒のチームで参加した同期は、入社した時に社内ISUCONで皆FAILをするというつらいおもいを経験していたこともあり、 事前準備で予習と対策をたて、予選に臨んだことが結果としていい方向に事が運んだかなといった感じでした。 また予選前に、弊社の先輩エンジニアの@tkuchikiさんがalpというLTSVで吐かれたログをよしなに集計するツールを作っていらっしゃったので、そちらを使わせていただきシュッと遅いAPIを手軽に探ることが出来ました。ありがとうございます!
最後にこんなにやっていて楽しいと思える問題と、それに挑戦する機会をくださった運営の皆様、本当にありがとうございました!お疲れ様でした!
本選も頑張ります🙏