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 における最小限のワークロード設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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-ingressgatewayPod も、レイテンシーが増加し始め、ある時点でエラーが発生する前に、1 秒あたり約 2500 件のリクエストを処理できます。 - 各データプレーンコンポーネントは、1 秒あたり 2500 件のリクエストを処理するために最大 1 仮想 CPU の CPU を消費します。これは、ペイロードサイズと Knative Service バックエンドの応答時間に大きく依存することに注意してください。
Knative Service ユーザーワークロードの高速起動と高速応答時間は、システム全体の良好なパフォーマンスにとって重要です。Knative Serving コンポーネントは、Knative Service ユーザーバックエンドがスケールアップしているとき、またはリクエストの同時実行性が容量に達したときに、受信リクエストをバッファリングします。Knative Service のユーザーワークロードによって起動やリクエストのレイテンシーが長くなると、activator コンポーネントが過負荷になるか (CPU とメモリーの設定が低すぎる場合)、呼び出し元のクライアントでエラーが発生します。
手順
インストールを微調整するには、以前の調査結果と独自のテスト結果を組み合わせて、
KnativeServingカスタムリソースを設定します。KnativeServing CR での高ワークロード設定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 のドキュメントを参照してください。