isuconに参加してきた&チーム「いんふらえんじにあー」の戦略など
2011/08/27に行われたなんでもありのWebアプリケーション高速化バトル、#isuconにチーム「いんふらえんじにあー」として@netmarkjpさん、@ishikawa84gさんの3人で参加し、運良く 準優勝 3位ぐらいに輝きました*1。
まず今回の参加にあたって事前に考えていたネタを紹介。
プロジェクターを持ち込んでまず映画鑑賞、自分たちのモチベーションを上げる
当日現地に向かう途中でレンタルショップに寄ってソーシャル・ネットワークのDVDを借りようとしたのですが、全て貸出中で断念。
しかしプロジェクタで各サーバのtopを常時表示していたことでとても有意義に活用できました。プロジェクターを持参された@ishikawa84g先生に感謝!
今後同様のイベントがあった場合、プロジェクタを準備するのは難しいとしても、サブディスプレイや2台目のノートPCがあると便利だと思います。持ち運びを考えると軽くて薄いMacBook Air2台持ちがベストですかね。
SELinuxを有効にして性能劣化がないことを世に知らしめる
紆余曲折あったものの、最終的にEnforcing(strict)での運用に成功、そこそこのスコアを上げることができました。
今回SELinuxの設定は@ishikawa84g先生専任で設定して頂きました。しかしあれだけのポリシー設定を自分だけの力で実装するのはちょっと難しいですね。
SELinux導入による性能劣化よりも、コマンド実行の制約などに多少苦しめられた感じです*2。
とりあえず今後はSELinuxはデフォルト有効でいいと思うよ。
WebサーバにCherokeeを導入、日本Cherokeeユーザー会(仮称)を設立する
せっかくなので日本ではあまり知られていないであろうCherokee Web Serverを導入し、うまく性能アップができるようであれば日本Cherokeeユーザー会(仮称)の設立をその場で宣言しようと思っていましたが、
psgiをFastCGIで動かすことができず断念。
なお、事前にCherokeeを触ってみたところ思った以上に出来がよく、ドキュメントもしっかりしててGUIの管理画面もいい感じです。ishikawa84g先生がSELinux用のポリシーも作られてるのでSELinuxでも安心です(やったね!)。
サーバ間の通信をすべてIPv6に置き換えて性能向上を図る
ロードバランサとWebサーバ間、WebサーバとDBサーバ間をIPv6で通信させて、IPv6の実力を世に知らしめる予定でしたが、当日すっかりIPv6のことを忘れてて実施してませんでした。次回の課題となる予定です。
チーム「いんふらえんじにあー」で実施した内容について
さて、チーム「いんふらえんじにあー」で行ったパフォーマンスチューニングですが、実施したことは次のような感じでした。
- ベンチマーク実行中にtopの実行結果を目視確認、何がボトルネックになっているのかを調べる
- MySQLのクエリーキャッシュを有効にする
- slow queryでボトルネックになっているSQLを調査
- MySQLのスキーマとプログラムを書き換えてJOIN ... GROUP BY ... ORDER BY MAX(created_at) ... となっているところを解消
- ロードバランサーのApacheをworkerベースにする
- 静的コンテンツ(js,img,css)はロードバランサに設置し、ロードバランサから直接返す
- PerlのDevel::NYTProfでプロファイリングを行い、ボトルネックとなっている部分を調べる
- カーネルパラメータのチューニングを行う
- SELinuxを有効にする
このうち一番効果があったのは3番目のスキーマ変更とそれにともなうプログラム変更でした。これは優勝されたチームfujiwara組が行なっていたのと全く同じ手法です。
5までを行った時点で30000弱程度のスコアになったので、あとは微調整に終始していた気がします。
ロードバランサをnginxに変えても性能は上がらなかったので深く追求せずApacheのままで運用しました。
Webサーバ部分をCherokeeにしようとしましたが、Plack周りをあまり理解しておらずFastCGI化に失敗したため断念しています。
MySQLもバージョンはMySQL謹製の5.5.15が使われていたため、一からコンパイルなどはしてません。MySQLはMySQL謹製のバイナリパッケージが一番速いのです。
ということで、チーム名は「いんふらえんじにあー」ですが、結局インフラ周りはあまり弄らずほぼデフォルトのままでした*3。結果としてアプリケーション寄りの変更がメインになってしまいました。
その他
今回プログラムに対して私の方で加筆・修正した内容についてGitHubにアップしました。時間がない中で急いでコミットしたため、醜いコミットになっておりますがご容赦ください。
まとめ
我らがチーム「いんふらえんじにあー」のリーダーである@netmarkjp先生のこの一言で締めさせていただきます。
今日の #isucon も先日の #tuningathon もだけど、チューニングのときにhotspotじゃないところをいじるの好きな人が多い。初見でトップダウンアプローチで安定して確実に短時間に成果出すのはキツい。着実にボトムアップアプローチできるようになれば安定して2位とれる
ボトルネック判定大事だよ、ということで。