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 おせぇ!

https://gist.github.com/nise-nabe/6853387/raw/34d992290cf44308e1ad71b242f754673453876f/pprof18113.0.svg

後付のテキストの結果(なので 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

改善後のコールグラフ

https://gist.github.com/nise-nabe/6853387/raw/ea3ae01fe0c8ee32726714268e608b5ada04af45/pprof6938.0.svg

お昼ごはん

f:id:nise_nabe:20131006225030j:plain