Start-time Fair Queueing: 後払い型公平スケジューリング
対象とする問題
- 不可分・非中断:一度投入したリクエストを分割したり、途中で止めて他を先に進めたりすることはできません。
- コストの分散が大きい:短い補完から長大な生成まで数桁の開きがあり、形式上の上限もモデルやワークロードとともに動きます。
- ユーザーの出入りが激しい:バッチ処理のように一時的に大量のリクエストをバーストさせた後、長い沈黙に入るユーザーが普通に存在します。
1. 記法と前提
1.1. ユーザーとリクエスト
1.2. コストと逐次モデル
1.3. パケットの言葉との対応
| 原論文の言葉 | 本記事の言葉 | LLM 配信での実体 |
|---|---|---|
| フロー | ユーザー | 組織・API キーなどの公平性の主体 |
| パケット | リクエスト | 1 回の推論呼び出し |
| パケット長 \(l\) | コスト \(c(r)\) | 入力長と推定出力長から見積もる処理量(§7.4) |
| 重み \(r_f\) | 重み \(w_i\) | 契約や優先度(本記事の解析は等重み、§4.4) |
| リンクでの送信 | サーバー群への投入 | ロードバランサーがリクエストを送り出すこと |
| busy period | 待機リクエストが存在する期間 | 混雑のひとまとまり(§2.5) |
2. アルゴリズム
2.1. 原論文の定義:タグと仮想時刻
2.2. ユーザーごとの 1 変数への畳み込み
2.3. 選択と課金
- メーターが最小のユーザー \(i^{*} = \mathop{\mathrm{arg\,min}}_{i \in A} S_i\) を選びます(同値はユーザー ID 順)。
- 仮想時刻を進めます:\(v \leftarrow S_{i^{*}}\)。選ばれたメーターは待機中の最小値なので、これは原論文の「送信中のパケットの start tag」の読み替えです(§5.3)。
- \(i^{*}\) の待機キューの先頭リクエスト \(r\) を投入します。
- 課金します:\(S_{i^{*}} \leftarrow S_{i^{*}} + c(r)\)。課金後の値は、いま投入したリクエストの finish tag、すなわち次のリクエストの start tag です。
2.4. 参加と復帰
2.5. 全体アイドル:競争のリセット
2.6. アルゴリズム全体
- リクエストが到着したら、そのユーザーの待機キュー(FIFO)に追加します。待機キューがそれまで空だった場合は、追加する前に \(S_i \leftarrow \max(S_i, v)\) で合流させます(新規ユーザーは \(S_i = v\))。
- 処理能力に空きがある間、§2.3 の選択・投入・課金を 1 件ずつ繰り返します。
- 待機中のユーザーがいなくなったら、\(v \leftarrow \max(v, \max_i S_i)\) で競争をリセットします(§2.5)。
- 完了・失敗・キャンセルではメーターを変更しません。
2.7. 小さな数値例
| 投入 | \(v\) | 選択 | 課金 | \(S_A\) | \(S_B\) |
|---|---|---|---|---|---|
| 初期 | 0 | — | — | 0 | 0 |
| 1 | 0 | A(同値) | +3 | 3 | 0 |
| 2 | 0 | B | +1 | 3 | 1 |
| 3 | 1 | B | +1 | 3 | 2 |
| 4 | 2 | B | +1 | 3 | 3 |
| 5 | 3 | A(同値) | +3 | 6 | 3 |
| 6 | 3 | B | +1 | 6 | 4 |
| 7 | 4 | B | +1 | 6 | 5 |
| 8 | 5 | B | +1 | 6 | 6 |
3. 公平性の性質
3.1. メーターのバンド不変量
- 仮想時刻 \(v\) は単調非減少です。後戻りすることはありません。
- すべてのユーザーについて \(S_i \le v + c_{\max}\) です。
- 待機中のユーザーについて \(S_i \ge v\) です。
- 選択と課金:新しい \(v\) は待機中のメーターの最小値なので、性質 3 より元の \(v\) 以上です(性質 1)。選ばれたユーザーの課金直後のメーターは \(v + c(r) \le v + c_{\max}\) です(性質 2)。他の待機中のユーザーのメーターは最小値以上、すなわち新しい \(v\) 以上です(性質 3)。
- 参加・復帰:合流後のメーターは \(\max(S_i, v)\) で、帰納法の仮定より \(S_i \le v + c_{\max}\) なので合流後も \(v + c_{\max}\) 以下(性質 2)、かつ \(v\) 以上(性質 3)です。
- 全体アイドル:新しい \(v\) は \(\max(v, \max_i S_i)\) で元の \(v\) 以上(性質 1)、性質 2 より元の \(v + c_{\max}\) 以下です。\(v\) が増える方向なので性質 2 は保たれ、待機中のユーザーがいないため性質 3 は空虚に成り立ちます。
- 離脱:何も変えません。
3.2. 混雑ユーザー間のコスト差
3.3. 出入りを繰り返しても得はできない
3.4. 全体アイドルのリセットが安全な理由
3.5. 粒度の下限
4. DRR との比較
4.1. DRR の仕組みと SFQ の後払い
4.2. 割当量というパラメータがない
4.3. アイドルからの復帰
4.4. 重み付け
4.5. 比較のまとめ
| 観点 | DRR | SFQ |
|---|---|---|
| ユーザーごとの状態 | デフィシットカウンタ(与信残高) | メーター \(S_i\)(次のリクエストの start tag) |
| 全体の状態 | 環状リストの現在位置 | 仮想時刻 \(v\) |
| 選択 | 環状リストを巡回 | 待機中のユーザーの argmin |
| コストの扱い | 割当量を先に配布し、送信で消費(先払い) | 投入時に課金(後払い) |
| 必要なコスト情報 | 正確なコスト(原論文ではパケット長) | 投入時に定まる値(見積もりで可) |
| パラメータ | 割当量 \(Q_i\) | なし |
| 公平性の粒度 | \(Q + L_{\max}\) のオーダー | \(c_{\max}\)(区間のコスト差 \(\le 2c_{\max}\)) |
| 1 決定の計算量 | 償却 \(O(1)\)(\(Q \ge L_{\max}\) のとき) | \(O(T)\) 走査(順序付き構造で \(O(\log T)\)) |
| 想定規模 | ルータの数千〜数万フロー | 1 スケジューラあたり数十〜数百ユーザー |
| アイドル復帰 | カウンタを 0 に戻しリスト末尾へ(最悪 1 巡回待ち) | \(\max(S_i, v)\) で合流(残りがなければ即候補) |
| 全体アイドル | 状態なし(各フローは離脱時にリセット済み) | \(v\) を finish tag の最大値へ進めて競争をリセット |
| 重み付け | \(Q_i \propto w_i\) | \(c / w_i\) を課金 |
5. LLM 配信に合わせた設計判断
5.1. コストは見積もりで確定させ、後から動かさない
- 不変量の単純さ:「メーターは投入でちょうど 1 回課金される」という 1 行が、補正を認めた途端、二重補正の防止や途中失敗時の扱いなど、状態に依存する分岐の集合に化けてしまいます。
- 順序の安定性:出力長の分散は大きく、事後補正は選択順序を過去の観測ノイズで揺らします。順序の決定に使う量を投入時点で確定する値に限ることで、シミュレーションでの再現とデバッグが素直になります。
- 調整の置き場所:実測との系統的なずれは、個々のリクエストにさかのぼって精算しなくても、見積もり式そのものを長期の実測で校正すれば吸収できます(§7.4)。校正と公平性の機構は独立に進められます。
5.2. 決めるのは順序だけ
5.3. 単一リンクからサーバー群への読み替え
6. 関連手法の中での位置づけ
6.1. fair queueing・stride scheduling の系譜
6.2. LLM サービングの公平化研究との関係
6.3. 比較のまとめ
- SFQ(本記事で紹介した手法)[1]
- 重いリクエストの挙動:メーターが最小でありさえすれば \(c_{\max}\) 級の 1 件も直ちに投入し、その瞬間にコストの全額を 1 回だけ課金します。以後そのユーザーは、他のユーザーのメーターが追いつくまで選ばれません。「先に通して、後からそのユーザーを休ませる」後払いであり、混雑ユーザー間のコスト差はどの区間で測っても \(2c_{\max}\) 以下に収まります(§3.2)。
- 復帰時の挙動:合流規則 \(\max(S_i, v)\) により、アイドル中の貯金はできず、基準線より上に残ったメーターは引き継ぎます。残りがなければ合流した瞬間からメーターが最小のグループの一員となり、次の投入から直ちに候補になります(§2.4)。待機中のユーザーが全員いなくなった時点でだけ、競争がリセットされます(§2.5)。
- Deficit Round Robin[2]
- 重いリクエストの挙動:訪問のたびに割当量 \(Q_i\) が与信残高として貯まり、重い 1 件は残高が長さに達するまで送信されません。「大きい仕事を送る前に待たせる」先払いで、支払いは送信時の残高消費として完結し、送った後のペナルティはありません。
- 復帰時の挙動:キューが空になるとデフィシットカウンタを 0 に戻し、復帰時は環状リストの末尾に並び直します。使い残しの与信は没収され、自分の番まで最悪 1 巡回分を待ちます。
- SFQ との違い:支払いの向きが逆です。DRR は「送る前に貯めて待つ」、SFQ は「先に送って後で休む」形を取ります。これに伴い、割当量というパラメータの有無、償却 \(O(1)\) の巡回か argmin かという計算の形、重い 1 件の待たされ方が変わります(§4)。
- GPS[4]
- 重いリクエストの挙動:仕事を無限に分割できると仮定した流体モデルで、重い 1 件もバックログのある全フローと同時に、重み比例のレートで少しずつ処理されます。1 件を丸ごといつ通すかという「順序」の概念自体がありません。
- 復帰時の挙動:復帰した瞬間から容量の重み比例シェアを受け取ります。アイドル中のシェアはその場で消えるため、貯金は原理的に生じません。
- SFQ との違い:分割可能という前提が、不可分・非中断のリクエストを丸ごと投入する SFQ と正反対です。GPS は実装対象ではなく、WFQ や SFQ などの離散方式が近似の目標とする理想的な基準として機能します。
- WFQ[3]
- 重いリクエストの挙動:GPS 上での仮想完了時刻(finish tag)が最小のリクエストを通します。重いリクエストは finish tag が遠くなるため、通る前に軽いリクエストへ順番を譲り、選ばれた時点で丸ごと通されます。支払いは「完了が遅いはずのものを後回しにする」という順序付けの側に織り込まれています。
- 復帰時の挙動:到着したリクエストのタグは、そのユーザーの前回の finish tag と現在の仮想時刻の大きい方を起点に計算されるため、アイドル中の貯金は生じません。
- SFQ との違い:完了時点(finish 側)を基準に並べるか、開始時点(start 側)を基準に並べるかが異なります。WFQ は選択の時点でリクエストのコスト(原論文ではパケット長)が必要で、仮想時刻の計算に GPS のシミュレーションも必要です。SFQ はどちらも不要で、この 2 つの単純化がコストが見積もりでしかない LLM 配信への適用を可能にしています(§5.1・§6.1)。
- Stride scheduling[5]
- 重いリクエストの挙動:pass 値が最小のクライアントを選び、選ぶたびにチケット数に反比例した固定の stride を積み増します。1 回の割り当ては固定のクォンタムで、「重い仕事」はプリエンプション可能な CPU 時間として細切れに刻まれるため、1 回の支払いが大きく跳ねることはありません。
- 復帰時の挙動:参加・復帰するクライアントの pass を全体の基準値に揃えて開始し、休止中の貯金を防ぎます。
- SFQ との違い:1 回に積む量が固定(チケット由来)か、毎回の仕事のコストかが違いです。SFQ のユーザーごとの 1 変数は「stride を毎回のリクエストのコストにした stride scheduling」と見なせます(§6.1)。可分な CPU 時間と不可分なリクエストという対象の違いが、そのまま stride の可変化に対応しています。
- Linux CFS[6]
- 重いリクエストの挙動:vruntime が最小のタスクを実行します。実行は中断可能で、実際に使った CPU 時間(重みで正規化)が連続的に vruntime へ課金される、実測ベースの後払いです。重い仕事はタイマーで刻まれ、実行と課金を少しずつ繰り返しながら他のタスクと交互に進みます。
- 復帰時の挙動:min_vruntime を基準点として、起床したタスクが過去にさかのぼって有利になりすぎないよう vruntime を調整します(スリープ復帰の扱いには実装上の細部があります)。
- SFQ との違い:課金が実測かつ連続なのに対し、本記事の使い方の SFQ は投入時の推定コストを一括で課金し、以後いっさい補正しません(§5.1)。プリエンプションできる CPU と、投入したら止められないリクエストという対象の違いが、課金のタイミングの違いにそのまま現れています。
- VTC(Virtual Token Counter)[7]
- 重いリクエストの挙動:推論エンジン内部で、クライアントごとの処理済み入力・出力トークン数の重み付き累積カウンタが最小のものを、continuous batching の各ステップで優先します。重いリクエストは処理が進むにつれてカウンタが増え、トークン粒度で徐々に他のクライアントへ譲っていく形になります。
- 復帰時の挙動:アイドル明けのクライアントのカウンタを現在の水準まで持ち上げ、休止中の貯金を防ぎます。SFQ の合流規則と同じ役割です。
- SFQ との違い:挿入位置と責務が異なります。VTC はエンジンのスケジューラを置き換えて「実際に処理されたトークン量」を公平化するのに対し、前段の SFQ は無改造のサーバー群の手前で「投入順序」だけを公平化します(§6.2)。課金も、実測トークンの逐次加算に対して、投入時の推定コストの一括課金という違いがあります。
7. 実装メモ
7.1. データ構造と計算量
7.2. 数値の維持
7.3. 決定性
7.4. コストの見積もり
max_tokens など)をそのまま使うのではなく、過去のリクエストにおける「実際の出力長の合計 ÷ 出力最大長の合計」の比を掛けて縮めると、実態に近づきます。この比は長期の集計からゆっくり更新すれば良く、モデルごとやユーザーごとに持つこともできます。
7.5. 検証したい性質
8. 設計上の限界
- 公平性は課金したコストの上で成立する点:実際の資源消費が課金したコストから系統的にずれるユーザーがいれば、そのずれの分だけ実測ベースの公平性は歪みます。是正は個々の課金の補正ではなく、見積もり式の校正で行う方針です(§5.1・§7.4)。
- 順序の公平であって実行の公平ではない点:制御しているのは投入の順序だけで、投入後の GPU 時間や KV キャッシュの占有、推論エンジン内部のプリエンプションには関与しません。
- 原論文の遅延・スループット保証は持ち込めない点:それらの保証は単一リンクと正確なパケット長を前提とするため、本記事の読み替え(§5.3)で運ばれるのはコスト配分の公平性(§3)だけです。個々のリクエストの締切や最大待ち時間は保証しません。
- ユーザー内が FIFO 固定である点:ユーザー内部の優先度付けやリクエスト種別ごとの制御は持ちません。
- 単一スケジューラ前提である点:メーターと仮想時刻は 1 プロセス内の状態であり、ロードバランサーを複数レプリカに分けた場合の、レプリカ横断の公平性はスコープ外です。
- 選択が \(O(T)\)〜\(O(\log T)\) である点:数万フローを線速で処理する用途には向きません。その規模は DRR 系の \(O(1)\) 設計の土俵です(§4.2)。
9. まとめ
- 規則は「メーターが最小のユーザーを選び、投入した瞬間にコストを 1 回だけ課金する」「参加・復帰時は \(\max(S_i, v)\) で合流する」「待機中のユーザーが全員いなくなったら仮想時刻を finish tag の最大値へ進める」の 3 つだけです。これは 1996 年の SFQ そのものであり、一度確定した課金は後から補正も返金もしません。
- 保証は課金した推定コストの上での公平性で、単一スケジューラの投入順序に限定されます。混雑が続くユーザー間の区間のコスト差は常に \(2c_{\max}\) 以下で、リクエストが不可分である以上、この粒度は原理的な下限と同じオーダーです。
- DRR との決定的な違いは、送信許可の割当量を先に配るのではなく、先に通してからメーターに記録する後払い方式である点です。これにより、パラメータ調整の不要化、リクエスト 1 件分の粒度、アイドルからの速い復帰が得られます。代償は選択の \(O(T)\)(順序付き構造で \(O(\log T)\))で、ルータ規模のフロー数を捌く用途は切り捨てています。
- 選択がメーターだけで決まりリクエスト自身のコストを参照しないこと、仮想時刻が観測値であること、処理速度を参照せずに公平性が定義されていること。この 3 つの性質のおかげで、SFQ はコストが見積もりでしかなく実行が並列な LLM 配信のロードバランサーに、記号の読み替えだけでそのまま使えます。
10. 参考文献
- [1] Pawan Goyal, Harrick M. Vin, Haichen Cheng, "Start-time Fair Queueing: A Scheduling Algorithm for Integrated Services Packet Switching Networks," SIGCOMM, 157―168, 1996. (Start-time Fair Queueing。本記事の主題)
- [2] M. Shreedhar, George Varghese, "Efficient Fair Queuing Using Deficit Round-Robin," IEEE/ACM Transactions on Networking 4(3), 375―385, 1996. (Deficit Round Robin)
- [3] Alan Demers, Srinivasan Keshav, Scott Shenker, "Analysis and Simulation of a Fair Queueing Algorithm," SIGCOMM, 1―12, 1989. (Fair Queueing / WFQ)
- [4] Abhay K. Parekh, Robert G. Gallager, "A Generalized Processor Sharing Approach to Flow Control in Integrated Services Networks: The Single-Node Case," IEEE/ACM Transactions on Networking 1(3), 344―357, 1993. (Generalized Processor Sharing)
- [5] Carl A. Waldspurger, William E. Weihl, "Stride Scheduling: Deterministic Proportional-Share Resource Management," Technical Memorandum MIT/LCS/TM-528, MIT Laboratory for Computer Science, 1995. (Stride scheduling)
- [6] Ingo Molnar, "CFS Scheduler," The Linux Kernel documentation, 2007. (Linux CFS の設計文書)
- [7] Ying Sheng, Shiyi Cao, Dacheng Li, Banghua Zhu, Zhuohan Li, Danyang Zhuo, Joseph E. Gonzalez, Ion Stoica, "Fairness in Serving Large Language Models," OSDI, 2024. (VTC: 推論エンジン内部でのトークン単位の公平化)
- [8] Shiyi Cao, Yichuan Wang, Ziming Mao, Pin-Lun Hsu, Liangsheng Yin, Tian Xia, Dacheng Li, Shu Liu, Yineng Zhang, Yang Zhou, Ying Sheng, Joseph Gonzalez, Ion Stoica, "Locality-aware Fair Scheduling in LLM Serving," arXiv preprint arXiv:2501.14312, 2025. (DLPM: プレフィックス局所性と公平性の両立)
- [9] Zhixiang Wei, James Yen, Jingyi Chen, Ziyang Zhang, Zhibai Huang, Chen Chen, Xingzi Yu, Yicheng Gu, Chenggang Wu, Yun Wang, Mingyuan Xia, Jie Wu, Hao Wang, Zhengwei Qi, "Equinox: Holistic Fair Scheduling in Serving Large Language Models," arXiv preprint arXiv:2508.16646, 2025. (Equinox: 公平性と運用効率の総合的な扱い)
最終更新日: 2026年7月12日