【ISUCON】ISUCON9予選に出場しました

昨年に続き今年もISUCONに出場しましたので記事にしたいと思います。

↓昨年の記事はこちらです

【ISUCON】ISUCON8予選に参加しました

公式リンク

http://isucon.net/archives/53570241.html

参加結果は?

今年も残念ながら予選敗退となりました。

ついでに、最終スコアは0点でした…。

使用言語

昨年はGolangを選択しましたが、今年はPythonを選択しました。昨年とメンバーが違うかつメンバー全員が使用したことある言語がPythonだったため、Pythonを選択することになりました。

ただし、全員少し使用したことがあるというレベルだったため、正直Golangを選択していても特に変わらなかったかもしれません。Golangと比べるとどうしてもPythonは実行速度が遅くなりがちなので…。(場合によりますが)

メンバー構成

↑に記載したように今年のメンバー構成は昨年とは違います。

①私

社会人3年目プログラマー

プログラミング経験:入社してからなので2年と半年弱くらい

役割:アプリ担当

②ひらなみ(本名じゃないよ)

社会人3年目プログラマー

プログラミング経験:同じく入社してから

新卒の同期です。転職し今は別の会社ですが、週1回くらいカフェで一緒にプログラミングしています。

役割:インフラ担当

③パイセン

社会人3年目プログラマー

プログラミング経験:大学の研究室時代からプログラミングしていたらしい

同じく新卒同期、今も同じ会社。ひらなみ同様で時々カフェで一緒にプログラミングしています。頭いい。

役割:アプリ担当

当日までの準備は?

全く対策を行っていなかった昨年とは違い、今年は多少は対策を行いました。主に行ったのは「過去問を解いてみる!」です。まぁ、普通ですね。

解いてみた過去問は以下です。

  • ISUCON8(昨年の問題なので多少中身は知っている)
  • ISUCON7
  • ISUCON6

あとは基本的なISUCONの進め方を調べて、パフォーマンス解析ツールなどの導入方法と過去問を解きながら、ツールを使ってみていました。

各ツールの導入方法などは別の記事にて記載したいと思います。

当日の実績

当日は貸会議室を借りました。10時から開始だったため、少し前の9時半から会場入りし、全員で準備をしました。(準備といっても飲み物の買い出しとかですが)

大会開始!

そして10時をむかえて開始。Alibabaのアカウントは私のものを使用することになっていたので、はじめ私が提供されたイメージを元にインスタンスを作成に取り掛かり、他のメンバーが大会のレギュレーションやアプリ仕様を確認することになりました。

インスタンス作成が終わったら私はそのまま今回のソースコードをGitへプッシュし、インフラ担当のひらなみがMySQLの初期データをDump。ここまではいい感じで動けていましたね。

アプリを適当に確認すると「イスカリ」という名前!今回の問題提供がメルカリさんなので、フリーマーケットアプリだったよう。アプリの概要は椅子専門のフリマアプリとのこと。(どこに需要が…)

アクシデントが…

そしては私はローカル開発環境構築に、パイセンは画面とソースからアプリの分析に入りました。しかし、少し問題が…。ローカル環境構築が上手くいかなかった…。ローカル開発構築にはPythonの仮想環境Anacondaを使用していたのですが、なぜか一部のパッケージがインストールできず、ローカル開発環境構築に失敗しました…。(ちなみに、大会終了後に自宅PCにて構築してみるとAnacondaで普通にパッケージインストールできました…)

アクシデントにより私はローカル開発環境構築を断念、他のメンバーも同じくローカル開発環境構築を試みますが、同じく上手くいきませんでした。結果、サーバ動確という苦行をすることに…、デバッグもできないし最悪でしたね。(実は昨年もサーバ動確しました)

ソースの修正を試みるも…

この時点で開始から1時間半くらいが経過し、私はだいぶ焦りました。その後、N+1問題の解決などもやってみましたが、上手くいかない箇所が、デバッグできないとなかなかきつかったです…。

その間、ひらなみは解析ツールのインストールなどを完了し、アプリ側の修正に入りました。サーバの並列化などもしたかったのですが、これは後半にすることにしました。

そのまま、じりじり時間が過ぎていきました。

仕様の確認って大事

開始から4時間が経過したくらいでしょうか。パイセンがアプリ仕様から「キャンペーンの設定値」なるものを発見しました。仕様によるとキャンペーンの設定値を変えると顧客が殺到し(リクエストが増え)、スコアが伸びやすくなるとのことでした。

試しに設定値を変えてみると、スコアが一気に倍くらいになり、さらにN+1問題の解決なども合わさり3倍くらいのスコアになりました。

ここからは全く進展しませんでした…。じわじわ時間が過ぎて残り時間が1時間ほど。

サーバの並列化を試みるも…

終了時刻1時間前になってサーバ並列化に乗り出しました。元々余裕をもって2時間くらい前にとりかかるつもりだったのが、じりじり遅れてしまいました。並列化はひらなみに任せ、私とパイセンはひたすらアプリの改善点を確認しました

結果…、サーバ並列化に失敗し、アプリが正常に動作しなくなりました。そして、そのまま終了しました…。

惨敗…

何が悪かったか

自分的に悪かったと思う点を以下の二つ。二つとも明らかですけどね。

  1. 準備不足
  2. 大会レギュレーションの確認不足

1.準備不足

言わずもがな…。使用する言語の使い方すら曖昧な状態で環境構築から手間取っていたのが良くないですよね…。ローカル環境での動作確認ができたとすれば、もう少し良い結果になっていたかもしれません。

また、パフォーマンス計測ツールや解析方法と分析方法を良く分からないまま進めたのも良くなかったです。結果的にボトルネックの分析自体は間違ってなかったようですが、運が良かっただけかもしれないですね。

2.大会レギュレーションの確認不足

当日に公開される大会レギュレーションをもっとしっかり確認する必要がありました。今回は運よくパイセンがキャンペーンという仕様があることを見つけてくれましたが、それも開始してから4時間ほどでしたので、もっと早く見つけていればと思ったりします。

私の友人が同じくISUCON9に出場したのですが、キャンペーンの仕様を把握していなかったとのことです。その状態で7000点くらいスコアを出したとのことなので、キャンペーンを利用できていれば、もしかしたら本戦出場もできていたかもです。

業務でももちろんですが、仕様の確認は大事!!

最後に

結果は惨敗でしたが、私としては出場して良かったと思っています。最近、プログラミングに詳しくなり始めて、仕事でも上手く能力を出せるようになってきて少し気持ちが浮ついていたので、まだまだ知識と経験が浅いことを痛感しました。

来年はさらに成果を上げられるように準備したいと思います。

 

さいごに大会終了して大会の内容が公開OKになったので、当日作業したブランチを公開リポジトリにしました。

https://github.com/i-shinya/isucon9-pre.git

再度見てみると全然コミットしていない…。