同僚のishinoと2名でisucon5に参加してきました。
僕はISUCON1の時から参加してるので、今のところ皆勤賞です。
毎年楽しみにしているイベントで今年もすごく楽しかったです。
運営の皆さま、本当にありがとうございました。
結果はスコア、13094。使用言語はPHPです。
しかし本戦出場ならず、、、
「ISUCON5 本選出場者決定のお知らせ」
http://isucon.net/archives/45532743.html
残念。おしかったな~
事前準備
今回、いつも一緒に参加しているスーパープログラマがいなかったので
いつも丸投げしていたアプリ周りの修正に不安を感じていました。
ですので普段業務で一番使っている「PHPを使う」という事にしました。
使った事のなかったGCPの練習もかねて、
Isucon4の問題のイメージが提供されていましたので、起動して
PHP実装を眺めてたりしました。
GCP、すごく使いやすいのですが、インスタンスへのSSHログインにGCP専用のツールみたいなのが必要なのが嫌で
練習中も本番中も ParmitRootLoginはYesだったりパスワード認証許可したりして
ターミナルから直接SSHできるようにしてました。
当日
前日に会社で「キャンプ」が行われて、深夜まで雑談したりで疲れ切ったのちの参加。
ほんと直前までキャンプ場にいましてバタバタしてました。
ですが、アウトドアでIT関連の事から離れた状態でしたので、逆にすっきりした気持ちで参加できたかも。
本戦開始
イメージデータの共有がきたので、ひとまずインスタンスを起動し、
何も触ってない状態でベンチマークをリクエストしました。
が!ベンチが通らない!!(Fail)
え。初期で通らない実装なの?
みたいな感じでプチパニックになりました。
このとき、ベンチからのリクエストが届いてるか、などを確認すればよかったのですが、
GCPの設定がおかしいのか?と無駄に時間を使ってしまいました。
初期で通ってた人もいたようですが、僕らは一度も通らなかったのでいまだに原因ふめい。なんでだろう。
ですが、ログインがめちゃくちゃ重かったり、スコアが80とかから300くらいの人もいたので、
「きっと初期の実装の時点で重すぎてベンチ通らないに違いない」、と結論付けて
PHPへの切り替え作業をしました
systemd
もちろん使った事なかったので、PHPへの切り替えでも時間がかかりました。
PHPのnginx.confは静的ファイルの配信があらかじめnginxからになっててらっくちーん。
もちろんPHPに変えてもいまだベンチは通らない。
でも画面は表示されているのでとりあえず、チューニング開始
チューニング開始
ひとまず、ベンチが通らないと心が不安でいっぱいだったので
簡単に修正できる部分をとりあえずやってみましょう、となりました。
ささっと見てログインの部分でハッシュにしたりしてるのが簡単そうだったので、
パスワード部分に平文を入れちゃってベンチ。
これでようやくスコアが出るようになってた気がします。
ひたすらSQLを書く
・N+1問題
・commentsテーブルにAlterでカラム追加。(30分以上かかった)
・relationsのデータが必ず2つ1組みで入ってたのでselectをoneだけにする
・ORDER BYのcreated_atをidにしてCreated_atのindex消す
・footprintsのgroup byの部分を修正
ほっとんどの時間を/のSQL改修に充てててました。
ミドルウェアの設定はAlterの実行中に設定などを確認、修正をしたくらいです。
(若干my.cnfにははまりました)
結局、ボトルネックがmysqlで改修できる部分もまだまだ残したままフィニッシュ
となりました。
全体的に
今回のお題がほんとに楽しく感じました。
・DBのデータが非常に多く複雑なので全メモリ化は実質不可能。
・ログイン処理があり、ログインによって表示される情報が異なるので、フロント側でのキャッシュは難しい(あまりキャッシュヒットしなさそう)
・実際にありがちな「小規模なときはよかったけど、サービスが成長してから問題が出始めた」みたいなリアルな感じ
というところが特に楽しかったです。
あとは例年どうり、新しい事をいろいろ知れてよかったです。
systemdは見ないふりしてたんですが、やっぱり少し触ると、「いいなこれ」ってなりますね。
今年も楽しかったです。
ありがとうございました!