このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

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ユーザー会(仮称)の設立をその場で宣言しようと思っていましたが、
psgiFastCGIで動かすことができず断念。

なお、事前にCherokeeを触ってみたところ思った以上に出来がよく、ドキュメントもしっかりしててGUIの管理画面もいい感じです。ishikawa84g先生がSELinux用のポリシーも作られてるのでSELinuxでも安心です(やったね!)。

サーバ間の通信をすべてIPv6に置き換えて性能向上を図る

ロードバランサとWebサーバ間、WebサーバとDBサーバ間をIPv6で通信させて、IPv6の実力を世に知らしめる予定でしたが、当日すっかりIPv6のことを忘れてて実施してませんでした。次回の課題となる予定です。

時間があったらGentooをインストールしましょうか

#isucon さて、リセットしてもらえるらしいので、まずGentooをインストールですかねSat Aug 27 02:43:42 via Termtter

皆さんの期待を裏切ってすみません。Gentooをインストールする時間はありませんでした。

チーム「いんふらえんじにあー」で実施した内容について

さて、チーム「いんふらえんじにあー」で行ったパフォーマンスチューニングですが、実施したことは次のような感じでした。

  1. ベンチマーク実行中にtopの実行結果を目視確認、何がボトルネックになっているのかを調べる
  2. MySQLのクエリーキャッシュを有効にする
  3. slow queryでボトルネックになっているSQLを調査
  4. MySQLスキーマとプログラムを書き換えてJOIN ... GROUP BY ... ORDER BY MAX(created_at) ... となっているところを解消
  5. ロードバランサーApacheをworkerベースにする
  6. 静的コンテンツ(js,img,css)はロードバランサに設置し、ロードバランサから直接返す
  7. PerlのDevel::NYTProfでプロファイリングを行い、ボトルネックとなっている部分を調べる
  8. カーネルパラメータのチューニングを行う
  9. SELinuxを有効にする

このうち一番効果があったのは3番目のスキーマ変更とそれにともなうプログラム変更でした。これは優勝されたチームfujiwara組が行なっていたのと全く同じ手法です。
5までを行った時点で30000弱程度のスコアになったので、あとは微調整に終始していた気がします。

ロードバランサをnginxに変えても性能は上がらなかったので深く追求せずApacheのままで運用しました。
Webサーバ部分をCherokeeにしようとしましたが、Plack周りをあまり理解しておらずFastCGI化に失敗したため断念しています。
MySQLもバージョンはMySQL謹製の5.5.15が使われていたため、一からコンパイルなどはしてません。MySQLMySQL謹製のバイナリパッケージが一番速いのです。

ということで、チーム名は「いんふらえんじにあー」ですが、結局インフラ周りはあまり弄らずほぼデフォルトのままでした*3。結果としてアプリケーション寄りの変更がメインになってしまいました。

その他

今回プログラムに対して私の方で加筆・修正した内容についてGitHubにアップしました。時間がない中で急いでコミットしたため、醜いコミットになっておりますがご容赦ください。

まとめ

我らがチーム「いんふらえんじにあー」のリーダーである@netmarkjp先生のこの一言で締めさせていただきます。

今日の #isucon も先日の #tuningathon もだけど、チューニングのときにhotspotじゃないところをいじるの好きな人が多い。初見でトップダウンアプローチで安定して確実に短時間に成果出すのはキツい。着実にボトムアップアプローチできるようになれば安定して2位とれるSat Aug 27 15:41:27 via TweetDeck

ボトルネック判定大事だよ、ということで。

*1:どうやら準優勝ではなかったようです

*2:例えば素直にサービス再起動はできなくなるとか、topにプロセスが出てこなくなるとか。といってもどちらも対応策はあります。

*3:SELinux除く