コンテナーが利用可能な CPU リソースは、その CPU Limit によって制限されます。実際の使用量がこの制限に達すると、カーネルはコンテナーをスロットリングし、サービスのパフォーマンスが低下する可能性があります。CPU Burst 機能は、CPU スロットリングを動的に検出し、コンテナーのパラメーターを適応的に調整します。突然の負荷急増時、CPU Burst は一時的に追加の CPU リソースをコンテナーに提供できます。これにより、CPU Limit に起因するパフォーマンスボトルネックが緩和され、特に遅延の影響を受けやすいアプリケーションのサービス品質が向上します。
このドキュメントをよりよく理解し、この機能を使用するには、CFS Scheduler や CPU Management Policies などの概念について学んでください。
CPU Burst を有効にする必要がある理由
Kubernetes クラスターは CPU Limit を使用して、コンテナーが使用できる最大 CPU リソースを制限します。これにより、複数のコンテナー間でリソースが公平に割り当てられ、単一のコンテナーが過剰な CPU リソースを消費して他のコンテナーのパフォーマンスに影響を与えるのを防ぎます。
CPU はタイムシェアリングリソースです。これは、複数のプロセスまたはコンテナーが CPU タイムスライスを共有できることを意味します。コンテナーの CPU Limit を設定すると、オペレーティングシステムのカーネルは Completely Fair Scheduler (CFS) を使用して、各期間 (cpu.cfs_period_us) 内でコンテナーの CPU 使用量 (cpu.cfs_quota_us) を制御します。たとえば、コンテナーの CPU Limit が 4 の場合、オペレーティングシステムのカーネルは、コンテナーが各期間内で最大 400 ms の CPU 時間を使用するように制限します。スケジューリング期間は通常 100 ms です。
利点
CPU 使用率は、コンテナーの健全性を測定するための主要なメトリックです。クラスター管理者は通常、このメトリックを使用してコンテナーの CPU Limit を設定します。一般的に使用される秒単位のメトリックと比較して、コンテナーのミリ秒レベルの CPU 使用率は、より顕著なグリッチと急激な変動を示すことがよくあります。次の図では、CPU 使用率は秒単位 (紫色の線) で 4 コアを大幅に下回っています。しかし、ミリ秒単位 (緑色の線) では、コンテナーの CPU 使用率は一部の期間で 4 コアを超えています。CPU Limit を 4 コアに設定すると、オペレーティングシステムは CPU スロットリングのためにスレッドを一時停止します。

次の図は、Web サービスコンテナーがリクエスト (req) を受信した後、4 コアノード上のコンテナーのスレッドに CPU リソースがどのように割り当てられるかを示しています。コンテナーの CPU Limit は 2 です。左の図は通常の場合を示しています。右の図は CPU Burst が有効になった後の場合を示しています。
コンテナーの過去 1 秒間の全体的な CPU 使用率が低い場合でも、スレッド 2 は CPU スロットリングのため、次の期間まで待ってからリクエスト 2 の処理を完了する必要があります。これにより、リクエストの応答時間 (RT) が増加します。これは、コンテナーにおけるロングテールレイテンシー問題の主な原因です。 | CPU Burst を有効にすると、コンテナーはアイドル時に CPU タイムスライスを蓄積し、バースト時にリソース需要を満たすためにそれらを使用できます。これにより、コンテナーのパフォーマンスが向上し、レイテンシーが削減されます。 |
前述のシナリオに加えて、CPU Burst は CPU 使用率の急上昇への対応にも適しています。たとえば、サービス トラフィックが急増した場合、ack-koordinator は、ノードの全体的な負荷を安全なレベルに維持しながら、数秒以内に CPU ボトルネックを解消できます。
ack-koordinator は、ノード cgroup パラメーターの cfs quota のみを変更し、Pod Spec の CPU Limit フィールドは変更しません。
シナリオ
CPU Burst 機能は、次のシナリオで役立ちます。
コンテナーは、CPU 使用率が通常、設定された CPU Limit を下回っているにもかかわらず、頻繁に CPU スロットリングを経験し、アプリケーションのパフォーマンスに影響を与えます。CPU Burst を有効にすると、コンテナーは負荷のバースト時に蓄積されたタイムスライスを使用できます。これにより、CPU スロットリングの問題が効果的に解決され、アプリケーションのサービス品質が向上します。
コンテナーアプリケーションは、起動段階でより多くの CPU リソースを消費します。アプリケーションが起動して安定した実行状態に入ると、その CPU 使用率はより低い安定したレベルに低下します。CPU Burst を有効にすると、アプリケーションは起動時により多くのタイムスライスを使用して、過度に高い CPU Limit を設定することなく迅速な起動を保証できます。
課金
ack-koordinator コンポーネントは無料でインストールして使用できます。ただし、次のシナリオでは追加料金が発生する場合があります:
ack-koordinator は自己管理コンポーネントであり、インストール後にワーカーノードのリソースを消費します。コンポーネントをインストールする際に、各モジュールのリソースリクエストを設定できます。
デフォルトでは、ack-koordinator は、リソースプロファイリングや詳細なスケジューリングなどの機能のモニタリングメトリックを Prometheus フォーマットで公開します。コンポーネントを設定する際に [Enable Prometheus Monitoring for ACK-Koordinator] オプションを選択し、Alibaba Cloud Prometheus サービスを使用すると、これらのメトリックは カスタムメトリック と見なされ、料金が発生します。料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。この機能を有効にする前に、Alibaba Cloud Prometheus の「Prometheus インスタンスの課金」ドキュメントをよくお読みになり、カスタムメトリックの無料クォータと課金ポリシーを理解してください。使用状況データをクエリすることで、リソース使用量を監視および管理できます。
前提条件
ACK Pro クラスターが作成され、クラスターの Kubernetes バージョンが 1.18 以降であること。詳細については、「ACK マネージドクラスターの作成」および「クラスターの手動アップグレード」をご参照ください。
説明オペレーティングシステムとして Alibaba Cloud Linux を使用することをお勧めします。詳細については、「CPU Burst ポリシーを有効にするには Alibaba Cloud Linux オペレーティングシステムを使用する必要がありますか?」をご参照ください。
ack-koordinator コンポーネントがインストールされており、そのバージョンが 0.8.0 以降であること。詳細については、「ack-koordinator」をご参照ください。
設定の説明
Pod のアノテーションを使用して特定の Pod に対して CPU Burst 機能を有効にすることができます。また、ConfigMap を使用してクラスターレベルまたは名前空間レベルで有効にすることもできます。
アノテーションを使用して Pod の CPU Burst を有効にする
特定の Pod に対して CPU Burst ポリシーを有効にするには、Pod の YAML ファイルの metadata フィールドにアノテーションを追加します。
Deployment などのワークロードに設定を適用するには、template.metadata フィールドで Pod に適切なアノテーションを設定します。
annotations:
# この Pod の CPU Burst 機能を有効にするには auto に設定します。
koordinator.sh/cpuBurst: '{"policy": "auto"}'
# この Pod の CPU Burst 機能を無効にするには none に設定します。
koordinator.sh/cpuBurst: '{"policy": "none"}'ConfigMap を使用してクラスターレベルで CPU Burst を有効にする
ConfigMap によって設定された CPU Burst ポリシーは、デフォルトでクラスター全体に適用されます。
次の ConfigMap の例を使用して、configmap.yaml という名前のファイルを作成します。
apiVersion: v1 data: cpu-burst-config: '{"clusterStrategy": {"policy": "auto"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "cpuBurstOnly"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "none"}}' kind: ConfigMap metadata: name: ack-slo-config namespace: kube-systemack-slo-configConfigMap が kube-system 名前空間に存在するかどうかを確認します。存在する場合は、PATCH メソッドを使用して更新します。これにより、ConfigMap 内の他の設定項目との干渉を避けることができます。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"存在しない場合は、次のコマンドを実行して ConfigMap を作成します。
kubectl apply -f configmap.yaml
ConfigMap を使用して名前空間レベルで CPU Burst を有効にする
名前空間を指定して一部の Pod に CPU Burst ポリシーを設定すると、そのポリシーはその名前空間に適用されます。
次の ConfigMap の例を使用して、configmap.yaml という名前のファイルを作成します。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: koordinator-system # 初めて使用する場合は、この名前空間を手動で作成してください。 data: # 一部の名前空間で Pod を個別に有効または無効にします。 cpu-burst: | { "enabledNamespaces": ["allowed-ns"], "disabledNamespaces": ["blocked-ns"] } # CPU Burst ポリシーは、allowed-ns 名前空間のすべての Pod で有効になり、policy: auto に対応します。 # CPU Burst ポリシーは、blocked-ns 名前空間のすべての Pod で無効になり、policy: none に対応します。ack-slo-configConfigMap が kube-system 名前空間に存在するかどうかを確認します。存在する場合は、PATCH メソッドを使用して更新します。これにより、ConfigMap 内の他の設定項目との干渉を避けることができます。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"存在しない場合は、次のコマンドを実行して ConfigMap を作成します。
kubectl apply -f configmap.yaml
手順
この例では、Web サービスアプリケーションを使用して、CPU Burst ポリシーが有効になる前と後でのアクセスレイテンシーを示します。これにより、ポリシーの最適化効果を検証できます。
検証手順
サンプルアプリケーション用に次の内容を含む apache-demo.yaml という名前のファイルを作成します。
Pod オブジェクトの
metadataフィールドにアノテーションを追加して、Pod の CPU Burst ポリシーを有効にします。apiVersion: v1 kind: Pod metadata: name: apache-demo annotations: koordinator.sh/cpuBurst: '{"policy": "auto"}' # CPU Burst ポリシーを有効にします。 spec: containers: - command: - httpd - -D - FOREGROUND image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1 imagePullPolicy: Always name: apache resources: limits: cpu: "4" memory: 10Gi requests: cpu: "4" memory: 10Gi nodeName: $nodeName # これを実際のノード名に変更します。 hostNetwork: False restartPolicy: Never schedulerName: default-scheduler次のコマンドを実行して、評価対象のアプリケーションとして Apache HTTP Server をデプロイします。
kubectl apply -f apache-demo.yamlwrk2 ストレステストツールを使用してリクエストを送信します。
# オープンソースの wrk2 テストツールをダウンロード、解凍、インストールします。詳細は https://github.com/giltene/wrk2 をご参照ください。 # 現在の Apache イメージ設定では、サーバー側のリクエスト処理ロジックをシミュレートするために Gzip 圧縮モジュールが有効になっています。 # ストレステストコマンドを実行します。IP アドレスをターゲットアプリケーションの IP アドレスに変更してください。 ./wrk -H "Accept-Encoding: deflate, gzip" -t 2 -c 12 -d 120 --latency --timeout 2s -R 24 http://$target_ip_address:8010/static/file.1m.test説明コマンド内のターゲットアドレスを Apache Pod の IP アドレスに置き換えてください。
-Rパラメーターを変更して、送信者からの QPS レートを調整できます。
結果分析
以下のデータは、CPU Burst ポリシーを有効にする前と後の Alibaba Cloud Linux およびコミュニティ版 CentOS でのパフォーマンスを示しています。
完全に無効とは、CPU Burst ポリシーが
noneに設定されていることを意味します。有効にすると、CPU Burst ポリシーは
autoに設定されます。
以下のデータは参考用です。実際の結果は、動作環境によって異なる場合があります。
Alibaba Cloud Linux | すべてシャットダウン | 有効 |
apache RT-p99 | 107.37 ms | 67.18 ms (-37.4%) |
CPU スロットリング率 | 33.3% | 0% |
Pod CPU 平均使用率 | 31.8% | 32.6% |
CentOS | すべてシャットダウン | 有効 |
apache RT-p99 | 111.69 ms | 71.30 ms (-36.2%) |
CPU スロットリング率 | 33% | 0% |
Pod CPU 平均使用率 | 32.5% | 33.8% |
データ比較から次のことがわかります:
CPU Burst 機能を有効にすると、アプリケーションの p99 応答時間 (RT) が大幅に改善されます。
CPU Burst 機能を有効にすると、Pod の全体的な CPU 使用率はほとんど変わらないまま、CPU スロットリングが大幅に減少します。
詳細設定
ConfigMap を使用するか、Pod 設定にアノテーションを追加することで、詳細設定を指定できます。アノテーションは ConfigMap よりも優先されます。パラメーターが両方の方法で設定可能で、アノテーションが追加されていない場合、ack-koordinator は名前空間レベルの ConfigMap の値を使用します。パラメーターが名前空間レベルの ConfigMap で指定されていない場合、ack-koordinator はクラスターレベルの ConfigMap の値を使用します。
以下は設定例です。
# ack-slo-config ConfigMap の例。
data:
cpu-burst-config: |
{
"clusterStrategy": {
"policy": "auto",
"cpuBurstPercent": 1000,
"cfsQuotaBurstPercent": 300,
"sharePoolThresholdPercent": 50,
"cfsQuotaBurstPeriodSeconds": -1
}
}
# Pod アノテーションの例。
koordinator.sh/cpuBurst: '{"policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "cfsQuotaBurstPeriodSeconds": -1}'以下は、CPU Burst ポリシーの詳細パラメーターです:
[アノテーション] と [ConfigMap] の列は、Pod アノテーションまたは ConfigMap を使用してパラメーターを設定できるかどうかを示します。
はサポートされていることを示し、
はサポートされていないことを示します。
パラメーター | タイプ | 説明 | アノテーション | ConfigMap |
| string |
|
|
|
| int | デフォルト値は このパラメーターは、Alibaba Cloud Linux が提供するカーネルレベルの CPU Burst 機能を設定するために使用されます。このパラメーターは、CPU Burst によって CPU 制限を増加できるパーセンテージを指定します。このパラメーターは、Pod の たとえば、デフォルト設定では、 |
|
|
| int | デフォルト値は CFS クォータの弾力性が有効な場合に、Pod の |
|
|
| int | デフォルト値は CFS クォータバースト機能が有効な場合、このパラメーターは Pod が上限 ( |
|
|
| int | デフォルト値は このパラメーターは、CFS クォータの自動調整が有効な場合のノードの CPU 使用率のしきい値を指定します。このしきい値を超えると、クォータが増加したノード上のすべての Pod の |
|
|
policyをcfsQuotaBurstOnlyまたはautoに設定して CFS クォータの自動調整を有効にすると、ノード上の Pod CPU 制限パラメーターcpu.cfs_quota_usは CPU スロットリングに基づいて動的に調整されます。Pod でストレステストを実行する場合、本番環境でより良いリソース弾力性を維持するために、Pod の CPU 使用率を監視するか、CFS クォータの自動調整を一時的に無効にすること (
policyをcpuBurstOnlyまたはnoneに設定) をお勧めします。
よくある質問
以前のバージョンの ack-slo-manager プロトコルに基づいて有効にした CPU Burst 機能は、ack-slo-manager を ack-koordinator にアップグレードした後も機能しますか?
はい。以前のバージョンの Pod プロトコルでは、alibabacloud.com/cpuBurst アノテーションを追加する必要があります。ack-koordinator は、これらの以前のプロトコルバージョンと完全に互換性があります。コンポーネントを新しいバージョンにシームレスにアップグレードできます。
ack-koordinator は、2023 年 7 月 30 日以前のプロトコルバージョンと互換性があります。以前のプロトコルバージョンで使用されていたリソースパラメーターを最新バージョンのものに置き換えることをお勧めします。
以下に、ack-koordinator と異なるプロトコルバージョンとの互換性について説明します。
ack-koordinator バージョン | alibabacloud.com プロトコル | koordinator.sh プロトコル |
≥0.2.0 | サポート済み | サポートされていません |
≥0.8.0 | サポート済み | サポート済み |
CPU Burst 設定を有効にした後、Pod が依然として CPU スロットリングを経験するのはなぜですか?
これにはいくつかの理由が考えられます。問題をトラブルシューティングするには、次の項目を確認してください。
設定フォーマットが正しくない可能性があり、そのために CPU Burst ポリシーが有効になっていない場合があります。詳細については、「詳細設定」をご参照いただき、設定を確認・修正してください。
CPU リソースが不足しているために CPU 使用率が
cfsQuotaBurstPercentで指定された上限に達した場合、CPU スロットリングイベントが引き続き生成される可能性があります。アプリケーションの実際のニーズに基づいて、Request と Limit の値を調整できます。
CPU Burst ポリシーは、Pod の 2 つの cgroup パラメーター (
cpu.cfs_quota_usとcpu.cfs_burst_us) を調整します。詳細については、「詳細なパラメーター設定」をご参照ください。cpu.cfs_quota_usパラメーターは、ack-koordinator が CPU Throttled イベントを検出した後にのみ設定されるため、わずかな遅延が発生します。対照的に、cpu.cfs_burst_usパラメーターは設定に基づいて直接設定されるため、より応答性が高くなります。最適な結果を得るには、Alibaba Cloud Linux オペレーティングシステムを使用することをお勧めします。
CPU Burst ポリシーには、
cpu.cfs_quota_usを調整するための保護メカニズムが含まれています。これは、sharePoolThresholdPercentパラメーターによって設定されるノードレベルの安全しきい値です。ノードの CPU 使用率が高くなりすぎると、cpu.cfs_quota_usは初期値にリセットされ、Pod が他の Pod に影響を与えるのを防ぎます。マシンの使用率が高いことによるパフォーマンスの低下を避けるために、アプリケーションの要件に基づいて安全しきい値を設定できます。
CPU Burst ポリシーを有効にするには Alibaba Cloud Linux オペレーティングシステムを使用する必要がありますか?
いいえ。ack-koordinator の CPU Burst ポリシーは、すべての Alibaba Cloud Linux および CentOS オープンソースカーネルをサポートしています。ただし、Alibaba Cloud Linux オペレーティングシステムを使用することをお勧めします。Alibaba Cloud Linux のカーネル機能により、ack-koordinator はより詳細で弾力性のある CPU 管理メカニズムを提供できます。詳細については、「cgroup v1 インターフェイスで CPU Burst 機能を有効にする」をご参照ください。
CPU Burst を有効にした後、アプリケーションのコードによって報告されるスレッド数が変わるのはなぜですか?
これは、CPU Burst メカニズムが一部のアプリケーションがシステムリソース情報を取得する方法と競合するために発生します。ack-koordinator は、コンテナーの基盤となる cgroup パラメーター cpu.cfs_quota_us を動的に調整することで CPU Burst を実装します。この値は、現在のスケジューリング期間内にコンテナーが利用できる CPU 時間クォータを表します。ack-koordinator は、アプリケーションの負荷に基づいてこのクォータを動的にスケーリングします。
Java の Runtime.getRuntime().availableProcessors() のような多くのアプリケーションは、cpu.cfs_quota_us を直接読み取って、利用可能な CPU コアの数を推測します。したがって、CPU クォータが動的に調整されると、アプリケーションが取得するコアの数も変化し、スレッドプールサイズなど、この値に依存するパラメーターが不安定になります。
Pod で定義されている固定の limits.cpu 値に依存するようにアプリケーションを変更することをお勧めします。
環境変数の注入:
resourceFieldRefを使用して、Pod のlimits.cpu値を環境変数としてコンテナーに注入できます。env: - name: CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpuアプリケーションコードの変更: アプリケーションの起動ロジックを変更して、
CPU_LIMIT環境変数を優先的に読み取り、スレッドプールサイズを計算して設定できます。この変更後、CPU Burst がクォータをどのように調整しても、アプリケーションは安定した信頼性の高い値に基づいて実行されます。

