isucon 2013 予選(一日目)参加記
「パイの実g」というチーム名で nise_nabe lettas iwag が参加してました.
とりあえず概要を書いときます.
やったことまとめ
- apache から nginx に変更
- nginx のパラメータ色々いじる(把握してない)
- DB いじる
- インデックス張ったり
- メモリ増やしたり
- Go を使用
- 外部起動の markdown が遅いので Go 実装の markdown に変更 ( https://github.com/knieriem/markdown )
- users テーブルの更新がなさそうなので起動時に Go アプリ上で確保しとく
- memos の方もやろうとしたけど時間足りなくて断念
- memcached のエラーが出てきたのでセッションストレージを memcached から filesystem に変更
最終結果
10 位以下
6829.7001953125
当日の流れ概略
ちゃんと記録取ってなかったので順番とか時間とか結構ぐちゃぐちゃかもしれない.
- ほぼ一時間遅れで開始
- その間にサーバとかいろいろ準備してもらってた
- 各言語で計測比較および決定(11:00 ぐらいから)
- go はえー
- node うごかねー
- (後の話)supervisord 経由じゃないとちゃんと動かなかったらしい
- お昼ごはん (12:30 ぐらいから)
- 現状解析(13:30 ぐらいから?)
- web サーバのログみるとか
- DB のログみるとか
- Go で net/http/pprof 使うとか
- markdown 重くね -> go 実装のやつに変更
- Web サーバおよび DB サーバの改善
- my.cnf どこにあるかわからない -> とりま /etc/my.cnf 作る
- perl 自動起動どうやってるの
- Web アプリ改善 (16:30 ぐらいから?)
- users 更新やってないからアプリ上で確保しといてよくね -> 実装
- なんかセッションストレージとの通信当たりでエラー出始めた -> FilesystemStore に変更
- というか memos もアプリ上でいいんじゃね -> 間に合わず
- supervisord の存在を初めて知る
- 再起動状態で動くかどうかの確認 (17:30 ぐらいから)
- これあとで知ったけど再起動時に動作するかってのは競技時間内じゃなくても良かったのか
- lingr 見て -> workload ってなに?(いまだよくわかってない)
まとめとか
楽しかったですね.残念ながら予選落ちっぽいですが健闘できたと思います.(なんか見落とし多かった気がするけど)
次回も是非参加したいです.
とりあえずコードおいときます https://github.com/nise-nabe/isucon2013-go
付録(実行結果とか)
初回実行時
言語 | Result | スコア | RowScore | Fail 数 |
---|---|---|---|---|
perl | Success | 933.3 | 933.3 | 0 |
go | Success | 2850.4 | 2850.4 | 0 |
node | Fail | 0.0 | 30.2 | 53 |
python | Fail | 0.0 | 1905.7 | 16 |
ruby | Success | 2378.0 | 2378.0 | 0 |
php | やってない | - | - | - |
アプリ以外のチューニングの結果
初回の記録と最終的な ami の中でアプリだけデフォルトの状態に戻した時と比較
言語 | チューニング前 | チューニング後 | 差分 |
---|---|---|---|
go | 2850.4 | 4345.4 | 1495.0 |
ruby | 2378.3 | 3933.7 | 1555.4 |
Go でのプロファイルの結果
改善前のコールグラフ 実行時間指定とかあとで知ったので sample の数とかいろいろおかしいかもしれないです.
syscall.RawSyscall 結構大きい -> markdown おせぇ!
後付のテキストの結果(なので sample 数とか違う)
(pprof) top Total: 1554 samples 601 38.7% 38.7% 601 38.7% syscall.RawSyscall 47 3.0% 41.7% 114 7.3% runtime.MCentral_AllocList 42 2.7% 44.4% 42 2.7% runtime.casp 41 2.6% 47.0% 44 2.8% runtime.settype_flush 36 2.3% 49.4% 36 2.3% runtime.memclr 34 2.2% 51.5% 156 10.0% runtime.MCache_Alloc 31 2.0% 53.5% 73 4.7% strings.genSplit 28 1.8% 55.3% 28 1.8% runtime.memmove 26 1.7% 57.0% 269 17.3% runtime.mallocgc 24 1.5% 58.6% 24 1.5% strings.Count
改善後のコールグラフ
お昼ごはん