タイトル通りですが、今回初めてISUCONに参加をしました!ISUCONの存在は数年前から知っていましたが、実際に参加したのは今回が初めてです。会社の同期と3人チームで参加をしました。結果として惨敗でしたが、今回初めてISUCONを経験できたのでその記録としてブログに残そうと思います。 (公式も「ブログを書くまでがISUCON予選です!」と言っているのもありブログを書きました! )
ISUCONとは
下記のQiitaの記事を読んでもらえば詳細はわかると思いますが、ISUCON(Iikanjini Speed Up Contest)と言い、株式会社LINEが主催のコンテストです。1人〜3人のチームで参加を行うコンテストなんですが、なんと優勝チームには賞金100万円がもらえます!夢がありますね!
基本的にアプリケーションをチューニングアップしてスコアを上げて一番高いスコアを出した人が優勝するコンテストです。公式サイトなどもあるのでそちらを見ていただければ詳しくわかるかと思います。
本番までにしたこと
会社の研修で一度ISHOCONというものに取り組んだことがあるぐらいしかチューニングなどを行ったことがなく、初めてのISUCONということで右も左もわからない状態だったのでISUCONの対策や過去問などをググって探しました。(ISHOCONについては下記のリンク先で見てみてください)
予選の参加日程を8日(日)にしていたので、前日の土曜日に慌てて準備しました(^_^;) 完全に準備不足です!!!
言語の選定
ISUCONではアプリケーションの言語をいくつか選べるようになっています。今回はGo言語を選んで参加しました。Go言語を選んだ理由として、研修で少し触ったことがある、チームメンバーにGoの開発経験者がいる、メンバー全員がGo言語を読めるということでGo言語にしました。
開発環境構築をどうするか
ISUCONはそれぞれのチームにクラウドのリソースが与えられ、そのリソース上で開発を行います。なので、そのクラウド上のアプリケーションを直接いじって開発するのも良いのですが基本的に自分たちのローカル環境で開発出来るように準備を整えるのが定石みたいです。自分たちはgitでソースコードの管理を行い、ブランチを切りながら開発を行う方針で取り組んでいました。
そのためのスニペットなどがいろんなブログやサイトに載せられているので探してみると良いと思います。
ツールの選定
ISHOCONに取り組んだときもそうですが、アプリケーションのチューニングを行うときにツールがあると非常に便利です。いろんなツールが世の中にはあるのでどのツールを使うのか、実際にツールを導入してどのように使っていくのかを調べたり試したりして選定&設定を行いました。
自分たちが今回使用したツールは以下のものです。
他にもたくさんのツールがありますが、準備に時間が割けなかったためこれらのツールを確実に使っていこう!ということになりました。
役割の分担
ISUCONでは実際のサービスなどを想定したアプリケーションをチューニングするのでインフラをチューニングしたりアプリケーションをチューニングしたり、DBをチューニングしたり何でもできます。なので、自分たちはインフラ担当1人、アプリケーション担当2人の構成で本番に臨みました。(所属する会社のCTOからISUCONの勉強会があり、そのお話でおすすめ構成と言われていたのでそのまま採用しました!)
ISUCON予選当日
ISUCON当日になり、実際にどんなことに取り組んだのか簡単にまとめました。
予選マニュアルをよく読む
ISUCONの開始時間になると予選マニュアルが渡されます。そのマニュアルの中にISUCONで必要な情報が全て入っているので、まずはそれをしっかりとチームで読むことから始めました。
アプリケーションと開発環境の構築
その次に今回のアプリケーションの構築方法を元に実際にクラウド上にアプリケーションの構築をインフラ担当のメンバーが行いました。その間も他のメンバーはマニュアルを読むことに徹していました。マニュアルを読み終わったらGitなどの管理を導入して開発環境の構築を行いました。
ツールの導入&設定
実際にアプリケーションの構築を行ったら、それぞれ解析ツールの導入と設定を行いました。基本的にそのツールからどんなところがチューニングできそうかメンバーで検討しながら開発に取り組んでいきました。処理が一番重いリクエストを探したり、スコアにつながるチューニングで一番効果がありそうなロジックを確認したり、スロークエリを探したり様々なことを導入したツールで確認していきました。
実際に取り組んだチューニング
ある程度準備が整ったらチューニングに取り組みました。
Nginxの設定
Nginxがサーバーとして扱われていたのでそのチューニングです。静的ファイルのキャッシュやHTTP2対応などの設定をしていきました。調整の結果としてはスコア全然変わりませんでした(笑)
DBのチューニング
スロークエリを探したりして、DBのインデックスを追加したり、実際に叩かれているSQL文の調査を変更などを行っていきました。自分が変更を行っていましたが、インデックスを追加することでスコアに反映されなくてもスロークエリが解消できたのは良かったです。
アプリケーションのロジック変更
アクセス解析などを行うと明らかに遅い処理のロジックがあったのでそのロジックの変更にメンバーが取り組んでくれました。ロジックの悪いところをどのように変更を行えばパフォーマンスが良くなるのかを考えて実装するのは難しいなと思いました。
キャッシュの設定
こちらの情報を元に、メンバーがインメモリキャッシュの実装をGoで作成してくれました。これが少しスコアを伸ばしてくれて300ぐらいスコアが伸びました。
ISUCONの結果
自分たちのチームの最高スコアとしては2800ぐらいのスコアでした。予選通過のスコアが約1万なので、半分にも届かせることができませんでした…。ISUCONはちゃんと準備をして取り組むものだということを身を持って感じました。もう少しスコアを伸ばせるんじゃないかと思ってたので、自分の能力不足を痛感しました。
他にもやれたこと
今回はアプリケーションのチューニングに集中してしまったので、インフラの方の設定が全然できませんでした。インスタンスの台数を増やしたり、スケール調整したりといろんなことができたと思いますが、目の前のチューニングに集中しすぎてしまいました。あとから考えると、もっと色んな改善ができたんじゃないかなと思います。
まとめ
初めてのISUCON参加で全然スコアを変えることはできませんでしたが、チームメンバーと楽しくコンテストに取り組めたことは良い思い出にもなりました。普段の開発とは視点の違った開発だったので自分の知らない知識やツールなどを知ることができてよかったです。次回のISUCONにも参加して、まずは予選通過を目標に取り組んでいきたいなと思います!
一緒に参加してくれたチームの2人は本当にありがとうございました!楽しかったです!
参考にさせていただいたサイト
下記のリンク先は大変参考にさせていただきました。ありがとうございます!
mercari_go_isucon.md · GitHub
会場 · shibayu36/isucon8q Wiki · GitHub
ISUCON予選突破を支えたオペレーション技術 - ゆううきブログ