目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
先日(10月22日)ISUCON7の予選に参加しましたので「ISUCONってなに?」「私でもできるじゃろうか?」というようなことを書いていきます。
ISUCONとは
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。
(ISUCON公式Blog)
3人一組でチームを組んで、8時間の制限時間以内に与えられたWebサービスの動作を早くする競技です。
コンテスト会場があるわけじゃなくて、各々パソコンを持ち寄ってチームで集まりオンラインで参加します。
お題として速度に問題があるWebサービスサーバーが与えられて(全チーム同じ内容)そのサービスの動きがスムーズになるようにいろいろします。
チューニングって具体的にどんなことするの?
- ベンチマークを回して現在のスコアを確認
- サービスのどこがボトルネックになってるか分析
- 問題の解消方法を考える
- プログラムや設定ファイルの修正
- 再びベンチマーク回す
(繰り返し)
ベンチマーク
大会運営側が用意しているスコア採点用のバッチ。
サービスに負荷がかかるような動作を行い
1分間でどれくらい処理が進むか見ている。
下のはISUCON6の過去問で行ったベンチマークです。
これはスコアが4435点!この数字を上げていくことが目標になります。
isucon@ubuntu-xenial:~/isucon6q$ ./isucon6q-bench -target http://127.0.0.1 2017/10/26 12:31:17 start pre-checking 2017/10/26 12:31:23 pre-check finished and start main benchmarking 2017/10/26 12:32:17 benchmarking finished {"pass":true,"score":4435,"success":1751,"fail":0,"messages":[]}
なんだか難しそう…
そもそも、私がこのISUCONに参加したのは会社の「や先輩」に誘っていただいたことがきっかけでした。
や先輩「最悪ただ座ってるだけでも。」
と言うので、座ってるだけなら私もできる!椅子コンか!と思い参加表明。
しかし、話をよくよく聞くと椅子関係ないし難しそう…
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。
高速化?チューニング?
ヨクワカラナイ…
レギュレーションは日本語にして規則って言って欲しい…
3人のメンバーは
言い出しっぺの や先輩 と
競プロ経験者の わ先輩 と
ド新人の私。
お二人ともデキる人なので足手まといになりはしないかとガクブルしてました…
自分ができることからしよう
チューニングの右も左も分からない私がいきなり全てをわかろうとするのは無理です。
や先輩に役割分担を割り振ってもらったので、その中で頑張ることにしました。
3人の役割分担
わ先輩: アプリケーションの修正 や先輩: ミドルウェア周りチューニングとあと全部 私 : プロファイリングと他サポート
プロファイリング?
プロファイラとは、動作中のプログラムがどの処理をどういった順序で実行したかを監視するプログラム。
プログラムの障害を見つけるために用いられるよりも、プログラムの余計な部分を削るなどして高速化するために用いられることが多い。
http://e-words.jp/w/プロファイラ.html
プロファイリングすることでどこがボトルネックになって遅くなっているのか分析します。
分析ができないと戦略が立てられないので競技開始直後からやることが沢山です。
とにかく自分が足手まといになることを恐れ、や先輩に聞いて最低限やればいいことをメモしました。
具体的に私がやること
- バックアップ体制の構築
- プロファイラの追加
- ログの解析
バックアップ
大会の運営側から渡されたサーバーを手直ししていくのがこの競技ですが、最終的なフロント側の挙動が変化しないようにしなければいけません。
何かの間違いで設定ファイルが破損した場合、バックアップをとっていないと元の挙動にも戻せなくなります。
競技開始直後、/etc/mysql や /etc/nginx などのディレクトリをまるまる別のサーバーにコピーして保存しました。
Webアプリのファイルも同様にバックアップを取って、アプリケーションの修正がやりやすいようにgit管理しました。
プロファイラの追加
htop
サーバー内でどのアプリケーションがCPUを食っているかほぼリアルタイムで見られます。
topコマンドは使ったことがありましたがhtopは知りませんでした。
htopはtopより見やすくてカッコいいです。
ベンチマークを回しながらhtopを監視します。ここで、mysqlがcpu使用率90%とかになっていれば「スロウクエリでもあるのかな?」ということになります。
pt-query-digest
mysqlのクエリログを解析して処理が遅い順番に順位をつけてくれます。
例えば、SELECT文1回の処理に時間がかかる場合は、indexを貼ることで解消できるかもしれません。
逆に、1回のSELECT文はそれほどかからなくても同じSELECTを何度も繰り返している場合は、「そもそも無駄な処理をしているんではないか?」「N+1が発生している?」と考えることができます。
クエリを分析することでその後の対処法を考えることができます。
ログ解析
pt-query-digestを使うためにはmysqlでlogを出力することが必要です。
nginxでaccess.logを出すことで、アプリ側のどの処理が重いのか確認することができます。
ただ、ログを出力するのにも多少なりと時間がかかるため、最終スコアを出す前にログを出力しない設定に戻す必要があります。
ほんの少しでもスコアを上げるための工夫ですね。
そして大会当日ーー
土砂降りの中どうにか や先輩 のお家へ到着…
足ひっぱんないようにできることをやるぞ!と心に決めたのですが「お家に帰れるかな?」状態。
それでも開始までやるべきことリストを何度も読み返しながら準備をします…
しかしーー
大会の運営というのは大変なんですね…お疲れ様です!
こちらとしては落ち着いて準備する余裕ができよかったです…
時間ができたのでやることチェックをしたり、マリオカートをしました。
その際Joy-Conストラップを逆向きにつけてしまい焦りました。
そして競技開始ーー
やることを繰り返し確認したおかげか、以外とスムーズに作業を進めることができました。
ただ、問題もあってmysqlのログが出ない…
設定ファイルに書くか、うまくいかなかったらmysqlクライアントにrootで入って設定することにしてたのですが、設定ファイルが見つからない(後から探せば普通にあった)&mysqlにrootで入れない!
焦った私はプチパニックに…
や先輩 「パニックになるにはまだ早いよ」
ですよね…
mysqlのログはや先輩にやってもらうことになりました。
代わりに他のプロファイラを入れようとしたり(結局入れてない)ベンチマークを回している最中にhtopを監視したりしていました。
そしてーー
途中から鼻水が止まらなくなって や先輩 の家のティッシュがどんどんなくなる…
や先輩 から「DBにBLOB形式(バイナリデータ)で保存されている画像データを実データに変換する」というお仕事を任していただき、「いくたくんはそれが終わったらもう帰りな」と言っていただきました。
わわわ、すみませんんん…
競技開始4時間後、私は途中離脱という不甲斐ない結果でこのISUCONを終えることとなったのです。残念。
参加してよかったの?よくなかったの?
- プロファイリングってどんなことをするのか基本的なところを知ることができた
- Webサービスの高速化という新しい視点を持てた
- 自分より上のレベルの や先輩 のさらに上のレベルの人がいることが分かった(ISUCONの予選を突破するのはほんの一握りだそうです)
- 自分が何もできないわけじゃないことがわかった
特に最後の項目が大きいかと思います。
よく考えたら1年前はssh接続でサーバーに入ることすら怪しかった私が、微力とはいえサーバーサイドのことができるようになりつつある段階まできました!
や先輩に誘っていただかなかったら気付けなかったと思うので感謝です。
というか、一人では参加できないので わ先輩 も含め、皆さんに感謝です。
まとめ
難しそうなことに飛び込んでチャレンジすることで、自分が今どれくらいの実力か多少測ることができました。
結論から言うと「まだまだ」ですが、それでも少しづつ成長できてるかなーと嬉しく思っています。
皆さんも「難しそうだからやめておこう」と思っていることに飛び込んでみてはいかがでしょうか。
意外とできたり全然できないかもしれませんが、やったもん勝ちという言葉があります。
私もまた何かに挑戦できたらいいなと思ってます。
それでは、今日はこの辺で。
読んでいただき、ありがとうございました。