SLO を用いた簡単なパフォーマンステスト ¶
公開日:2022-07-19 、修正日:2024-01-17
SLO を用いた簡単なパフォーマンステスト¶
著者:Srinivasan Parthasarathy、主席研究科学者兼マネージャー、DevSecOps @ IBM Research
パフォーマンステストは、HTTP および gRPC サービスの堅牢な提供における中核的な構成要素です。これを達成する1つの方法は、ターゲットサービスにリクエストのストリームを送信し、エラーとレイテンシ関連の違反について応答を評価することです。開発者の観点から、このアプローチには、i)リクエストレートなどのリクエストストリームの負荷関連の特性、ii)リクエストの形状、特にサービスがリクエストの一部として送信する必要があるペイロード/データがあるかどうか、および iii)ターゲットサービスの品質を検証するために使用されるサービスレベル目標(SLO)という3つの主要な考慮事項があります。
オープンソースの Kubernetes リリース最適化ツールであるIter8 を使用して、上記のすべてを正確に制御しながら、Knative サービスのパフォーマンステストを**数秒で**柔軟に開始できます。この記事では、これらの機能を紹介します。
Iter8 の概要¶
Iter8 は、DevOps、MLOps、SRE、およびデータサイエンスチーム向けに構築された Kubernetes リリース最適化ツールです。Iter8 を使用すると、Kubernetes アプリケーションと ML モデルのパフォーマンスを向上させ、ビジネス価値を最大化することができます。
Iter8 は次のユースケースをサポートしています。
- HTTP サービスのパフォーマンステストと SLO の検証。
- gRPC サービスのパフォーマンステストと SLO の検証。
- 任意のデータベースまたは REST API からのカスタムメトリックを使用した SLO の検証。
Iter8 実験¶
Iter8 は、実験という概念を導入しています。これは、特定の順序で実行される構成可能なタスクのリストです。
なぜ Iter8 なのか?
Iter8 には、Kubernetes アプリケーションのテストと実験を容易にする多くの強力な機能が搭載されています。それらには以下が含まれます。
- **HTTP および gRPC サービスの負荷の生成と組み込みメトリックの収集。**メトリックデータベースのセットアップと使用の必要性を排除することで、パフォーマンステストを簡素化します。
- **明確に定義されたサービスレベル目標(SLO)。**実験で SLO を簡単に定義および検証できます。
- **カスタムメトリック。**実験で任意のデータベースまたは REST API からのカスタムメトリックを使用できます。
- **準備状況チェック。**実験のパフォーマンステスト部分は、サービスの準備が整ってから開始されます。
- **HTML/テキストレポート。**視覚的な洞察を通じて、実験結果の人間による理解を促進します。
- **アサーション。**実験後、ターゲットアプリケーションが指定された SLO を満たしているかどうかを確認します。CI/CD/GitOps パイプラインでの自動化を簡素化します。アサーションが真であるか偽であるかに応じて、異なるパスに分岐します。
- **マルチループ実験。**実験タスクは、一度だけ(シングルループ)ではなく、定期的に(マルチループ)実行できます。これにより、Iter8 はメトリック値を更新し、各ループ中に最新のメトリック値を使用して SLO の検証を実行できます。
- **どこでも実験。**Iter8 実験は、Kubernetes クラスタ内、ローカル環境内、または GitHub Actions パイプライン内で開始できます。
クイックスタート¶
次のように `brew` を使用して Iter8 CLI をインストールします。こちらで説明されているように、事前にビルドされたバイナリを使用してインストールすることもできます。
brew tap iter8-tools/iter8
brew install iter8@0.11
チュートリアル:Knative HTTP サービスのパフォーマンステスト¶
このチュートリアルでは、Knative HTTP サービスの負荷を生成し、Iter8 の組み込み HTTP メトリックを収集し、指定されたサービスレベル目標(SLO)を検証する Iter8 実験を開始します。この実験は、下の図に示されています。
この Knative チュートリアルで説明されているように、Kubernetes クラスタに Knative をインストールし、Knative HTTP サービスをデプロイします。
次のように Iter8 実験を開始します。
iter8 k launch \
--set "tasks={ready,http,assess}" \
--set ready.ksvc=hello \
--set http.url=http://hello.default.svc.cluster.local:80 \
--set http.numRequests=100 \
--set http.connections=10 \
--set http.qps=20 \
--set assess.SLOs.upper.http/latency-mean=200 \
--set assess.SLOs.upper.http/error-count=0 \
--set runner=job
この実験について
この実験は、ready、http、およびassessという3つのタスクで構成されています。
readyタスクは、`hello` という名前の Knative サービスが存在し、準備ができているかどうかを確認します。
httpタスクは HTTP リクエストを送信し、Iter8 の組み込み HTTP メトリックを収集します。これは、10 の同時接続 (connections
) で 20 リクエスト/秒 (qps
) で 100 のリクエスト (numRequests
) を送信するように構成されています。タスクは、クラスタローカルの URL `http://httpbin.default/get` にリクエストを送信します。
「assess」タスクは、アプリケーションが指定されたSLO(サービスレベル目標)を満たしているかどうかを検証します。具体的には、i) サービスの平均レイテンシが200ミリ秒を超えないこと、およびii) エラーがないことを確認します。
runner パラメータの値はjob
に設定されています。これにより、Iter8はKubernetes Job ワークロードを使用してこの実験を実行できます。
実験レポートの表示¶
実験が完了したら(約5秒後)、以下の手順で実験レポートを表示します。
iter8 k report
テキストレポートは次のようになります。
Experiment summary:
*******************
Experiment completed: true
No task failures: true
Total number of tasks: 1
Number of completed tasks: 1
Latest observed values for metrics:
***********************************
Metric |value
------- |-----
built-in/http-error-count |0.00
built-in/http-error-rate |0.00
built-in/http-latency-max (msec) |203.78
built-in/http-latency-mean (msec) |17.00
built-in/http-latency-min (msec) |4.20
built-in/http-latency-p50 (msec) |10.67
built-in/http-latency-p75 (msec) |12.33
built-in/http-latency-p90 (msec) |14.00
built-in/http-latency-p95 (msec) |15.67
built-in/http-latency-p99 (msec) |202.84
built-in/http-latency-p99.9 (msec) |203.69
built-in/http-latency-stddev (msec) |37.94
built-in/http-request-count |100.00
iter8 k report -o html > report.html # view in a browser
HTMLレポートは次のようになります。
チュートリアル:Knative gRPCサービスのパフォーマンステスト¶
このチュートリアルでは、Knative gRPCサービスに負荷を生成し、Iter8の組み込みgRPCメトリクスを収集し、指定されたサービスレベル目標(SLO)を検証するIter8実験を実行します。この実験は、以下の図に示されています。
上記のチュートリアルでデプロイされたKnativeサービスをgRPCサービスに更新するには、Knative (kn
) CLI を使用して、以下の手順に従います。
kn service update hello \
--image docker.io/grpc/java-example-hostname:latest \
--port h2c:50051 \
--revision-name=grpc
次のように Iter8 実験を開始します。
iter8 k launch \
--set "tasks={ready,grpc,assess}" \
--set ready.ksvc=hello \
--set grpc.host="hello.default.svc.cluster.local:80" \
--set grpc.call="helloworld.Greeter.SayHello" \
--set grpc.total=100 \
--set grpc.concurrency=10 \
--set grpc.rps=20 \
--set grpc.protoURL="https://raw.githubusercontent.com/grpc/grpc-java/master/examples/example-hostname/src/main/proto/helloworld/helloworld.proto" \
--set grpc.data.name="frodo" \
--set assess.SLOs.upper.grpc/error-rate=0 \
--set assess.SLOs.upper.grpc/latency/mean=400 \
--set assess.SLOs.upper.grpc/latency/p90=500 \
--set runner=job \
--set logLevel=debug \
--noDownload
この実験について
この実験は、「ready」、「grpc」、「assess」という3つのタスクで構成されています。
「ready」タスクは、hello
という名前のKnativeサービスが存在し、準備完了であるかどうかを確認します。
「grpc」タスクは、gRPC呼び出しリクエストを送信し、Iter8の組み込みgRPCメトリクスを収集します。10個の同時接続(concurrency
)で20リクエスト/秒(rps
)の速度で、合計100個のtotal
リクエストを送信するように構成されています。このタスクは、ホストアドレスhello.default:50051
のクラスタローカルgRPCサービスのhelloworld.Greeter.SayHello
メソッドにリクエストを送信します。また、protoURL
から入手できるgRPCサービスのプロトコルバッファ仕様を使用して構成されています。タスクによって送信される各リクエストには、name
という名前のフィールドが1つあり、その値がfrodo
であるプロトコルバッファシリアライズされたデータオブジェクトが含まれています。
「assess」タスクは、アプリケーションが指定されたSLOを満たしているかどうかを検証します。具体的には、i) エラーがないこと、ii) サービスの平均レイテンシが400ミリ秒を超えないこと、およびiii) 90パーセンタイルレイテンシが500ミリ秒を超えないことを確認します。
runner パラメータの値はjob
に設定されています。これにより、Iter8はKubernetes Job ワークロードを使用してこの実験を実行できます。
Iter8実験チャートは、上記のHTTPチュートリアルの一部として既にダウンロードされています。--noDownload
オプションを使用すると、以前にダウンロードしたチャートを再利用できます。
実験レポートの表示¶
実験が完了したら(約5秒後)、上記のHTTPチュートリアルで説明されているように、実験レポートを表示します。
次のステップ¶
上記のチュートリアルの拡張機能とバリエーションを試してみてください。
- 独自のKnative HTTPサービスでHTTPチュートリアルを試してみてください。最低限、サービスに合わせて
ready.ksvc
とhttp.url
パラメータを変更する必要があります。また、http
タスクの他のパラメータを調べて、リクエスト数、クエリ/秒、期間、並列接続数、さまざまなタイプのリクエストペイロードなどを設定することもできます。 - 独自のKnative gRPCサービスでgRPCチュートリアルを試してみてください。最低限、サービスに合わせて
ready.ksvc
、grpc.host
、grpc.call
、grpc.data
、grpc.protoURL
パラメータを変更する必要があります。また、grpc
タスクの他のパラメータを調べて、リクエスト数、クエリ/秒、期間、並列接続数、さまざまなタイプのリクエストペイロードなどを設定することもできます。grpc
タスクを使用して、ストリーミングgRPCのパフォーマンステストを実行することもできます。 - 上記のHTTPチュートリアルで使用されているassessタスクを、Iter8の組み込みHTTPメトリクスに基づいた他のSLOで構成します。同様に、上記のgRPCチュートリアルで使用されているassessタスクを、Iter8の組み込みgRPCメトリクスに基づいた他のSLOで構成します。
- この例に記載されているように、実験結果をアサートし、実験ログを表示し、実験をクリーンアップします。 この例に記載されているように、Kubernetesクラスタではなくローカル環境で実験を実行します。