Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mastodonを3倍早くしたい話

alpaca-tc
April 28, 2017

 Mastodonを3倍早くしたい話

2015年新卒 いっくん(石井)です。
Mastodon/Pawooの運用&開発技術 - pixiv Night #04 の発表資料です

mastodon運用をサポートしてくれる仲間を募集しています!

alpaca-tc

April 28, 2017
Tweet

More Decks by alpaca-tc

Other Decks in Technology

Transcript

  1. Mastodon
    を3
    倍早くしたい話

    View full-size slide

  2. だれ
    2015
    年新卒 いっくん(
    石井)
    Github @alpaca‑tc, Twitter @alpaca_tc
    Vim, Ruby, JavaScript

    View full-size slide

  3. pixiv
    日本酒の管理
    サブでpixivFACTORY
    の開発リー
    ダー
    社内のRails
    プロジェクトにほぼ関わっているRails
    おじさん

    View full-size slide

  4. Mastodon
    開発 参加の経緯
    昼「slack:
    ここのエラー
    が取れないんだよねー」
    (
    僕:
    あー
    はいはい、
    あそこに書いてあるやつねー )
    ...
    夜になり...
    夜「
    お昼に言ってたやつ、
    さすがに直りましたよねー、
    ここの箇所
    の」
    みんな「「「
    直ってねー
    よ!!!
    早く言えよ!!!」」」
    流れでそのまま専属pawoo
    エンジニアに

    View full-size slide

  5. Mastodon
    を3
    倍早くしたい
    ここからmastodon
    を速くする話します。
    もう終わったこと、
    これからのこと。

    View full-size slide

  6. あれ、Mastodon
    めっちゃ重い
    AP
    サー
    バー 10

    Sidekiq 60
    プロセス 1400
    ワー
    カー
    DB 40
    コア メモリ160GB
    → DB 16
    コア メモリ64GB

    View full-size slide

  7. 最適化したいこと
    DB
    リモー
    トへのリクエスト
    タイムアウト
    他のmastodon
    の高速化
    mstdn.jp Dos
    攻撃の改善
    Sidekiq N+1
    問題の改善

    View full-size slide

  8. 1. DB
    最適化
    /
    p
    g
    h
    e
    r
    o
    と E
    X
    P
    L
    A
    I
    N A
    N
    A
    L
    Y
    Z
    E
    を眺め続ける
    DB
    に最適化の余地がありそう

    View full-size slide

  9. DB
    最適化 ‑ index
    を張る
    遅いクエリのためにindex
    を張った

    View full-size slide

  10. あれ、
    あんまり速くなってない?

    View full-size slide

  11. 2.
    リモー
    トへのリクエストを改善
    mastodon
    は別のmastodon
    と通信する
    デフォルトは長くてtimeout
    まで60
    秒。
    え、60
    秒!?

    View full-size slide

  12. 2‑1. Timeout
    改善
    そのままの設定で、
    弱いサー
    バー
    がmastodon
    を立てるとpuma

    sidekiq
    が死ぬ
    適当に短くすれば安心
    #
    デフォルト
    # G
    o
    l
    d
    f
    i
    n
    g
    e
    r
    H
    T
    T
    P
    .
    t
    i
    m
    e
    o
    u
    t
    (
    :
    p
    e
    r
    _
    o
    p
    e
    r
    a
    t
    i
    o
    n
    , w
    r
    i
    t
    e
    : 6
    0
    , c
    o
    n
    n
    e
    c
    t
    : 2
    0
    , r
    e
    a
    d
    :
    # P
    u
    b
    s
    u
    b
    h
    u
    b
    b
    u
    b
    :
    :
    D
    e
    l
    i
    v
    e
    r
    y
    W
    o
    r
    k
    e
    r
    H
    T
    T
    P
    .
    t
    i
    m
    e
    o
    u
    t
    (
    :
    p
    e
    r
    _
    o
    p
    e
    r
    a
    t
    i
    o
    n
    , w
    r
    i
    t
    e
    : 5
    0
    , c
    o
    n
    n
    e
    c
    t
    : 2
    0
    , r
    e
    a
    d
    :
    # F
    e
    t
    c
    h
    A
    t
    o
    m
    S
    e
    r
    v
    i
    c
    e
    H
    T
    T
    P
    .
    t
    i
    m
    e
    o
    u
    t
    (
    :
    p
    e
    r
    _
    o
    p
    e
    r
    a
    t
    i
    o
    n
    , w
    r
    i
    t
    e
    : 1
    0
    , c
    o
    n
    n
    e
    c
    t
    : 1
    0
    , r
    e
    a
    d
    :

    View full-size slide

  13. 2‑2.
    他のmastodon
    の高速化
    そもそも、
    リモー
    トが遅いのはmastodon
    が遅いから。

    View full-size slide

  14. 僕らがmastodon
    を高速化していくしかない
    世界トップのmastodon
    を管理している責任
    pawoo
    を最適化 →
    本家にPR
    で貢献 →
    他のmastodon
    の改善
    次のバー
    ジョンは僕らのPR
    で速くなる。
    その次もきっと。
    僕らもハッピー。
    みんなハッピー。

    View full-size slide

  15. 3. mstdn.jp DoS
    攻撃の改善
    メンテナンスDoS
    攻撃が存在する
    先述の通り、mastodon
    は別のmastodon
    と通信する
    さて、
    もしリモー
    トが落ちているとどうなる...?
    答え: mstdn.jp
    が落ちると 一気に数万件のキュー
    が溜まる

    View full-size slide

  16. 賢いretry
    戦略が必要
    m
    s
    t
    d
    n
    .
    j
    p
    が落ちた時に、
    落ちてることを知りたい
    それにひきづられて、
    健康な外部のmastodon
    のjob
    が詰まることを
    避ける
    失敗したリクエストをhost
    ごとにRedis
    に集計して、
    その集計結果
    を元に実行計画やretry
    計画を立てる
    失敗し続けたら後回しにする

    View full-size slide

  17. 5. Sidekiq N+1
    問題の改善したい
    Sidekiq
    は富豪的な使い方
    ユー
    ザー
    が呟くたびに、
    全フォロワー
    に通知を飛ばす
    Sidekiq
    に積まれるのはID
    のみ
    s
    t
    a
    t
    u
    s
    .
    a
    c
    c
    o
    u
    n
    t
    .
    f
    o
    l
    l
    o
    w
    e
    r
    s
    .
    w
    h
    e
    r
    e
    (
    d
    o
    m
    a
    i
    n
    : n
    i
    l
    )
    .
    s
    e
    l
    e
    c
    t
    (
    :
    i
    d
    )
    .
    r
    e
    o
    r
    d
    e
    r
    #
    ここが、
    個別のJ
    o
    b
    に積まれる
    F
    e
    e
    d
    I
    n
    s
    e
    r
    t
    W
    o
    r
    k
    e
    r
    .
    p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    (
    s
    t
    a
    t
    u
    s
    .
    i
    d
    , f
    o
    l
    l
    o
    w
    e
    r
    .
    i
    d
    )
    e
    n
    d

    View full-size slide

  18. 実質N + 1
    のコー

    Sidekiq
    にはID
    を積んで、Job
    の中で引き直す
    実質N+1
    が実行されている
    w
    h
    e
    r
    e
    (
    i
    d
    : i
    d
    s
    )
    でまとめて引っ張ってこれれば、DB
    へのアクセ
    スが減る
    s
    t
    a
    t
    u
    s
    .
    a
    c
    c
    o
    u
    n
    t
    .
    f
    o
    l
    l
    o
    w
    e
    r
    s
    .
    w
    h
    e
    r
    e
    (
    d
    o
    m
    a
    i
    n
    : n
    i
    l
    )
    .
    s
    e
    l
    e
    c
    t
    (
    :
    i
    d
    )
    .
    r
    e
    o
    r
    d
    e
    r
    #
    ここが、
    個別のJ
    o
    b
    に積まれる
    F
    e
    e
    d
    I
    n
    s
    e
    r
    t
    W
    o
    r
    k
    e
    r
    .
    p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    (
    s
    t
    a
    t
    u
    s
    .
    i
    d
    , f
    o
    l
    l
    o
    w
    e
    r
    .
    i
    d
    )
    e
    n
    d

    View full-size slide

  19. こういう仕組みを導入したい
    #
    p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    _
    i
    n
    _
    b
    a
    t
    c
    h
    e
    s
    を作る
    バッチサイズを設定できるようにする
    デフォルト 1
    であれば、
    既存の挙動を変えずできる
    Job
    側では配列でid
    が渡された時はまとめて処理する
    失敗したjob
    だけを再度積み直せば良い
    F
    e
    e
    d
    I
    n
    s
    e
    r
    t
    W
    o
    r
    k
    e
    r
    .
    p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    _
    i
    n
    _
    b
    a
    t
    c
    h
    e
    s
    (
    s
    t
    a
    t
    u
    s
    .
    i
    d
    , f
    o
    l
    l
    o
    w
    e
    r
    _
    i
    d
    e
    f p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    _
    i
    n
    _
    b
    a
    t
    c
    h
    e
    s
    (
    s
    t
    a
    t
    u
    s
    _
    i
    d
    , f
    o
    l
    l
    o
    w
    e
    r
    _
    i
    d
    s
    )
    b
    a
    t
    c
    h
    _
    s
    i
    z
    e = E
    N
    V
    .
    f
    e
    t
    c
    h
    (
    '
    S
    I
    D
    E
    K
    I
    Q
    _
    B
    A
    T
    C
    H
    _
    S
    I
    Z
    E
    '
    ) { 1 }
    f
    o
    l
    l
    o
    w
    e
    r
    _
    i
    d
    s
    .
    e
    a
    c
    h
    _
    s
    l
    i
    c
    e
    (
    b
    a
    t
    c
    h
    _
    s
    i
    z
    e
    ) d
    o |
    i
    d
    s
    |
    p
    e
    r
    f
    o
    r
    m
    _
    a
    s
    y
    n
    c
    (
    s
    t
    a
    t
    u
    s
    _
    i
    d
    , i
    d
    s
    )
    e
    n
    d
    e
    n
    d

    View full-size slide

  20. おわり
    すでに30
    近くのPR
    を本家に送っている
    mastodon
    をどんどん引っ張っていきたい
    興味がある人はぜひ来てください。

    View full-size slide

  21. というか、
    マジで助けてください。

    View full-size slide