Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

スパイクアクセス対策としての pitchfork 導入

Shia
December 06, 2024

スパイクアクセス対策としての pitchfork 導入

RubyWorld Conference 2024 Day 2 の発表です。
https://2024.rubyworld-conf.org/ja/program/day2/#b-2-1

Shia

December 06, 2024
Tweet

More Decks by Shia

Other Decks in Technology

Transcript

  1. Self introduction - Sangyong Sim @ STORES. Inc - shia

    @ Internet - riseshia @ {X, GitHub} 2
  2. 環境 9 - ECS Fargate 上で動く - ASG(Auto Scaling Group)

    でキャパシティ管理する - Ruby on Rails / unicorn で動く
  3. 小規模のもの - 常に過剰キャパシティを持ってスパイクが発生したらそれで吸収する - ECS Fargate Spot で格安で運用できている 大規模なもの -

    まれに来るそれ以上のスパイク、規模感から事前に把握してることが 多く、販売直前でサービスをスケールアウトする 課題 - 十分な数のWebサーバのワーカーを用意する 11
  4. なぜ一部だけ? - 実験 15 unicorn でリクエストを処理する時、どのワーカーが仕事していたのかの 確認をしてみる - 処理に 0.1s

    かかるエンドポイント - ワーカー数 8 - 低負荷の再現するため 2並列 - 10s 負荷 各ワーカーが処理したリクエストの数を調べてみる
  5. なぜ一部だけ? - 実験 16 - worker 0: 85 - worker

    1: 86 - worker 2: 2 - worker 3: 0 - worker 4: 0 - worker 5: 0 - worker 6: 0 - worker 7: 0 注:Linux 環境のみ再現します
  6. - unicorn は prefork 型 web サーバ - 起動して要求された数のワーカーを fork

    し新しいプロセスを生成 - 1つの TCP ソケットが共有される - unicorn では epoll(or kqueue) というのが使われる - この通知順番はどうなっているか なぜ偏る? 17 ソケット epoll ワーカー0 ワーカー1 ワーカーn … 監視 通知
  7. COMMAND \_ pitchfork master \_ (gen:0) mold \_ (gen:0) worker[0]

    \_ (gen:0) worker[1] \_ (gen:0) worker[2] \_ (gen:0) worker[3] COMMAND \_ pitchfork master \_ (gen:1) mold \_ (gen:1) worker[0] \_ (gen:1) worker[1] \_ (gen:1) worker[2] \_ (gen:1) worker[3] pitchfork - refork - 一定数(adjustable)のリクエストを処理したワーカーをテンプレート として全ワーカーを再度 forkする - Copy on Write(CoW) による共有メモリーを増やしてメモリー使用量 を減らす戦略 22 fork promote
  8. 導入結果 28 レイテンシ(2024) レイテンシ(2023) Ruby DB 外部通信 Ruby DB 外部通信

    p95 p90 p50 p95 p90 p50 リクエスト平均処理時間を 内部の処理時間で分類(2023) リクエスト平均処理時間を 内部の処理時間で分類(2024)