ApsaraDB RDS for MySQL (RDS) インスタンスの max_prepared_stmt_count パラメーターを変更することで、ストレステストワークロードや、より高いプリペアドステートメントの制限が必要なその他のシナリオをサポートできます。このトピックでは、このパラメーターが何を制御するか、Sysbench ベースのストレステストに適した値の計算方法、およびご利用の RDS インスタンスでパラメーターを変更する方法について説明します。
概要
max_prepared_stmt_count パラメーターは、MySQL サーバーで許可されるサーバーサイドプリペアドステートメントの最大合計数を設定します。その主な目的は、攻撃者が大量のプリペアドステートメントを開いて RDS インスタンスのメモリを枯渇させるようなサービス拒否 (DoS) 攻撃を防ぐことです。
| プロパティ | 値 |
|---|---|
| デフォルト値 | 16382 |
| 有効範囲 | 0 から 1048576 |
| 適用タイプ | 動的 (再起動なしで即座に有効) |
| メモリコスト | プリペアドステートメントあたり少なくとも 8 KB |
このシステム変数の詳細については、MySQL ドキュメントの「max_prepared_stmt_count」をご参照ください。
値を増やすタイミング
デフォルト値の 16382 は、ほとんどの本番ワークロードで十分です。ただし、次のシナリオでは max_prepared_stmt_count を増やす必要があります。
Sysbench ベースのストレステスト: 高並行ベンチマークでは、複数のスレッドとテーブルにわたって多数のプリペアドステートメントが作成され、多くの場合、デフォルトの制限を超えます。
max_prepared_stmt_count パラメーターに特別な要件があるシナリオ: 広範なプリペアドステートメントのキャッシュまたはコネクションプーリングを使用するアプリケーションでは、より高い制限が必要になる場合があります。
制限に達すると、MySQL は次のエラーを返します。
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"Sysbench ストレステストの値を計算する
この例では、Sysbench 1.0.20 を使用します。以下の数式は、Sysbench ソースコードの分析から導き出されたもので、各テストモデルが作成するプリペアドステートメントの数を示しています。ストレステストを実行する前に、max_prepared_stmt_count の値がご利用のモデルで計算された数以上であることを確認してください。
| テストモデル | プリペアドステートメント数 |
|---|---|
oltp_read_only | >= スレッド数 x テーブル数 x 5 + スレッド数 |
oltp_write_only | >= スレッド数 x テーブル数 x 4 + スレッド数 |
oltp_read_write | >= スレッド数 x テーブル数 x 9 + スレッド数 |
oltp_insert | 0. プリペアドステートメントは使用されません。 |
計算例
256 スレッドと 100 テーブルを使用した oltp_read_only テストの場合、プリペアドステートメントの数は次のとおりです。
256 x 100 x 5 + 256 = 128,256ストレステストを開始する前に、max_prepared_stmt_count を 128256 より大きい値に設定してください。
操作手順
max_prepared_stmt_count パラメーターを変更するには、ご利用の RDS インスタンスの標準のパラメーター変更プロセスに従ってください。詳細な手順については、「インスタンスパラメーターの変更」をご参照ください。
概要:
ApsaraDB RDS コンソールにログインします。
ご利用の RDS インスタンスを見つけて、[パラメーター] ページに移動します。
max_prepared_stmt_countを検索し、値を変更します。[変更を適用] をクリックします。これは動的パラメーターであるため、変更は再起動なしで即座に有効になります。
パラメーターを変更した後、次の SQL ステートメントを実行して新しい値を確認します。
SHOW GLOBAL VARIABLES LIKE 'max_prepared_stmt_count';プリペアドステートメントの使用状況を監視する
サーバーで現在開かれているプリペアドステートメントの数を確認するには、次を実行します。
SHOW GLOBAL STATUS LIKE 'Prepared_stmt_count';この値を監視することで、max_prepared_stmt_count を増やすべきか減らすべきかを判断するのに役立ちます。Prepared_stmt_count が通常の操作中に常に制限に近づく場合は、パラメーターを増やすことを検討してください。制限を大幅に下回る場合は、デフォルトを維持するか、ストレステスト後に値を減らすことができます。
リスクと推奨事項
Sysbench ベースのストレステストシナリオでは、テスト要件を満たすために
max_prepared_stmt_countの値を一時的に増やす必要があります。ストレステストが完了した後、メモリリスクとセキュリティリスクを防ぐために、パラメーターの値を減らすことを推奨します。パラメーターの値を増減した後、次のリスクに注意してください。
増加のリスク: 各プリペアドステートメントは少なくとも 8 KB のメモリを占有します。高い値を設定すると、より多くのプリペアドステートメントが蓄積され、RDS インスタンスのメモリ消費量が増加し、攻撃に対してより脆弱になります。
減少のリスク: 既存のプリペアドステートメントは影響を受けません。ただし、現在のプリペアドステートメント数が新しい下限を超えると、以前に開かれたステートメントが解放されるまで、新しいプリペアドステートメントは作成できません。