すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:CPU Burst パフォーマンス最適化ポリシーを有効にする

最終更新日:Nov 09, 2025

コンテナーが利用可能な CPU リソースは、その CPU Limit によって制限されます。実際の使用量がこの制限に達すると、カーネルはコンテナーをスロットリングし、サービスのパフォーマンスが低下する可能性があります。CPU Burst 機能は、CPU スロットリングを動的に検出し、コンテナーのパラメーターを適応的に調整します。突然の負荷急増時、CPU Burst は一時的に追加の CPU リソースをコンテナーに提供できます。これにより、CPU Limit に起因するパフォーマンスボトルネックが緩和され、特に遅延の影響を受けやすいアプリケーションのサービス品質が向上します。

説明

このドキュメントをよりよく理解し、この機能を使用するには、CFS SchedulerCPU 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) が増加します。これは、コンテナーにおけるロングテールレイテンシー問題の主な原因です。ack-slo-manager example.png

CPU Burst を有効にすると、コンテナーはアイドル時に CPU タイムスライスを蓄積し、バースト時にリソース需要を満たすためにそれらを使用できます。これにより、コンテナーのパフォーマンスが向上し、レイテンシーが削減されます。CPU Burst.png

前述のシナリオに加えて、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 インスタンスの課金」ドキュメントをよくお読みになり、カスタムメトリックの無料クォータと課金ポリシーを理解してください。使用状況データをクエリすることで、リソース使用量を監視および管理できます。

前提条件

設定の説明

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 ポリシーは、デフォルトでクラスター全体に適用されます。

  1. 次の 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-system
  2. ack-slo-config ConfigMap が 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 ポリシーを設定すると、そのポリシーはその名前空間に適用されます。

  1. 次の 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 に対応します。
  2. ack-slo-config ConfigMap が 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 ポリシーが有効になる前と後でのアクセスレイテンシーを示します。これにより、ポリシーの最適化効果を検証できます。

検証手順

  1. サンプルアプリケーション用に次の内容を含む 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
  2. 次のコマンドを実行して、評価対象のアプリケーションとして Apache HTTP Server をデプロイします。

    kubectl apply -f apache-demo.yaml
  3. wrk2 ストレステストツールを使用してリクエストを送信します。

    # オープンソースの 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

policy

string

  • none (デフォルト): CPU Burst ポリシーを無効にし、関連パラメーターを初期値にリセットします。

  • cpuBurstOnly: Alibaba Cloud Linux が提供するカーネルレベルの CPU Burst 機能のみを有効にします。

  • cfsQuotaBurstOnly: CFS クォータの自動弾力性のみを有効にします。すべてのカーネルバージョンがサポートされています。

  • auto: Alibaba Cloud Linux カーネル機能と CFS クォータの自動弾力性を含む、前述の両方の弾力性機能を自動的に有効にします。

对

对

cpuBurstPercent

int

デフォルト値は 1000 で、単位はパーセンテージです。

このパラメーターは、Alibaba Cloud Linux が提供するカーネルレベルの CPU Burst 機能を設定するために使用されます。このパラメーターは、CPU Burst によって CPU 制限を増加できるパーセンテージを指定します。このパラメーターは、Pod の cpu.cfs_burst_us cgroup パラメーターに対応します。詳細については、「cgroup v1 の CPU Burst 機能を有効にする」をご参照ください。

たとえば、デフォルト設定では、CPU Limit = 1 の場合、対応する cpu.cfs_quota_us は 100,000 で、cpu.cfs_burst_us は 10 倍の 1,000,000 に増加します。

对

对

cfsQuotaBurstPercent

int

デフォルト値は 300 です。単位はパーセンテージです。

CFS クォータの弾力性が有効な場合に、Pod の cpu.cfs_quota_us cgroup パラメーターの値を増加できる最大パーセンテージを指定します。デフォルトは 3 倍です。

对

对

cfsQuotaBurstPeriodSeconds

int

デフォルト値は -1 で、制限がないことを示します。単位は秒です。

CFS クォータバースト機能が有効な場合、このパラメーターは Pod が上限 (cfsQuotaBurstPercent) で CPU を継続的に消費できる時間制限を指定します。Pod がこの時間制限を超えると、増加した cpu.cfs_quota_us cgroup パラメーターは元の値に復元されます。他の Pod は影響を受けません。

对

对

sharePoolThresholdPercent

int

デフォルト値は 50 パーセントです。

このパラメーターは、CFS クォータの自動調整が有効な場合のノードの CPU 使用率のしきい値を指定します。このしきい値を超えると、クォータが増加したノード上のすべての Pod の cpu.cfs_quota_us cgroup パラメーターが元の値にリセットされます。

错

对

説明
  • policycfsQuotaBurstOnly または auto に設定して CFS クォータの自動調整を有効にすると、ノード上の Pod CPU 制限パラメーター cpu.cfs_quota_us は CPU スロットリングに基づいて動的に調整されます。

  • Pod でストレステストを実行する場合、本番環境でより良いリソース弾力性を維持するために、Pod の CPU 使用率を監視するか、CFS クォータの自動調整を一時的に無効にすること (policycpuBurstOnly または 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_uscpu.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 値に依存するようにアプリケーションを変更することをお勧めします。

  1. 環境変数の注入: resourceFieldRef を使用して、Pod の limits.cpu 値を環境変数としてコンテナーに注入できます。

    env: 
      - name: CPU_LIMIT 
        valueFrom: 
          resourceFieldRef: 
            resource: limits.cpu
  2. アプリケーションコードの変更: アプリケーションの起動ロジックを変更して、CPU_LIMIT 環境変数を優先的に読み取り、スレッドプールサイズを計算して設定できます。この変更後、CPU Burst がクォータをどのように調整しても、アプリケーションは安定した信頼性の高い値に基づいて実行されます。