れみゅーぶろぐ

某(元)高専生が多彩なジャンルにわたって書くブログ。非常に真面目なブログであると自負しております(要出典)。Twitter:@_remew_

console.log('ISUCONに参加して予選敗退しました')

はじめに

10月22日にISUCON7に「console.log」というチーム名で参加しました。 チームのメンバーは

の2名でした

ちなみにISUCONというのは、詳しくはこちらを見ていただきたいのですが、運営が用意したWebアプリケーションの速度改善を行う大会です。

Iikanjini Speed Up CONtest(いいかんじにスピードアップコンテスト)

略して「ISUCON」です。

本当は10月21日参加の予定だったのですが、運営側のトラブルで次の日に移動したいチームはしても良いということになったので、台風やら友人とのご飯の予定やらを鑑みて22日に移動しました。

前日までにやったこと

椅子に座っていました(椅子コンなので)

あとは使用する言語をJavaScript(Node.js)に決めました。理由は僕が参考実装のある言語の中でJavaScriptしか書けないからです。

当日やったこと

とりあえずベンチマークを動かす

初期スコアは0だと思っていました。なのでこの時点で既に正の整数点が叩きだされてもう優勝した気分でした(嘘です)

初期スコア: 6293

sshの設定

やるだけ(ただし事前に鍵の作成をしていなかったので余計な時間がかかった(ぽんこつ))

使用実装をNode.jsに切り替え

予定通り、Node実装に切り替えました。

nvmをインストール

サーバーに置いてあったNode.jsが確か6.xでした。

async/awaitを使いたかったので最新版にするためにnvmをインストールして、Node.js v8.x.x(最新版)をインストールしました。

pm2でデーモン化&自動起動設定

ここでだいぶハマってつらい気持ちになりました。

pm2というNode.jsアプリをデーモン化したり、自動起動設定ができたりするツールがあるのですが、アプリケーションへの環境変数の渡し方でハマってアプリがDBに接続できなくなってその解決に時間がそこそこ取られてしまいました…

メモによると1時間くらい潰してしまったみたいです。

なんかここまでで1時間半〜2時間くらい過ぎていて絶望しかなかった

アイコンを静的ファイル化

アプリケーション眺めてたらアイコンをDBに保存したりアプリから返していて流石にこれはISUCON素人の僕でもわかる改善できそうな点だったので、さっさとnginxから返すようにしました(ただしキャッシュとかはうまくできていなかった)

さっさと、とか言いながら割と時間かかっていて実装力のNASAを感じてつらいきもちになっていた

ER図を表示したかった

DataGripという、JetBrains社のデータベース管理ソフト(?)で簡易的なER図を表示しようと思ったのですが、接続設定に失敗しまくってfail2banにはじき出されたりして泣いていました。

結局、MySQLの外部からの接続を許可する設定だかなんだかを数文字修正すればいいだけだったのに、かなり時間取られてほんとにアホかな?と思ったなどした。あとfail2banをbanした

しんでいた

20時前まで、「もう…どうすればいいのかわからん…」と言いながら何もせず椅子に座っていました(椅子CONなので)

その間、りんちゃんはN+1問題を解決しようとしてうんうん唸っていました。残念ながら解決できず、最終的には2人で椅子に座っていました。

DBにインデックスを貼る

突然もぞもぞと動き出してDataGripでぽちぽちして適当なカラムにインデックスを貼りました。

一応、アプリケーションでwhere句に使われているが、Primaryキーじゃなかったりするカラムに貼ったので、効果はあったみたいでスコアが伸びました

最後の悪足掻き

りんちゃんと一緒にNginxやMySQLの設定ファイルをいじって悪足掻きをしました。

ベンチマーク通すたびに1万点くらい前後していて、祈りながら無限回ベンチマーク通して、チーム内本日最高の39086点を叩きだして2人で騒いだのですが、調子に乗った僕が「これもっかい通したら4万ワンチャンあるのでは…?」と寝言を言ってエンキューしたら27000点くらいになってしかもあと数分で終了!

ギリギリ最後に神頼みでベンチマークに投げたらそれが最終スコアになって、結果は30095点でした。

再起動確認は最初の方にやっておいたので大丈夫だと高をくくっていたらやっぱり大丈夫でした。

反省とか感想とか

とにかくあらゆるオペレーションでつまづいていたので、事前準備が足りなさすぎた。sshの鍵くらい事前に作れよってあとから思いました。

まぁぶっちゃけ「つまづいた」って言ってた部分がスムーズに言っても、どうやら今回の問題の鍵であったCache-Control: publicにはそもそも思い至りすらしなかったと思うので、基礎知識も足りていないことを実感。

個人的にはIconsを静的ファイルにして配信できたので、一番最初のハードル(?)は超えられたのかなという気がしていますがまぁそれも測定した結果ではなく感覚でやったものなのでけわしい。

しかし、Iconsを静的ファイルにしてDBに保存するのをやめたせいで、せっかくの3台構成が活かせず、フロントエンドが1台だけになってしまいました。他のチームのWrite upを見ると、頭良い方法がたくさん挙がっていて、各位頭良いなぁと思って鬱になりました(なっていない)

推測するな、計測せよ

これが全然できてませんでした。

来年また開催されるとしたら、参加したいなぁと思っています。次に出場するときは、今年の反省を活かせるようにがんばります…

来年の自分へ

  • sshの鍵は絶対事前に用意しろ、大会始まってからssh-keygenとか遅すぎ
  • nginx.confとかmy.cnfとかも事前に用意しておいたほうがいい
  • アプリの仕様をちゃんと理解しよう
  • ボトルネックの計測方法勉強して
  • SQL勉強して
  • ちゃんとチームメンバー(りんちゃん)とおはなしして

最後に一つ

async/awaitはいいぞ