Mastodonを3倍早くしたい話

 Mastodonを3倍早くしたい話

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

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

50fc2c295f0049226979b19e76f7a58d?s=128

alpaca-tc

April 28, 2017
Tweet

Transcript

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

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

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

  4. Mastodon 開発 参加の経緯 昼「slack: ここのエラー が取れないんだよねー」 ( 僕: あー はいはい、

    あそこに書いてあるやつねー ) ... 夜になり... 夜「 お昼に言ってたやつ、 さすがに直りましたよねー、 ここの箇所 の」 みんな「「「 直ってねー よ!!! 早く言えよ!!!」」」 流れでそのまま専属pawoo エンジニアに
  5. Mastodon を3 倍早くしたい ここからmastodon を速くする話します。 もう終わったこと、 これからのこと。

  6. あれ、Mastodon めっちゃ重い AP サー バー 10 台 Sidekiq 60 プロセス

    1400 ワー カー DB 40 コア メモリ160GB → DB 16 コア メモリ64GB
  7. 最適化したいこと DB リモー トへのリクエスト タイムアウト 他のmastodon の高速化 mstdn.jp Dos 攻撃の改善

    Sidekiq N+1 問題の改善
  8. 1. DB 最適化 / p g h e r o

    と E X P L A I N A N A L Y Z E を眺め続ける DB に最適化の余地がありそう
  9. DB 最適化 ‑ index を張る 遅いクエリのためにindex を張った

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

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

    秒!?
  13. 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 :
  14. 2‑2. 他のmastodon の高速化 そもそも、 リモー トが遅いのはmastodon が遅いから。

  15. 僕らがmastodon を高速化していくしかない 世界トップのmastodon を管理している責任 pawoo を最適化 → 本家にPR で貢献 →

    他のmastodon の改善 次のバー ジョンは僕らのPR で速くなる。 その次もきっと。 僕らもハッピー。 みんなハッピー。
  16. 3. mstdn.jp DoS 攻撃の改善 メンテナンスDoS 攻撃が存在する 先述の通り、mastodon は別のmastodon と通信する さて、

    もしリモー トが落ちているとどうなる...? 答え: mstdn.jp が落ちると 一気に数万件のキュー が溜まる
  17. 賢いretry 戦略が必要 m s t d n . j p

    が落ちた時に、 落ちてることを知りたい それにひきづられて、 健康な外部のmastodon のjob が詰まることを 避ける 失敗したリクエストをhost ごとにRedis に集計して、 その集計結果 を元に実行計画やretry 計画を立てる 失敗し続けたら後回しにする
  18. 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
  19. 実質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
  20. こういう仕組みを導入したい # 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
  21. おわり すでに30 近くのPR を本家に送っている mastodon をどんどん引っ張っていきたい 興味がある人はぜひ来てください。

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