2024-12-13 pitchfork (preforking HTTP server for Rack applications)
pitchfork は Shopify 社が中心にメンテナンスされている Ruby の Web サーバー(Rack HTTP server)。
Shopifyで作られているPrefork型のRuby Web Server (unicornベースの実装っぽい)。まだexperimentalだけど外れたら使ってみたい » Shopify/pitchfork https://t.co/Ve6OHsMuR1
— toshimaru (@toshimaru_e) January 4, 2023
下記はREADMEをChatGPT o1 に翻訳させたもの。
pitchfork は、Rack アプリケーション向けの prefork 方式の HTTP サーバであり、Copy-on-Write パフォーマンスを最大限に活用することでメモリ使用量を最小化するよう設計されています。
pitchfork は unicorn(pitchfork は unicorn を元に作られています)と同様に、低遅延かつ高帯域幅の環境で高速なクライアントにのみ対応するよう設計されており、Unix/類似のカーネルがもつ機能を活用します。遅いクライアントに対しては、pitchfork とクライアントの間にリクエストとレスポンスを完全にバッファリングできるリバースプロキシを配置してサーブする必要があります。
ref. Shopify/pitchfork
pitchfork の特徴
pitchfork - ohbarye より引用:
- pitchfork最大の特徴
- Copy-on-Writeでforkされた子プロセスがメモリの共有ページに何も書き込まなければ、コピーされないので実質無料
- しかしRubyプロセスでは一般に遅延初期化されるメモリ領域が大量にある
- Ruby VMのインラインキャッシュ、YJITを使用する場合のJITコード、およびメモ化などのアプリケーションの一般的なパターン
- workerプロセスを起動直後にforkすると、これらのコードパスが実行される前なのでメモリ共有のメリットは時間経過で失われていく
- pitchforkはウォームアップされてキャッシュが十分に効いているプロセスを昇格させ、fork元として使う
- 新しいfork元(mold)が昇格したら、moldから新しいプロセスをforkして古いworkerをロールアウトで置き換えていく
- reforkはレイテンシを増加させる
- 子プロセスがメモリに書き込むとき、カーネルはプロセスを停止してメモリページをコピーする必要があり、これは非常にコストのかかる操作
- つまり、reforkの利用はメモリ使用量とレイテンシのトレードオフになる
ウォームアップされたmoldからforkするのが特徴。
see also. pitchfork/docs/REFORKING.md at master · Shopify/pitchfork
epoll の挙動
面白かった。unicorn v6.1 から内部でepollに変わってメモリ使用量が改善したんだけど、それの要因がまさにこれっぽそうだな。レスポンスのボラティリティを減らすために pitchfork 良さそうだ » スパイクアクセス対策としての pitchfork 導入 - Speaker Deck https://t.co/xolduCw9kQ
— toshimaru (@toshimaru_e) December 11, 2024
下記の事象が説明できる。
CPU使用周りの改善入っているっぽかったので unicorn
— toshimaru (@toshimaru_e) January 18, 2022
を 6.0 → 6.1 に上げたら、メモリ使用量がガツンと減ったけどメモリに効く改善も入ってるのかな🤔(ソースコード C なのでちゃんとコード読みきれていない) https://t.co/p8i4zMboyn