ホーム > ISUCON > #isucon 8 本戦10位で負けてきました

#isucon 8 本戦10位で負けてきました

  • 投稿者: chiba
  • 2018/11/3 土曜日 21:28:22
  • ISUCON

ISUCON8本戦に山形組でISUCON6以来の2年ぶりに参加してきました。結果は既報の通り学生チームである「最大の敵は時差」さんが優勝され、我々は10位という残念な結果となりました。(そういえば今回、本戦の結果の受賞チーム以外の公式発表が対参加者以外にないですね)

山形組の過去を振り返ると

ISUCON1、下から数えたほうが早い順位
ISUCON2、準優勝かつ特別賞
ISUCON3、予選総合3位本選5位
ISUCON4、予選総合4位本選10位
ISUCON5、予選落ち
ISUCON6、予選総合2位本選10位
ISUCON7、予選落ち
ISUCON8、予選総合15位、本選10位

とまあ、なぜか2年おきに本戦出場し10位になるということを繰り返しております。来年はジンクスを打ち破って2年連続で予選突破して本戦優勝を果たしたいです。

やったこと

  • 選んだ言語はもちろんPerl
    • 初期スコア: 1588
  • 最初のお決まりの作業
  • ただ、すべてがdocker上でうごいていて、よくわからん…となったので、とりあえずログをいつものようにとるためにnginxを剥がす
    • ここで妙にはまって時間を消耗
  • 12:53 遅めの作戦会議。スプレッドシートに共有した作戦リストが以下。見積もり時間と担当を決めてそれぞれとりかかる。
    – N+1の地道な解決
    – はやくなったら、enable_shareをonにする
    – ログ送信用のワーカーをつくり/bulk_send を実装
    – static expires max
    – isu4 の mysql を利用する
    – appをisu2,3に並列稼働
    – appをdockerからはがす
    – app のプロセスの状況を見る
    – cache関連
  • 13:19 score:2560
    SELECT * FROM trade ORDER BY id DESC
    LIMIT 1
    追加
  • 13:46 score:2756
    ALTER TABLE `isucoin`.`trade`
    ADD COLUMN `created_at_sec` DATETIME(6) NULL AFTER `created_at`,
    ADD COLUMN `created_at_min` DATETIME(6) NULL AFTER `created_at_sec`,
    ADD COLUMN `created_at_hour` DATETIME(6) NULL AFTER `created_at_min`,
    ADD INDEX `idx_sec` (`created_at_sec` ASC),
    ADD INDEX `idx_min` (`created_at_min` ASC),
    ADD INDEX `idx_hour` (`created_at_hour` ASC);
    
    update trade set created_at_sec=STR_TO_DATE(DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s'),created_at_min=STR_TO_DATE(DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:00'), '%Y-%m-%d %H:%i:%s'),created_at_hour=STR_TO_DATE(DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00'), '%Y-%m-%d %H:%i:%s');
    結果意味なかったかもしれないけど、秒、分、時の切り捨てをあらかじめ行うように。
  • 14:02 score:4351
    Starletのworkerを5->15に
  • 14:13 score:4530
    staticファイルをnginx serve/expires max
  • 15:00 score:4673 orders.userのN+1外し
  • 15:24 score:4144 isu4のDB参照(2台構成へ)
  • 15:47 score:4726 tradeのN+1外し
  • 16:04 score:4904 isu2/isu3にround robin(4台構成へ)
  • 17:34 score:8191 enable_shareを1/7(約14%)有効に
  • 17:49 score:8389 enable_shareを 22% 有効に
  • その後いろいろshare rateをいじるが最終提出は22%で、最終走行では score:9473 で10位

上記に書いてないこととして、テーブルのパーティショニングには気づいて、外すのを試したりしていたのですが、逆に大幅スコアダウンしたりしていてもとに戻したりしていました。後から考えてみると、チーム連携がうまくとれてなくて関係ない変更がまぎれていたのか、DBのウォームアップ的な問題だったのか…。

全体的にdocker絡みで操作にまごつくことが多くて、最初から予定していたbulk_sendの実装もできないほど時間が足りない状態に陥ってしまい、少ない残り時間をenable_shareのrate調整という本質的ではない作業に割いてしまっていました。肝心のtrade部分のチューニングは考える時間すらほとんどとってなかった状態でして、バックグラウンドにまわして直列化するなんてまったく考えついてもいなかったので、完敗ですね…。banの実装もやろうともしていなかったです。

感想戦

先週末、感想戦をやりきれるだけやりきってみました。そこでやったことはこちら。(細かくscoreとってないので大雑把ですが

  • /send_bulkをbackgroundプロセスで実装
  • score:11318 tradeをbackgroundで0.1秒おきに実行
  • score:32245 chart_by_*をsettingsテーブルにcache
  • score:40999 remove partition/bcrypt cost
  • score:53800 5回連続ログイン失敗のban
  • score:67402  isuconbank:commitを run_tradeからさらにbackground化してrun_tradeを早くまわすように
  • score:74507 lowest/highestとかもcache
  • score:113736 nginxのworker_rlimit_nofile 4096;
  • score:137392 tradeのロジック最適化/settingsのプロセス内キャッシュ/isubank,isuloggerのhttp keepalive
  • どこでやったかわすれたのですが 
    /etc/sysctl.conf

    net.netfilter.nf_conntrack_max = 100000
    net.nf_conntrack_max = 100000
    を追記

といったところで、13万点超えでその時点での感想戦1位をとって満足してやめていたのですが、翌朝おきたら40万点超えの学生チームが現れており、ただ笑うしかなかったです。

感想

感想戦をやってみて改めて実感しましたが、いろいろなところにボトルネックが隠されており、総合力が試されるとてもよい問題でした。

毎度のことながら来年のことはまだ決まっていないと思いますが、開催されるようであれば、もちろん参加したいです。

出題を担当された、カヤックの方々、協力をされていたDeNAやその他の方々、運営のLINEのみなさまには感謝です。こんなに熱く楽しいイベントの開催を毎年維持されており本当にすごいことだと思います。ありがとうございました!

はてなブックマーク - #isucon 8 本戦10位で負けてきました

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:0

この記事のトラックバック URL
https://blog.everqueue.com/chiba/2018/11/03/853/trackback/
トラックバックの送信元リスト
#isucon 8 本戦10位で負けてきました - へぼい日記 より

ホーム > ISUCON > #isucon 8 本戦10位で負けてきました

検索
フィード
メタ情報

ページの上部に戻る