2.3. OpenShift Serverless Serving のスケーリングとパフォーマンス
OpenShift Serverless Serving は、次のパラメーターに基づいてスケーリングおよび設定する必要があります。
- Knative Service の数
- 修正回数
- システム内の同時リクエスト数
- リクエストのペイロードのサイズ
- ユーザーの Web アプリケーションによって追加された Knative Service の起動レイテンシーと応答レイテンシー
- KnativeService カスタムリソース (CR) の変更回数の推移
2.3.1. KnativeServing のデフォルト設定
デフォルトでは、OpenShift Serverless Serving は、高可用性と中規模の CPU およびメモリーリクエストと制限で、すべてのコンポーネントを実行するように設定されています。つまり、KnativeServing
CR の high-available
フィールドは、自動的に 2
の値に設定され、すべてのシステムコンポーネントは 2 つのレプリカにスケーリングされます。この設定は中程度のワークロードのシナリオに適しており、以下でテストされています。
- 170 Knative サービス
- Knative Service ごとに 1 - 2 回の修正
- 主にコントロールプレーンのテストに重点を置いた 89 のテストシナリオ
- Knative Service が削除され、再作成されるシナリオを 48 回再現する
- 41 の安定したシナリオ。リクエストはゆっくりと継続的にシステムに送信されます。
これらのテストケースでは、システムコンポーネントは実質的に以下を消費しました。
コンポーネント | 測定されたリソース |
---|---|
プロジェクト | 1 GB メモリー、0.2 コアの CPU |
プロジェクト | 5 GB メモリー、2.5 コアの CPU |
2.3.2. OpenShift Serverless Serving の最小要件
デフォルトのセットアップは中規模のワークロードに適していますが、小規模なセットアップでは大きすぎる場合があり、高ワークロードのシナリオでは小さすぎる場合があります。最小限のワークロードシナリオ向けに OpenShift Serverless Serving を設定するには、システムコンポーネントのアイドル時の消費量を把握する必要があります。
2.3.2.1. アイドル時の消費
アイドル時の消費量は Knative Service の数に依存します。knative-serving
および knative-serving-ingress
OpenShift Container Platform プロジェクトのコンポーネントについて、次のメモリー使用量が測定されました。
コンポーネント | 0 サービス | 100 サービス | 500 サービス | 1000 サービス |
---|---|---|---|---|
| 55Mi | 86Mi | 300 Mi | 450Mi |
| 52Mi | 102Mi | 225Mi | 350Mi |
| 100Mi | 135Mi | 310Mi | 500 Mi |
| 60Mi | 60Mi | 60Mi | 60Mi |
| 20Mi | 60Mi | 190Mi | 330Mi |
| 90Mi | 170Mi | 340Mi | 430Mi |
3scale-kourier-gateway
および net-kourier-controller
コンポーネント、または istio-ingressgateway
および net-istio-controller
コンポーネントのいずれかがインストールされています。
net-istio
のメモリー消費量は、メッシュ内の Pod の合計数に基づいています。
2.3.3. 最小限のワークロード向けのサービングの設定
手順
KnativeServing
カスタムリソース (CR) を使用して、最小限のワークロード用に Knative Serving を設定できます。KnativeServing CR における最小限のワークロード設定
apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving spec: high-availability: replicas: 1 1 workloads: - name: activator replicas: 2 2 resources: - container: activator requests: cpu: 250m 3 memory: 60Mi 4 limits: cpu: 1000m memory: 600Mi - name: controller replicas: 1 5 resources: - container: controller requests: cpu: 10m memory: 100Mi limits: 6 cpu: 200m memory: 300Mi - name: webhook replicas: 2 resources: - container: webhook requests: cpu: 100m 7 memory: 60Mi limits: cpu: 200m memory: 200Mi podDisruptionBudgets: 8 - name: activator-pdb minAvailable: 1 - name: webhook-pdb minAvailable: 1
- 1
- これを
1
に設定すると、すべてのシステムコンポーネントが 1 つのレプリカにスケーリングされます。 - 2
- ダウンタイムを回避するために、Activator は常に最低でも
2
つのインスタンスにスケーリングする必要があります。 - 3
- Activator CPU リクエストは
250m
未満に設定しないでください。HorizontalPodAutoscaler
は、これをスケールアップおよびスケールダウンの基準として使用するためです。 - 4
- メモリーリクエストを前の表のアイドル値に調整します。また、予想される負荷に応じてメモリー制限を調整します (最適な値を見つけるにはカスタムテストが必要になる場合があります)。
- 5
- 最小限のワークロードのシナリオでは、1 つの Webhook と 1 つのコントローラーで十分です。
- 6
- これらの制限は、最小限のワークロードのシナリオには十分ですが、具体的なワークロードに応じて調整することを推奨します。
- 7
- Webhook CPU リクエストは
100m
未満に設定しないでください。HorizontalPodAutoscaler はこれをスケールアップおよびスケールダウンの基準として使用するためです。 - 8
- ノードメンテナンス中に問題が発生しないように、
PodDistruptionBudgets
をreplicas
よりも低い値に調整します。
2.3.4. 高ワークロード向け Serving の設定
KnativeServing
カスタムリソース (CR) を使用して、高ワークロード向けに Knative Serving を設定できます。以下の調査結果は、高ワークロード向け Knative Serving の設定に関連しています。
これらの調査結果は、ペイロードサイズが 0 - 32 kb のリクエストでテストされています。これらのテストで使用された Knative Service バックエンドの起動時のレイテンシーは 0 - 10 秒、応答時間は 0 - 5 秒でした。
- すべてのデータプレーンコンポーネントは、リクエストやペイロードのシナリオが増えると CPU 使用率が増加するため、CPU リクエストと制限をテストし、必要に応じて増やす必要があります。
- アクティベーターコンポーネントは、より多くの、またはより大きなリクエストペイロードをバッファーリングする必要がある場合、より多くのメモリーを必要とする可能性があるため、メモリーリクエストと制限も同様に増やすことを推奨します。
- 1 つのアクティベーター Pod は、レイテンシーが増加し始め、ある時点でエラーが発生するまで、1 秒あたり約 2500 件のリクエストを処理できます。
-
1 つの
3scale-kourier-gateway
またはistio-ingressgateway
Pod も、レイテンシーが増加し始め、ある時点でエラーが発生する前に、1 秒あたり約 2500 件のリクエストを処理できます。 - 各データプレーンコンポーネントは、1 秒あたり 2500 件のリクエストを処理するために最大 1 仮想 CPU の CPU を消費します。これは、ペイロードサイズと Knative Service バックエンドの応答時間に大きく依存することに注意してください。
Knative Service ユーザーワークロードの高速起動と高速応答時間は、システム全体の良好なパフォーマンスにとって重要です。Knative Serving コンポーネントは、Knative Service ユーザーバックエンドがスケールアップしているとき、またはリクエストの同時実行性が容量に達したときに、受信リクエストをバッファリングします。Knative Service のユーザーワークロードによって起動やリクエストのレイテンシーが長くなると、activator
コンポーネントが過負荷になるか (CPU とメモリーの設定が低すぎる場合)、呼び出し元のクライアントでエラーが発生します。
手順
インストールを微調整するには、以前の調査結果と独自のテスト結果を組み合わせて、
KnativeServing
カスタムリソースを設定します。KnativeServing CR での高ワークロード設定
apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving spec: high-availability: replicas: 2 1 workloads: - name: component-name 2 replicas: 2 3 resources: - container: container-name requests: cpu: 4 memory: limits: cpu: memory: podDisruptionBudgets: 5 - name: name-of-pod-disruption-budget minAvailable: 1
- 1
- このパラメーターを少なくとも
2
に設定して、すべてのコンポーネントのインスタンスが常に少なくとも 2 つ実行されるようにします。workloads
を使用して、特定のコンポーネントのレプリカをオーバーライドすることもできます。 - 2
workloads
リストを使用して、特定のコンポーネントを設定します。コンポーネントのdeployment
名を使用し、replicas
フィールドを設定します。- 3
- Horizontal Pod Autoscaler (HPA) を使用する
activator
、webhook
、および3scale-kourier-gateway
コンポーネントの場合、replicas
フィールドでレプリカの最小数を設定します。レプリカの実際の数は、CPU 負荷と HPA によって実行されるスケーリングによって異なります。 - 4
- 以前の調査結果と独自のテスト結果も考慮しながら、少なくともアイドル時の消費量に応じて、リクエストおよび制限された CPU とメモリーを設定します。
- 5
- ノードのメンテナンス中に問題が発生しないように、
PodDistruptionBudgets
をreplicas
よりも低い値に調整します。デフォルトのminAvailable
は1
に設定されているため、必要なレプリカを増やす場合は、minAvailable
も増やす必要があります。
各環境は非常に特殊であるため、テストを行って独自の理想的な設定を見つけることが重要です。OpenShift Container Platform のモニタリングおよびアラート機能を使用して、実際のリソース消費を継続的に監視し、必要に応じて調整を行います。
OpenShift Serverless と Service Mesh のインテグレーションを使用している場合は、istio-proxy
サイドカーコンテナーによって追加の CPU 処理が追加されます。詳細は、Service Mesh のドキュメントを参照してください。