N 個のPodをプリエンプトする際、最初の N-1 個の Pods 削除が失敗した場合、最後のPodの削除をスキップするという最適化。 既に N-1 の非同期プリエンプションで失敗した場合の途中停止は実装済みだったので、これがその周辺では残っていた最適化でした。
Tip
最初の N-1 個の削除に失敗している時点で、最後の 1 個だけ削除しても意味がない。意味がないというのは NNN を仮に埋めたとしても結局リソース不足でスケジュール負荷になる。
読んでいるとメトリクス周りで修正した方が良さそうな箇所があったので issue にした。 scheduler_preemption_victims differs between sync and async preemption
ついでに Async Preemption の KEP を読んだが、確かにプリエンプションがおそい
- name: PreemptionBasic
workloadTemplate:
- opcode: createNodes
countParam: $initNodes
- opcode: createPods
countParam: $initPods
podTemplatePath: config/templates/pod-low-priority.yaml
- opcode: createPods
countParam: $measurePods
podTemplatePath: config/templates/pod-high-priority.yaml
collectMetrics: true
workloads:
- name: 5Nodes
labels: [integration-test, fast, short]
params:
initNodes: 5
initPods: 20
measurePods: 5
- name: 500Nodes
labels: [performance, fast]
threshold: 18
params:
initNodes: 500
initPods: 2000
measurePods: 500FeatureGate があると機能が読みやすい気がした。