ishikawa_pro's memorandum

若手webエンジニアの備忘録です.

Swift Node.js Docker AWS etc...色々やります。

ISUCON9予選に参加しました!

お久しぶりです。
ISUCON9予選に参加したので、参加するまでのことや当日やったことを残します。

ISUCONとは

こちらを参照してください。

isucon.net

参加のきっかけ

5月頃に僕ともう一人の同期でISUCONに出たいね、という話になって他の同期も誘って、参加することになりました。

メンバー

今回は会社の新卒同期3人でチームを組んで出場しました。
(僕ら以外にも、新卒チームがもう1チーム参加しました。)

当日までに勉強したこと

会社の同期で、毎週 月・火・水の3日間は1時間早く出社して、過去問を解くというチャンレンジを6月頃からしていました。
また、社内でISUCON合宿という1日中ISUCONの過去問をやる合宿までやらせて頂きました。
会社と企画してくれた同期に感謝です 🙏

www.cam-inc.co.jp

当日朝の様子

当日やったこと

言語は、僕がGoを勉強してみたかったので6月下旬頃からGoの勉強をしつつ過去問を解いていて、当日もGoでやりきりました。(普段はNode.js書いてます)

役割分担は、
ko1103: リーダー & 実装
cotsupa: DB周り
id:ishikawa-pro: リポジトリ管理・ログ収集・実装

という感じでした。

時間に沿ってやったこと書いていきます。

10:00 ~ 11:00

リーダーがインスタンス立てたり、僕がGitHubのprivateリポジトリでコードを管理できるようにしたりしてました。

11:00 ~ 11:45

slow query出すようにしたり、alpaccess logを分析できるようにNginxの設定を変えたりしてました。
僕は、ちょっとだけNginxの設定に時間がかかってしまいましたが、他のチームメンバーも含めこの辺の作業は練習しただけあって、比較的すんなりいきました。

11:45 ~ 12:30

slow queyとかalpの吐いたlogを見つつどの辺が自分たちで修正できそうか探し始めました。
ko1103がUserテーブルからデータをとる部分で、カラム指定してちょっとだけスコア上げてくれました。
現時点で 2010イスコインでした
github.com

12:30 ~ 13:00

お昼休憩 f:id:ishikawa_pro:20190908222518j:plain 美味しかったです 😋

13:00 ~ 16:00

インスタンス3台使えたので、それぞれ別のインスタンスで作業して、よかったやつを採用しようという方針になりました。

僕は、itemsに紐付くcategoryを取ってくる所がN+1になっているのに気が付いたので、そこを解消することにしました。 具体的には、 getNewItemsgetNewCategoryItems の2つを直しました。

github.com

github.com

かなり時間をかけてしまったので、Goでの実装力の無さを痛感しました。
でも、categoryを取り出すクエリの呼び出し数をかなり減らせたのでよかったです。
before

Count: 100422  Time=0.00s (15s)  Lock=0.00s (2s)  Rows=1.0 (100422), isucari[isucari]@localhost
  SELECT * FROM `categories` WHERE `id` = N

after

Count: 25332  Time=0.00s (3s)  Lock=0.00s (0s)  Rows=1.0 (25332), isucari[isucari]@localhost
  SELECT * FROM `categories` WHERE `id` = N

(そもそもアプリのインメモリに載せればよかったのは内緒 🤫)
この修正で、2,310 イスコイン。
他メンバーはDB周りで色々試みていたようです。

16:00 ~ 18:00

UserSimpleの取得にも N+1があったので、categoryと同様の手法で解消しようと試んでいましたが力及ばずタイムアウトでした。
他メンバーは引き続きDB周りのチューニングを試んでいましたが ko1103 が原因不明の 2,410 イスコインを一回だけだして、結局それが最高記録で終了となりました。

感想

初のISUCON予選に参加しましたが、実力の無さを痛感しました。
特にGoはまだまだ実力不足で、やりたいことをすぐに実装できなかったのは痛かったです。
ただ、当日までに練習したことは確実に活かすことができたと思うので、コツコツ練習してきてよかったです。
会社の研修でやったISUCONの過去問では、全くスコアが上がらなかったですが、今回は自分の修正でちょっとだけスコアを上げることができたので、成長を実感することができました!

一緒に参加してくれた同期やISUCON運営の方々、ありがとうございました!!!
来年もあればリベンジします 💪