isucon4予選出場してきた #isucon

チーム「ご注文はPHPですか?」として @matsuu @do_aki ご両人と共に参加してきました!利用言語はGoです。

結果は初日暫定10位。benchmarkerのバグは利用無し(気付かず)。

本戦出場は・・・大変微妙・・・
→初日5位で通過出来ました!やったね!

isucon4-qualifier

最後まで表示されてるピンクが我らです。
最初独走して、その後次々に追いぬかれていくさまが見て取れます。

さくせん

事前に作っておいたツールを使ってアクセスログを集計しながら、 ポイントを絞って重たいものから順番に対処していきました。

勘とか思いつきはぐっと堪えて、やるべきことをやりましょう!

・・・って社内の事前勉強会で言った立場なので、、ね。

やったこと

時系列は覚えていない。和幸のとんかつ弁当が美味かったことは覚えている。

  • .vimrc
    • goを書く準備(去年の予選AMIで練習してた通りにした)
  • /etc/sysctl.conf
    • net.ipv4.ip_local_port_range = 1024 65535
    • net.ipv4.tcp_tw_recycle = 1
    • net.ipv4.tcp_tw_reuse = 1
  • /etc/security/limits.conf ※nofile上げ過ぎるとログインできなくなった
    • isucon soft nofile 1000000
    • isucon hard nofile 1000000
  • /etc/nginx/nginx.conf
    • アクセスログの末尾に $request_time を追加
    • upstream keepalive
    • sendfile on
    • include mime.types ※これがなくて一時表示が崩れた
  • /etc/my.cnf
    • max_allowed_packet=300M
    • thread_cache_size=64
    • innodb_log_file_size = 64M
    • tmpdir = /dev/shm
    • innodb_log_group_home_dir = /dev/shm
    • innodb_flush_log_at_trx_commit=0
  • /etc/supervisord.conf
    • ログ出力先を /dev/null に変更
  • ベンチはシェル化してビルド・反映・ログ削除…してからbenchmarkerしてた
  • アプリをgitで管理
    • いいスコアが出たらtagをうつ

アプリ的にはチームメイト@matsuuさんのエントリが詳しいです

第4回ISUCON予選にチーム「ご注文はPHPですか?」で参戦して1日目暫定10位になりましたがPHP使ってません - Dマイナー志向

わたしがざっくり覚えてるのは以下のとおり

  • / を静的出力してアクセスをnginxだけで返す
    • /postで独自値をcookieに設定して、nginxでその値を見てファイルを出し分け
  • /post を高速化するためにbanned, lockedまわりとusersテーブルをオンメモリ化

構成的にオンメモリ・1プロセスでリアルタイムと遅延非同期の処理を組み合わせる方向性になることはわかっていたのでGoがピッタリでした。

やりたかったけどやりきれなかったこと

  • dummy_users.tsv をパースしてパスワードをメモリに保持しちゃう
    • ベタ書きしたらビルド終わらなかった
    • initのタイミングでファイル読み込んでparseするばよかった
  • DBへのINSERTをchannelとgoroutineを使って非同期化
    • Go力不足
    • 今日実装したけど /report がfailしてる
  • cookieにsaveするときに暗号化しないようにしたかった よくみたらエンコードしてただけっぽいかも

しらなかったこと

  • MARTINI_ENV=production

そのた

送信しないでベンチとれるモードはないほうがいいと思った。 スコアとらずに、でも高スコア出る確信があるからhiddenになるまで待機!とかはそれはそれでいいんだけど、情報を隠す方だけにメリットがある形はなんというか粋じゃないというかつまらないというか。

あとbenchmarkerのバグはちょっと厳しかった。 この手のイベントは負荷かける側のデキ次第で面白さが全く変わっちゃうし、 ひどいやつはechoサーバ選手権になっちゃったり、 通常ありえない挙動(gzip対応してないクライアントにgzip圧縮したのを送りつけるとfailにならないとか)をしたりするので興ざめしちゃうんですよねぇ。

ただバグがないのを作るのは無理なので、 運営チームはスコアみながら参加者のサーバにログインしたりして積極介入したほうがいいんじゃないかなーと思う次第。 賛否はあると思うけど、自分がやってるトラブルしゅーたーずとかは割と積極介入してまぁまぁうまくいってると思います。

重要事項

ほとんど @matsuu さんが、その他は @do_aki さんが書いた。 わたしがやってたのはペース配分・作戦会議の声掛け・インフラ周りちょこっと。 あと事前のツール作成とか。

まとめ

たのしい!

運営お疲れさまでした!

復習・追試してる

  • /etc/supervisord.conf で environment=MARTINI_ENV="production",GOGC=off
  • 平文パスワードをオンメモリ保持( init() でファイルから読み込み)
  • DBへのINSERTをベンチ開始60秒後まで遅延(/initを作ってたので、その最後でgoroutine起動して60秒後にINSERT処理開始)
  • /report では len(channel) が0になるまで待ってから処理開始
  • インスタンスガチャはあたり( Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz )

ここまでやって55k〜57kくらいをウロウロ。 たまに Missmatch banned IPs になるバグが潰せていない。

benchmarkerとオンメモリbannedデータは一致してるけど、DBにレポートのクエリを投げると t0.max_succeeded = 0 にならなくてレポートに載らない。

バグとれない・・・つづく。

Event 

See also