ISUCON夏期講習に参加してきた

ISUCON夏期講習

ISUCONことIikanjini Speed Up Contestの対策講座的な学生向けイベント。

  • 講義
  • 実習
  • 解説
  • 懇親会

講義

ISUCONの話(夏期講習2014) from SATOSHI TAGOMORI

実習

2013年の予選から毒を抜いた感じのものという話。
そのうちどこかにあがるとかどうとか。

解説

Webアプリケーションの パフォーマンス向上のコツ 概要編 from Masahiro Nagano

Webアプリケーションの パフォーマンス向上のコツ 実践編 from Masahiro Nagano

実習にどう取り組んだか

アプリケーションの構成

自分は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も楽しみ。