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 開発 参加の経緯 昼「slack: ここのエラー が取れないんだよねー」 ( 僕: あー はいはい、

    あそこに書いてあるやつねー ) ... 夜になり... 夜「 お昼に言ってたやつ、 さすがに直りましたよねー、 ここの箇所 の」 みんな「「「 直ってねー よ!!! 早く言えよ!!!」」」 流れでそのまま専属pawoo エンジニアに
  2. あれ、Mastodon めっちゃ重い AP サー バー 10 台 Sidekiq 60 プロセス

    1400 ワー カー DB 40 コア メモリ160GB → DB 16 コア メモリ64GB
  3. 1. DB 最適化 / p g h e r o

    と E X P L A I N A N A L Y Z E を眺め続ける DB に最適化の余地がありそう
  4. 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 :
  5. 僕らがmastodon を高速化していくしかない 世界トップのmastodon を管理している責任 pawoo を最適化 → 本家にPR で貢献 →

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

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

    が落ちた時に、 落ちてることを知りたい それにひきづられて、 健康な外部のmastodon のjob が詰まることを 避ける 失敗したリクエストをhost ごとにRedis に集計して、 その集計結果 を元に実行計画やretry 計画を立てる 失敗し続けたら後回しにする
  8. 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
  9. 実質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
  10. こういう仕組みを導入したい # 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