ISUCON夏期講習
ISUCONことIikanjini Speed Up Contestの対策講座的な学生向けイベント。
- 講義
- 実習
- 解説
- 懇親会
講義
実習
2013年の予選から毒を抜いた感じのものという話。
そのうちどこかにあがるとかどうとか。
追記: 公開されてました
「ISUCON 夏期講習 2014」のサーバ環境 AMI を公開しました
解説
めちゃくちゃためになります。
追記: 完全版来てました
実習にどう取り組んだか
アプリケーションの構成
自分はRubyを使っていたのでRuby
ruby2.1.2p95
Apache, Sinatra, Unicorn, memcached, MySQL
RubyでWebアプリを開発したことがあるとは言っても自分は
主にnginx, Rails, Redis, PostgreSQLを利用して開発していたので尽く違って涙目になった。
やろうと思ったこと
ここまでやりたい
- DBに適切にインデックスは張ってあるかの確認
- 静的ファイルはWebサーバで配信されているか
- N+1クエリが無いか
- キャッシュ
できたら
- Apacheの設定
- memcachedの設定
- unicornのプロセス数は適切か
やったこと
ローカルにアプリをコピーしてgit init
READMEが書いてあってローカルで
$ bundle install
$ foreman start
して立ち上げようと思ったら立ち上がらなくて暫くはまる。
時間を考えてあきらめて他のすぐ直せるところに着手しようと逃げる。
ブラウザから適当に見てみる
memoの投稿サイト。
とりあえずDBのインデックスを追加
アプリケーションのコードをザッと見て必要そうだけどついてないところに
アクスログの解析をする
講義では計測する、アクセスログ見て方針を決めるの大事って言ってたのにやってないじゃんということに気づく。Webサーバへのアクセスログを解析してどこにアクセスが多いのかを解析した。
できる人はawk使ってちゃちゃっと書きそうだなとか思いながらもawk力が低いのでrubyにした。ワンライナーで終わらせようと思って書いてたら思ったよりも長くなって物凄い見づらいし結構時間もかかってしまった。ruby力も低い。
ISUCONにでるならこういうスクリプトは事前に書いて(or探して)おいたほうが良さそう。
静的コンテンツをWebサーバで配信させる
最初Apacheのまま設定しようと思ってしばらくググったけれど時間がかかりそうだったのでnginxをインストールして設定することに変更。nginxの設定でも細かいところで地味にハマる。
N+1クエリ
やっぱりあった。JOINするSQLはすぐ書けたけど使われてるMySQLのクライアントライブラリを使ったことが無かったので、JOINした時はどんなオブジェクトが帰ってくるんやとかREADME見たりREPLいじってる間にタイムオーバー。
感想
あまりにも無力。だけど楽しかった。
計測して、それを基に判断して、行動するということが全然できていない。体に染みつけたい。
ここまでやりたいっていうところまでも全然できてなくて、解説講義的なものを全然聞かないでいじってしまった。Rubyで小さなアプリを作る際の標準的な構成なんだろうけれど使ったことが無いからそれを学ぶ所からというのは制限時間がある中では厳しい。ISUCONの本当の面白さみたいなところまでは全然味わえていないと思う。
当たり前だけどISUCONに参加するなら本番の時間に考える必要の無いことは事前に考えて準備をしておくっていうのは最低限必要そう。
- アプリケーションのコードとミドルウェアの設定ファイルをローカルでどう管理するか
- どうデプロイするか
- まず何を計測するか(計測するためのツールも用意しておく)
- 絶対これは最初にやるだろうという手続きは整理しておく
懇親会では
普段どんなことヲーとか
受託と自社サービス、それぞれの中でさえ扱ってる問題の性質は全然違って
文脈をきちんと共有できていないために起こるコミュニーケーションの齟齬ガーって話とか
世の中がどのような方向に進んでいくのかを見てエンジニアとしてどう生きていくかヲーとか
色んな話を聞いた。無限に聞いてたかった。
プログラミング関係のイベントに参加したの初めてだけどめっちゃ楽しかった。
YAPC::AsiaとRubyKaigiも楽しみ。