pitchfork は Shopify 社が中心にメンテナンスされている Ruby の Web サーバー(Rack HTTP server)。

下記は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 の挙動

下記の事象が説明できる。