ack-koordinator は、サービスレベル目標 (SLO) 対応のワークロードスケジューリングを提供します。これにより、オンラインサービスとオフラインワークロードを同じノードに混在配置し、オンラインサービスのパフォーマンスを維持しながら、クラスター全体のリソース使用率を向上させることができます。このトピックでは、ack-koordinator を使用して、NGINX Web サービスと FFmpeg 動画トランスコーディングアプリケーションを混在配置する手順を説明します。
背景情報
オンラインサービスとオフラインワークロードは、リソース要求が相補的であるため、同じノードに混在配置することが理にかなっています。オンラインサービスは負荷が変動し、リソースをバースト的に消費するのに対し、オフラインのバッチジョブは継続的に実行され、より低いリソース優先度を許容できます。
| オンラインワークロード | オフラインワークロード | |
|---|---|---|
| 代表的なアプリケーション | Web サービス、API、マイクロサービス | 動画トランスコーディング、ビッグデータ処理、AI トレーニング |
| レイテンシー | 敏感 | 鈍感 |
| SLO | 高 | 低 |
| リソース使用パターン | バースト的、時間ベース | 継続的 |
| 耐障害性 | 低 — 高可用性が必要 | 高 — 障害とリトライを許容 |
ack-koordinator は、サービス品質 (QoS) クラスを使用して、混在配置されたワークロード間のリソース優先度を管理します。このトピックで使用される 2 つのクラスは次のとおりです:
| QoS クラス | ラベル値 | 代表的な用途 | CPU 優先度 | メモリ優先度 |
|---|---|---|---|---|
| レイテンシーセンシティブ (LS) | koordinator.sh/qosClass: LS | オンラインサービス (例:NGINX) | 高 | 高 |
| ベストエフォート (BE) | koordinator.sh/qosClass: BE | オフラインバッチジョブ (例:FFmpeg) | 低 | 低 |
仕組み
このトピックでは、NGINX サービス (LS QoS クラス) と FFmpeg 動画トランスコーディングアプリケーション (BE QoS クラス) が同じノードで実行されます。2 つの混在配置機能が連携して NGINX のパフォーマンスを保護します:
リソースの再利用:BE ワークロードは、LS ワークロードに割り当てられているが現在アイドル状態のリソースを使用できるため、クラスターのリソース使用率が向上します。詳細については、「動的なリソースオーバーコミットメント」をご参照ください。
リソース隔離:さまざまなメカニズムが BE ワークロードのリソース使用を制限し、LS ワークロードのリソース要求を優先します。詳細については、「CPU QoS」、「CPU 抑制」、および「L3 キャッシュと MBA に基づくリソース隔離」をご参照ください。
このトピックでは、アプリケーションを 3 つのモードでデプロイし、その結果を比較します:
| モード | 説明 |
|---|---|
| 排他的デプロイメント (ベースライン) | NGINX のみがノードで実行されます。 |
| デフォルトの Kubernetes 混在配置 (コントロール) | NGINX と FFmpeg は、標準の Kubernetes QoS クラスを使用して同じノードで実行されます。拡張リソースや ack-koordinator の隔離機能は使用しません。 |
| SLO 対応の混在配置 (実験) | NGINX と FFmpeg は、ack-koordinator の隔離機能を有効にして同じノードで実行されます。 |
前提条件
開始する前に、以下を確認してください:
2 つのノードを持つ ACK Pro マネージドクラスター:
ノード 1 (テスト対象マシン):NGINX サービスと FFmpeg アプリケーションを実行します。最適な混在配置パフォーマンスを得るには、オペレーティングシステムとして Alibaba Cloud Linux を搭載した Elastic Compute Service (ECS) ベアメタルインスタンスを使用します。
ノード 2 (負荷テストマシン):wrk 負荷テストツールを実行し、NGINX サービスにリクエストを送信します。
詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
ack-koordinator (旧 ack-slo-manager) がインストールされ、混在配置ポリシーが有効になっていること。「クイックスタート」をご参照ください。このトピックでは ack-koordinator 0.8.0 を使用します。
CPU QoS には、ノード OS として Alibaba Cloud Linux が必要です。L3 キャッシュと MBA に基づくリソース隔離には、ECS ベアメタルインスタンスが必要です。
NGINX サービスと wrk のデプロイ
テスト対象マシンに NGINX サービスをデプロイし、負荷テストマシンに wrk 負荷テストツールをデプロイします。
負荷テストマシンへの wrk のインストール
ノード 2 (負荷テストマシン) で次のコマンドを実行して、wrk 4.2.0 をインストールします:
wget -O wrk-4.2.0.tar.gz https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz && tar -xvf wrk-4.2.0.tar.gz
cd wrk-4.2.0 && make && chmod +x ./wrkFFmpeg アプリケーションのデプロイ
オフラインの FFmpeg 動画トランスコーディングアプリケーションをテスト対象マシンにデプロイします。YAML 設定は、デフォルトの Kubernetes 混在配置モードと SLO 対応の混在配置モードでわずかに異なります。ファイル内の関連コメントがそれぞれの違いを説明しています。
be-ffmpeg.yamlという名前のファイルを作成し、次の内容を記述します:FFmpeg アプリケーションをデプロイします:
kubectl apply -f be-ffmpeg.yamlPod が実行中であることを確認します:
kubectl get pod -l app=ffmpeg -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES be-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>
負荷テストの実行
各混在配置モードでテストを実行し、結果を比較します。主要なメトリックは次のとおりです:
応答時間 (RT) パーセンタイル:RT-P90 はリクエストの 90% を処理するための最大時間、RT-P99 はリクエストの 99% をカバーします。値が低いほど、NGINX のパフォーマンスが優れていることを示します。
平均 CPU 使用率:
kubectl top nodeで測定します。
モード 1:排他的デプロイメント (ベースライン)
テスト対象マシンでは NGINX サービスのみが実行されます。
「NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイします。
負荷テストマシンから負荷を送信します:
# node_ip をテスト対象マシンの IP アドレスに置き換えてください。 ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/CPU 使用率を確認します:
kubectl top node期待される出力:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 29593m 29% xxxx xxxx cn-beijing.192.168.2.94 6874m 7% xxxx xxxxテスト対象マシンの CPU 使用率は約 29% です。
テストが完了したら、wrk の出力を確認します。正確な結果を得るために、複数のテストを実行してください。期待される出力:
Running 1m test @ http://192.168.2.94:8000/ 6 threads and 54 connections Thread Stats Avg Stdev Max +/- Stdev Latency 402.18us 1.07ms 59.56ms 99.83% Req/Sec 24.22k 1.12k 30.58k 74.15% Latency Distribution 50% 343.00us 75% 402.00us 90% 523.00us 99% 786.00us 8686569 requests in 1.00m, 6.88GB read Requests/sec: 144537.08 Transfer/sec: 117.16MBLatency Distributionセクションには、RT パーセンタイル値が表示されます。排他モードでは、RT-P50 は 343 マイクロ秒、RT-P90 は 523 マイクロ秒、RT-P99 は 786 マイクロ秒です。
モード 2:デフォルトの Kubernetes 混在配置 (コントロール)
NGINX と FFmpeg の両方が、ack-koordinator の隔離機能なしでテスト対象マシンで実行されます。
「NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイし、次に以下の変更を加えた be-ffmpeg.yaml を使用して FFmpeg アプリケーションをデプロイします:
koordinator.sh/qosClass: BEラベルを削除します。kubernetes.io/batch-cpuおよびkubernetes.io/batch-memory拡張リソースを削除します。
モード 1 と同様に wrk 負荷テストを実行し、CPU 使用率を収集します。このコントロール構成では、ノードの CPU 使用率は約 65% に達します。
モード 3:SLO 対応の混在配置 (実験)
NGINX と FFmpeg の両方が、ack-koordinator の隔離機能を有効にしてテスト対象マシンで実行されます。
「クイックスタート」ガイドに従って SLO 対応の混在配置を有効にし、各機能を設定します:
動的なリソースオーバーコミットメント:デフォルト設定を使用します。これにより、システムはアイドル状態の LS Pod リソースを、オーバーコミットされたバッチリソース (
kubernetes.io/batch-cpuおよびkubernetes.io/batch-memory) として BE Pod に割り当てることができます。CPU 抑制:
cpuSuppressThresholdPercentを65に設定します。他の設定はデフォルトを使用します。ノードの CPU 使用率が 65% を超えると、この機能は BE Pod の CPU 使用をスロットリングして LS Pod のパフォーマンスを保護します。CPU QoS:デフォルト設定を使用します。これにより、Alibaba Cloud Linux 上で CPU Identity 機能が有効になり、LS Pod は BE Pod よりもスケジューリング優先度が高くなります。これには、同時マルチスレッディング (SMT) が両方の Pod のスレッドを同じ物理コアで実行する場合も含まれます。
L3 キャッシュと MBA に基づくリソース隔離:デフォルト設定を使用します。ECS ベアメタルインスタンスでは、これにより L3 キャッシュ (最終レベルキャッシュ) とメモリ帯域幅割り当て (MBA) が隔離され、LS Pod が優先的にアクセスできるようになります。
重要CPU QoS には、ノード OS として Alibaba Cloud Linux が必要です。L3 キャッシュと MBA の隔離には、ECS ベアメタルインスタンスが必要です。
「NGINX サービスと wrk のデプロイ」で説明されているように NGINX をデプロイします。
besteffort-ffmpeg.yamlという名前のファイルを作成し、次の内容を記述します:YAML ファイルの内容を表示# オフライン FFmpeg 動画トランスコーディングアプリケーション用の Pod (BE QoS クラス、SLO 対応モード) apiVersion: v1 kind: Pod metadata: name: besteffort-ffmpeg labels: app: ffmpeg # SLO 対応スケジューリングのために QoS クラスを BE に設定します。 koordinator.sh/qosClass: BE spec: containers: - command: - start-ffmpeg.sh - '30' - '2' - /apps/ffmpeg/input/HD2-h264.ts - /apps/ffmpeg/ image: 'registry.cn-zhangjiakou.aliyuncs.com/acs/ffmpeg-4-4-1-for-slo-test:v0.1' imagePullPolicy: Always name: ffmpeg resources: # 動的にオーバーコミットされたリソースを要求します。 limits: kubernetes.io/batch-cpu: 70k kubernetes.io/batch-memory: 22Gi requests: kubernetes.io/batch-cpu: 70k kubernetes.io/batch-memory: 22Gi hostNetwork: true restartPolicy: Never nodeName: cn-beijing.192.168.2.93 # テスト対象マシンのノード名に置き換えてください。FFmpeg アプリケーションをデプロイします:
kubectl apply -f besteffort-ffmpeg.yamlFFmpeg Pod が実行中であることを確認します:
kubectl get pod -l app=ffmpeg -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES besteffort-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>負荷テストマシンから負荷を送信します:
# node_ip をテスト対象マシンの IP アドレスに置き換えてください。 ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/CPU 使用率を確認します:
kubectl top node期待される出力:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 65424m 63% xxxx xxxx cn-beijing.192.168.2.94 7040m 7% xxxx xxxxテスト対象マシンの CPU 使用率は約 63% です。
テストが完了したら、wrk の出力を確認し、他のモードの結果と比較します。
テスト結果
次の表は、3 つのモードすべてにおける NGINX の応答時間とノードの CPU 使用率を比較したものです。
| メトリック | ベースライン (排他的) | コントロール (デフォルト Kubernetes) | 実験 (SLO 対応) |
|---|---|---|---|
| NGINX RT-P90 (ms) | 0.533 | 0.574 (+7.7%) | 0.548 (2.8%) |
| NGINX RT-P99 (ms) | 0.93 | 1.07 (+16%) | 0.96 (+3.2%) |
| 平均 CPU 使用率 | 29.6% | 65.1% | 64.8% |
主な観測結果:
デフォルトの Kubernetes 混在配置 vs. ベースライン:CPU 使用率は 29.6% から 65.1% に増加しますが、NGINX の RT-P90 は 7.7%、RT-P99 は 16% 上昇します。レイテンシー分布には長いテールがあります。
SLO 対応の混在配置 vs. ベースライン:CPU 使用率は 29.6% から 64.8% に増加しますが、RT-P90 はわずか 2.8%、RT-P99 はわずか 3.2% の上昇にとどまります。
SLO 対応の混在配置 vs. デフォルトの Kubernetes 混在配置:CPU 使用率は同程度 (約 65%) ですが、NGINX の応答時間は大幅に低く、排他的デプロイメントのベースラインに近い値です。
SLO 対応の混在配置は、標準の混在配置とほぼ同じ CPU 使用率の向上を達成しながら、NGINX のレイテンシーを混在配置なしのベースラインにはるかに近い値に保ちます。
よくある質問
wrk が "Socket errors: connect 54," を報告するのはなぜですか?
このエラーは、接続数が OS の制限を超えたために、wrk クライアントが NGINX サーバーへの接続を確立できないことを意味します。この問題を解決するには、テスト対象マシンではなく、負荷テストマシンで TCP 接続の再利用を有効にします。
TCP 接続の再利用が有効になっているか確認します:
sudo sysctl -n net.ipv4.tcp_tw_reuse戻り値が
0または2の場合、この機能は無効です。TCP 接続の再利用を有効にします:
sudo sysctl -w net.ipv4.tcp_tw_reuse=1wrk 負荷テストを再実行します。
Socket errors: connect 54が表示されなくなれば、修正は成功です。
テスト完了後、他のサービスへの意図しない影響を避けるために、TCP 接続の再利用を無効にしてください:sysctl -w net.ipv4.tcp_tw_reuse=0。