feature image

2023年11月27日 | ブログ記事

ISUCON13で2位になりました(織時屋)

ISUCON13に@eiya@oribe@tokiで「織時屋」として出場し、全体2位、学生チーム内では1位になりました。

GitHub - oribe1115/isucon13
Contribute to oribe1115/isucon13 development by creating an account on GitHub.

事前準備

チームでの練習として、ISUCON11予選とISUCON11本選を解いた。
ISUCON11予選はtraPで開催された部内ISUCON(通称PISCON)に参加してのもの。

当日

10:00~ 初動

当初の予定通り初動を進める。

10:23 3,180点 初ベンチ

開始した作業

10:39 4,820点 livestream_tagsにindexを張った

開始した作業

11:01 5,607点 moderateHandlerrange livecommentsのN+1だけ直した

11:05 7,399点 iconsにindexを張った

開始した作業

11:16 8,478点 logを切ってthemes.user_idにindexを張った

このあたりからベンチマークのキューが詰まり始める

11:28 10,690点 ^/api/user/[^/]+/statisticsのN+1を直した

開始した作業

11:46 11,313点 ng_wordsにindexを張った

11:51 10,527点 isudnsrecords.nameにindexを張った

12:01 11,136点 tagを纏めて取得するように

@eiyaがやっているgetLivecommentsHandlerのJOINとiconの修正とがボトルネックなので、改善してもスコアが上がらないし負荷計測も上手くできない
実装は出来ていたがバグらせていたので@oribe,@tokiに助けを求める

12:14 12,967点 iconhashをDBに保存する

icon周りのバグがなおってボトルネックが少しうつる

開始した作業

12:27 14,491点 getLivestreamStatisticsHandlerのN+1を改善

12:55 17,274点 getLivecommentsHandlerをJOINする

開始した作業

12:59 23,657点 app-db 2台構成(baseline: 12:27 14491点)

isupipeのデータベースを2台目に振り分けた

flowchart TB
    bench[ベンチマーカー]
    bench == HTTPリクエスト ==> nginx
    bench == 名前解決リクエスト ==> pdns
    subgraph s1
        nginx[Nginx]
        pdns[PowerDNS]
        app
        
        isudns[isudns - MySQL]
        pdns -.-> isudns
        nginx --> app
    end
    app -.-> isupipe
    subgraph s2
        isupipe[isupipe - MySQL]
    end

13:02 22,914点 iconsクエリをキャッシュする、user iconで304を返す(baseline: 12:55 17274点)

開始した作業

13:06 43,491点 2台構成とiconsキャッシュの改善がmergeされる

開始した作業

13:11 48,494点 themeをcacheする

13:27 63,968点 usersをcacheする

13:30 ベンチマーカーが完全に止まる

計測が出来ないので、以前の作業の継続か勘で作業

14:20 ベンチマーカーが再開する

14:26 80,108点 getReactionsHandlerのN+1を直す

14:31 78,472点 トランザクションを外す&tagsをキャッシュ

15:05 81,037点 ngword判定をgo側で行うように直す

15分くらい別のブランチでベンチ回しててなんで点数出ないんだ?って言ってた

15:10 82,954点 LivestreamのJOINをばらしてキャッシュを使うものに置き換え

開始した作業

15:37 160,819点 nginx+dns+db(isudns)/db(isupipe)/app構成 (baseline: 14:31 78,472点)

すぐにmergeして点数おそらくそんなに変わらず

この時点での構成

flowchart TB
    bench[ベンチマーカー]
    bench == HTTPリクエスト ==> nginx
    bench == 名前解決リクエスト ==> pdns
    subgraph s1
        nginx[Nginx]
        pdns[PowerDNS]
        appdns[app]
   
        isudns[isudns - MySQL]
        pdns -.-> isudns
    end
    subgraph s2
        isupipe[isupipe - MySQL]
    end
    subgraph s3
        appmain[app]
    end
    
    appmain -.-> isupipe
    nginx -->|/api以下をプロキシ | appmain
    appmain -->|/api/register/pdnsutil| appdns
    appdns -. pdnsutilの実行 .-> pdns

15:42 171,977点 searchLivestreamsHandlerのN+1を直す

15:47 168,000点 postLivecommentHandlerのselectを一個減らす

開始した作業

15:47 169,993点 sonic-jsonを使う

16:05 172,196点 app->DNSのリクエストを投機的に実行する

スコアは出てないけどDNSを試行錯誤中

16:20 169,342点 (revert)reportの500対策でpostReportのトランザクションを復活させる

存在しないコメントに対するreportの閲覧要請が来ていて、500になっていた。
500が消えなかったのでmergeしなかった。

16:52 207,292点 SELECT reservation_slotsのN+1を解消しindexを張る

slow query上位のSELECT slot FROM reservation_slots WHERE start_at = 1702335600 AND end_at = 1702339200\Gにindexが張られていないことに気が付いたので張った。

17:17 225,969点 SELECT reservation_slotsのstart_atだけを使って検索する

17:22 198,724点 nginx+dns/db(isupipe)+db(isudns)/app構成 (baseline: 16:52 207292点)

flowchart TB
    bench[ベンチマーカー]
    bench == HTTPリクエスト ==> nginx
    bench == 名前解決リクエスト ==> pdns
    subgraph s1
        nginx[Nginx]
        pdns[PowerDNS]
        appdns[app]
    end
    subgraph s2
        isudns[isudns - MySQL]
        isupipe[isupipe - MySQL]
    end
    subgraph s3
        appmain[app]
    end
    
    pdns -.-> isudns
    appmain -.-> isupipe
    nginx -->|/api以下をプロキシ | appmain
    appmain -->|/api/register/pdnsutil| appdns
    appdns -. pdnsutilの実行 .-> pdns

17:22 244,339点 merge

17:36 ログを切る

最終スコア 243852点

結果発表

昨年に引き続き、全体2位&学生1位を獲得しました。

企業賞としてはNew Relic賞、はてな賞を受賞しました。ありがとうございます。

ISUCON13 受賞チームおよび全チームスコア : ISUCON公式Blog
2023.11.26 18:28 初出時、上位入賞チームのスコアに誤りがあったため修正しました。また、TOP30チームにおいて学生チームがわかるよう追記しました。 ------ ISUCON13 に参加いただいた皆さん、ありがとうございました! 11月25日(土)に開催されたISUCON13の結果発表および

ツール準備

基本的には去年と同じツール構成なため、差分のみ記述。

Task

コマンド管理をMakefileからTaskへ移行。

よく使うコマンドにだけdescを書いておくことでtask -lで簡単に確認できたり、

複数の処理を並列で実行できたり、

  prof:
    desc: pprofとfgprofで記録する
    deps:
      - task: pprof
      - task: fgprof

状況に合わせての「一部の処理だけ実行しない」を行単位のコメントアウトで簡単に切り替えられたり、

  restart:
    cmds:
      - sudo systemctl daemon-reload
      - sudo systemctl restart {{.SERVICE_NAME}}
      - sudo systemctl restart mysql
      - sudo systemctl restart nginx
      # 特定のサーバーでだけ実行したい場合の例
      # - sh -c "if [ $SERVER_ID = "s1" ]; then (sudo systemctl restart nginx) fi"

-gをつけるとこで常にホームディレクトリにあるTaskfile.yamlを参照できたりと、様々な点でISUCONのコマンド管理において便利だった。

テンプレートリポジトリ

今年はリポジトリの構成を効率よく改良するためにテンプレートリポジトリを作成して運用した。

GitHub - oribe1115/isucon13-template
Contribute to oribe1115/isucon13-template development by creating an account on GitHub.

過去問のリポジトリはisucon13-templateから作成し、練習で使ってみてのフィードバックをisucon13-templateに施すサイクルを実施。
本番リポジトリのoribe1115/isucon13も、仕上がったisucon13-templateから作成した。

isucrud

各関数とDBテーブルの依存関係の可視化に@mazreanが開発したiscrudを使用。
isucrudの詳細はこちらから。

ISUCON13にツールの力で勝ちたかった(mazrean)
こんにちは。23Mの@mazreanです。SysAd班でtraP Collectionというアプリケーションのバックエンドの開発・運用などを行なっていました。 ISUCONにはISUCON9から出ており、ISUCON11で本戦に出場していました。ISUCON12からは色々独自ツールを使って戦ってみたかったので、気楽に独自ツールを入れられる1人チームで出ています。 ISUCON12予選に参加して完敗しました(mazrean)こんにちは。19Bの@mazrean [https://trap.jp/author/mazrean/]です。普段はSysAd班でanke-toやtraPCollecti…

グラフが少し見にくいのを置いておけば テーブルごとにほんの一部しか更新が入らないことがすぐに分かるので、キャッシュ戦略を立てるときに役立つ。

キャッシュ実装

オンメモリキャッシュの実装には、transparentなキャッシュをtypesafeに実装できる@tokiの自作ライブラリを使用。
事前の練習でメンバーも使い方を確認した。

GitHub - motoki317/sc: A simple generic in-memory caching layer
A simple generic in-memory caching layer. Contribute to motoki317/sc development by creating an account on GitHub.

Read時にはtransparentに(そこにあることを意識せず)使うことができ、no-write-allocate, write-throughな(そもそもsetの挙動を持たない)キャッシュであるので、バグを埋め込みづらい仕組みになっている。
ただし、単純なオンメモリキャッシュのため、キャッシュしたテーブルに関する処理は複数サーバーに分けづらくなってしまう。

反省

ギャラリー

oribe icon
この記事を書いた人
oribe

お絵かきする時間が欲しい

eiya icon
この記事を書いた人
eiya

プログラミングをやっています。 メイン言語はC++14 競プロ/ゲーム制作/CTF

toki icon
この記事を書いた人
toki

Java, Go, JS/TSなどをいじっています

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2023年11月26日
ISUCON13にツールの力で勝ちたかった(mazrean)
mazrean icon mazrean
2021年9月21日
ISUCON11 traP CM制作についての小話
dan_dan icon dan_dan
2023年11月26日
【 #ISUCON 】 最近の若者は ssh しないらしいですよ
ikura-hamu icon ikura-hamu
2022年7月24日
ISUCON12に向けてダッシュボードを自作してログを可視化しました
Ras icon Ras
2023年12月5日
部内ISUCON「PISCON」を開催しました!
cp20 icon cp20
2023年11月22日
ISUCON初心者向け講習会のテキストを作り、開催しました!
pikachu icon pikachu
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記