コンテンツに移動
デベロッパー

Cloud Spanner API のリクエスト優先度の概要

2021年4月19日
https://storage.googleapis.com/gweb-cloudblog-publish/images/cloud_spanner.max-2600x2600.jpg
Google Cloud Japan Team

※この投稿は米国時間 2021 年 4 月 7 日に、Google Cloud blog に投稿されたものの抄訳です。

このたび、一部の Cloud Spanner API のリクエスト優先度を指定できるようになりました。特定のリクエストに [高]、[中]、[低] の優先度を割り当てることによって、ワークロードの相対的な重要度を伝え、リソースの使用量をパフォーマンス目標に合わせて調整しやすくなりました。Cloud Spanner は内部で優先度を使用して、多数のタスクが限られたリソースを求めて競合する状況で最初にスケジュール設定するワークロードを区別します。

この機能は、Cloud Spanner インスタンスで混合ワークロードを実行している場合に活用できます。たとえば、DML ステートメントの処理中に分析ワークロードを実行する必要があり、分析ワークロードの実行に時間がかかっても差し支えない場合です。その場合は分析クエリを低の優先度で実行し、トレードオフが必要な場合は、緊急性の高い作業を先に並べ替える可能性があることを Spanner に通知します。

利用可能なリソースが十分にある場合は、すべてのリクエストが優先度に関係なく迅速に処理されます。高の優先度のリクエストと低の優先度のリクエストがあり、優先度以外は同一の場合、リソースの競合がなければ、2 つのリクエストの間でレイテンシが大きく異なることはありません。Spanner は分散システムとして、優先度に関係なく複数のタスクを並行して実行するように設計されています。ただし、トラフィックの急増や大規模なバッチ処理など、十分なリソースが行き渡らない状況では、スケジューラは最初に優先度の高いタスクを実行しようとします。そのため、優先度の低いタスクは、リソース制限のない同様のシステムよりも時間がかかる可能性があります。指定した優先度は保証されるわけではなく、スケジューラによる優先順位付けの指針にすぎない点にご注意ください。優先度の低いリクエストが優先度の高いリクエストよりも先に処理されることもあります。たとえば、優先度の高いリクエストによってアクセスされる必要のあるトランザクションのロックを、優先度の低いリクエストが保持している場合があります。

リクエストの優先度を使用する

優先度パラメータは新しいオプションの RequestOptions に含まれ、次の API で指定できます。

1.Read

2.StreamingRead

3.ExecuteSql

4.ExecuteStreamingSql

5.Commit

6.ExecuteBatchDml

新しく追加された優先度パラメータには、RPC APIREST API に直接リクエストを発行する場合、または JavaGo クライアント ライブラリを介してリクエストを発行する場合にアクセスできます。その他のクライアント ライブラリでは、まもなく優先度パラメータのサポートが実装されます。

次のサンプルコードは、Java クライアント ライブラリを使用して読み取りリクエストの優先度を指定する方法を示しています。

QueryOption queryOption = new PriorityOption(RpcPriority.LOW);

ResultSet resultSet = dbClient.singleUse().executeQuery(Statement.of("SELECT * FROM TABLE"), queryOption);

注: リクエストごとに優先度を指定できますが、同じトランザクションに含まれるリクエストにはすべて同じ優先度を指定することをおすすめします。

モニタリング

Cloud Console は、前述の新しい優先度を CPU 使用率に反映し、指標を [高] バケットと [低 / 中] バケットにグループ化します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image1_fueJBos.max-1500x1500.max-1500x1500.png

上のスクリーンショットでは、5:08 の時点で低優先度のワークロードが実行されていて、他に競合するワークロードはありませんでした。低の優先度ワークロードには、使用可能な CPU の 100% が割り振られていました。ところが、高の優先度のワークロードが 5:09 ぐらいに開始されると、高の優先度のワークロードがすぐに処理され、低の優先度のワークロードの CPU 使用率は 60% に低下しました。高の優先度のワークロードが完了すると、低の優先度のワークロードは使用可能な CPU の 100% を使用して再開されました。

RPC APIREST API にリクエストを発行したり、JavaGo クライアント ライブラリを介してリクエストを発行したりして、新しく追加された優先度パラメータをぜひお試しください。

-Cloud Spanner 担当ソフトウェア エンジニア Jerene Yang

投稿先