Skip to content

優先度、公平性、Backpressure ​

この記事は英語版から翻訳されました。最新版は英語版をご覧ください。

TL;DR ​

ジョブシステムが共有基盤になると、スケジューリングポリシーはプロダクト機能になります。公平性がなければ1つのテナントやジョブ種別が全員をstarveさせます。backpressureがなければ、一時的な依存先遅延が巨大な遅延債務になります。優先度は有用ですが、quotaなしの優先度はDoSの仕組みになります。

スケジューリング問題 ​

workerは有限です。jobは等価ではありません。

  • user-visibleなjob
  • batch maintenance
  • 有料tenantの強いSLA
  • strict quotaを持つdownstream
  • fresh workより後ろに回すべきretry

スケジューラは希少なexecution slotを誰に渡すかを決めます。

Priorityだけでは足りない ​

tenant Aがhigh-priority jobを出し続けると他がstarveします。priorityにはfairnessまたはadmission controlが必要です。

ポリシー ​

Policy仕組みリスク
FIFO古いjobから実行bulk workがurgent workを塞ぐ
Strict priority最高priorityから実行starvation
Weighted fair queueingclassごとにshareを持つscheduler complexity
Deficit round robinjob costに応じcredit消費cost estimateが必要
Earliest deadline first近いdeadlineから実行見積もり誤りでthrashing

Tenant Fairness ​

text
effective_score =
  priority_weight
  + age_boost
  - tenant_over_budget_penalty
  - downstream_pressure_penalty

公平性は「全員同じthroughput」ではなく、「誰も無制限に共有capacityを消費できない」ことです。

Aging ​

text
age_boost = min(max_boost, floor(wait_seconds / aging_interval) * boost_step)

agingは低priority jobが永久に待つことを防ぎます。

Backpressure Signals ​

SignalProducer response
queue ageがSLO超過background workを減速/拒否
downstream 429増加integration concurrency削減
DB latency spikeDB-heavy jobをpause
worker error spikeretry amplification停止
tenant quota超過deferまたはreject

backpressureはworkerだけでなくenqueue側に効かせます。

Admission Control ​

ユーザー向け操作では、数時間後に完了するjobを受け付けるより早く拒否する方が正しいことがあります。

障害モード ​

障害症状対策
starvation古い低priority jobが実行されないagingとminimum share
priority inversion低priority jobが希少依存先を占有dependency別concurrency pool
retry amplificationfailed jobがworkerを支配retry queueを低priorityにする
noisy tenant1 tenantがqueueを埋めるtenant quota
scheduler hot looprunnableでないjobをscanし続けるrunnable time/classでpartition

関連パターン ​

MITライセンスの下で公開。Babushkaiコミュニティが構築。