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