日々精進

aikoと旅行とプログラミング

ハンバーグは中身が少し赤い程度が美味しい(ISUCON7予選参加記)

f:id:bath_poo:20171023215708j:plain

ISUCON7の予選に参加してきた.

isucon.net

ISUCONとは

お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。

というコンテスト. レギュレーションの中ならなんでもOKなコンテストである. 今回はそのISUCON7に参加した記録を残しておきたいと思う.

メンバー

チーム名は「中身が少し赤い程度王国(学生)」とした. 言うまでもないと思うが, 「炭焼きレストランさわやか」に行くと聞かれる「中身が少し赤い程度が一番美味しく召し上がれますがいかがですか?」の一文から引用した. メンバーは次の三人.

  • パイセン
    寿司屋では茶碗蒸しを食べる.ローヤルさわやかが好き. げんこつハンバーグは食べたことがない.
  • かみ(このブログを書いている人)
    ISUCON参加言い出しっぺ. aikoとサッカーとげんこつハンバーグが好き.
  • ちゃんきた
    デグーを飼っている. げんこつハンバーグが好き.

ちなみにデグーはこれ. 残念ながら予選にはいなかった. f:id:bath_poo:20171023220410j:plain

開始前

全員車で拾ってもらい, とりあえずお昼ごはんを買って会場に向かう. 会場に向かう途中で開始時間が13時に延期される(台数多いし仕方ない、運営がんばれという気持ちでいっぱいだった)

会場に到着. 今回借りたのはここ→ コワーキングスペース - 福井県産業情報センター
f:id:bath_poo:20171023221055j:plain 会場のセッティングをする. f:id:bath_poo:20171023221237j:plain 無線LAN完備, 壁一面のホワイトボード, スクリーン, プロジェクター, 液晶, AM9:00~PM9:00まで利用可能で無料という学生には優しい会場だった. 来年もここでやりたい. f:id:bath_poo:20171023221256j:plain 開始までご飯を食べたり, d(^_^o)を書いたりして時間を過ごした. このときにもまだセッティングは続いていて, 先輩がひたすらプリンター接続チャレンジをするも失敗していた. 結果あまりなくても困らなかった. その後は始まるまでDiscordのランダムチャンネルをひたすら眺めていたら, お酒やピザをデプロイした人で溢れていた. こっちもピザを頼みたい. ノリが完全にTwitterで面白かった.

やったこと

メンバー3人があまりにも初心者 and 学会や中間発表でなかなか練習の時間が取れないという中だったので, とりあえず今年は雰囲気をつかむ, 来年へつなげるような気持ちで頑張った. 強い気持ちでRuby実装をチューニングすることに決めた. 以下に書いてあることは間違っている可能性も大なので, 優しく見守っていてほしい.

諸々のインストール

  • emacs, vim
  • alp
  • rack-lineprof
  • pt-query-digest
  • netdata
  • htop このあたりを事前に用意していたスクリプトで一括インストール.

githubにえいっ

githubにえいってやりました. (やってもらいました)

静的ファイルをnginxから返す

よくあるやつ. cssやjsなどはnginxで高速に返してしまおうという試み.

location ~ ^/(css|js|favicon.ico) {
  root /home/isucon/isubata/webapp/public;
}

しかしコレが有効になってたりならなかったりしていたような…

nginxのログをLTSVにする.

alpでアクセスログ見るために, nginxのログをltsv形式に変更する.

  log_format ltsv "time:$time_local"
    "\thost:$remote_addr"
    "\tforwardedfor:$http_x_forwarded_for"
    "\treq:$request"
    "\tstatus:$status"
    "\tmethod:$request_method"
    "\turi:$request_uri"
    "\tsize:$body_bytes_sent"
    "\treferer:$http_referer"
    "\tua:$http_user_agent"
    "\treqtime:$request_time"
    "\tcache:$upstream_http_x_cache"
    "\truntime:$upstream_http_x_runtime"
    "\tapptime:$upstream_response_time"
    "\tvhost:$host";

こいつをhttpディレクティブに追加して, serverディレクティブに次の文を追加した.

access_log /var/log/nginx/access.log ltsv;

redis導入

 ログを見てるとやたらと/icons/xxxxxx.pngが遅いことがわかる. なるほど画像ファイルをDBにツッコんでるんだな, コレなんとかしないとダメだなとなり作戦会議.
 何となくredisにツッコんでみたら良いんじゃない?ということになりredisをISUCON本番で触りだす. 何もわからない. 俺達は雰囲気でredisを使っている.
 get '/icons/:file_name'のところで, キャッシュされてたらそれを使うしされてないならdb.xquery()で呼び出してキャッシュするみたいな処理を書く. 正直こんなので動くのか?という不安のほうが大きかった.

redis.hset(file_name, 'img', row['data'])

mysqlの設定

スロークエリを出してクエリを見てみたり, innodb_buffer_pool_size書いてみたりした.

クエリの改善

貼られてないところにインデックスを貼ってもらうなどする. SQL絡みで言えばN+1もまともに予習せずにいったため, 少なくとも自分は全然気づかなかった. 他のメンバーは気づいていたかもしれない.

max_connectionを増やしたかった

増やしたかった. 途中からやけにToo many connections.が頻発してベンチマークが通らなくなったので, とりあえず(ソースをしっかり読まずに)connectionを増やすことを考えた. /etc/my.cnfにconnection数を書いたら良さそうみたいな感じになり書くも, 214から増えなくてしんどかった. 何が悪かったのか今でもよくわかっていない.

反省会

寿司を食べる. 寿司を食べてる最中に結果が出る.

結果

f:id:bath_poo:20171023224337p:plain 最終スコアが33373点. マジか. そんなに行くとは思っていなかった. 全体の121位みたい. 健闘したほうだと思う. 学生だと20番目ぐらいかな? isucon.net

よかったこと

  • 楽しい!
  • 知識を無限に吸収できる気がする(チャット見てるだけでもわからない単語が飛び交っている)
  • 点数上がると楽しい(今回はベンチが全然つまってなかったみたい。快適動作でした。運営がプロ)

反省点

  • 分担壊れる
  • 圧倒的な知識の無さ(Chache-Controlってなんだってレベル)
  • お菓子はもうちょっとしょっぱめも買っとくべき

過去問見た感じruby実装だとunicornだったが, 今回はpumaだった. pumaって何かと若干慌てた. 開始時間が遅れるというトラブルもあったけど, このレベルのコンテストに無料で参加できてしまうのは本当に有り難いし, なによりやっていて本当に楽しかった. 来年はちゃんと準備をして予選に出たい. そして本選へ. 1年精進します. 櫛井さんを始めとする運営に関わった皆さん, 本当に楽しかったです. ありがとうございました.

isucon.net

余談

福井にもさわやかはあります. f:id:bath_poo:20171023225450j:plain