IOPSリソースの分離を制御する前に、ディスク性能のキャリブレーションを実行できます。IOPSの実際の性能精度に対する要求が高くない場合は、この手順をスキップしてもかまいません。
説明
現在のバージョンでは、CPUおよびIOPSリソースの分離は、ディスク性能のキャリブレーション操作に強く依存しなくなりました。
IOPSベンチマーク値の計算
ディスク性能のキャリブレーションは、主にディスクのIOPS値を校正することです。IOPSベンチマーク値の計算式は以下の通りです:
IOPSベンチマーク値 = Min(ディスク制限のIOPS値, (目標帯域幅 / I/O操作のデータ量))
ここで、目標帯域幅の値は以下の点を考慮して決定する必要があります:
マシンの仕様、つまり実際に申請するディスクの制限帯域幅。
ビジネスにおけるRT(応答時間)の感度要件。
IO Managerが使用する帯域幅を差し引く必要があること。
通常、clog用に10~20MBの帯域幅を予約する必要があること。
16KBのデータ読み取りを例にとると、ディスクに対応する16KBデータ読み取りのIOPSベンチマーク値を計算する方法は以下の通りです。現在使用中のディスクの制限帯域幅が600MB、IOPSが30000であり、ビジネスのRTに対する感度が高い場合、600MBを全て使用するとジッター発生の確率が大幅に増加します。さらにclog用に予約された帯域幅を差し引き、総合的に判断して目標帯域幅を400MBとします。16KBデータ読み取りで計算された400MB帯域幅で達成可能な最大IOPSは(400 * 1024 KB)/16 KB=25600であるため、IOPS値を25600に校正できます。計算されたIOPS値がそのディスクのIOPS上限に達しているか超えている場合、例えば、あるディスクのIOPS上限が10000の場合は、IOPS値を10000に校正できます。
キャリブレーション方法
OceanBaseデータベースのディスク性能キャリブレーション機能は、OBServerノードが配置されているディスクの読み書き性能を校正するために使用されます。OceanBaseデータベースは現在、以下の2つの方法でディスクの性能キャリブレーションをサポートしています:
自動キャリブレーション:
JOBステートメントを使用してバックグラウンドタスクをトリガーし、自動的にキャリブレーションを行います。手動キャリブレーション:ディスクキャリブレーション情報を手動でリフレッシュすることで、手動でキャリブレーションを行います。
自動キャリブレーション
現在のOceanBaseクラスタがアイドル負荷であり、かつディスクに十分な空き容量がある場合、JOBステートメントを使用してバックグラウンドタスクをトリガーすることで、ディスク性能を自動的にキャリブレーションできます。この方法では、システムはデフォルトでデータディスクに対して1回のディスクキャリブレーションタスクを実行します。
rootユーザーでクラスタのsysテナントにログインします。接続例は以下の通りです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -Aデータベース接続の詳細な操作手順については、データベース接続の概要を参照してください。
業務の使用シナリオに応じて、適切なコマンドを選択し、ディスクキャリブレーションタスクをトリガーします。
クラスタ内のすべてのOBServerノードに対してディスクキャリブレーションタスクをトリガーする
ALTER SYSTEM RUN JOB "job_name";ここで、
job_nameは指定されたバックグラウンドタスク名です。ディスクキャリブレーションタスクに対応するバックグラウンドタスク名はio_calibrationです。例:
ALTER SYSTEM RUN JOB "io_calibration";指定されたZone内のすべてのOBServerノードに対してディスクキャリブレーションタスクをトリガーする
ステートメントは以下の通りです:
ALTER SYSTEM RUN JOB "job_name" ZONE [=] zone_name;関連パラメータの説明は以下の通りです:
job_name:指定されたバックグラウンドタスク名です。ディスクキャリブレーションタスクに対応するバックグラウンドタスク名はio_calibrationです。zone_name:ディスクキャリブレーションタスクをトリガーするZoneを指定します。現在は1つのZoneのみ指定可能です。
例:
ALTER SYSTEM RUN JOB "io_calibration" ZONE = zone1;指定された特定のOBServerノードに対してディスクキャリブレーションタスクをトリガーする
ステートメントは以下の通りです:
ALTER SYSTEM RUN JOB "job_name" SERVER [=] 'svr_ip:svr_port';関連パラメータの説明は以下の通りです:
job_name:指定されたバックグラウンドタスク名です。ディスクキャリブレーションタスクに対応するバックグラウンドタスク名はio_calibrationです。svr_ip:ディスクキャリブレーションタスクをトリガーするOBServerノードのIPを指定します。現在は1つのOBServerノードのみ指定可能です。svr_port:ディスクキャリブレーションタスクをトリガーするOBServerノードのRPCポートを指定します。
例:
ALTER SYSTEM RUN JOB "io_calibration" SERVER = 'xx.xx.xx.1:2882';
ディスクI/Oキャリブレーションの状態を確認します。
ディスクキャリブレーションタスクをトリガーした後、
GV$OB_IO_CALIBRATION_STATUSまたはV$OB_IO_CALIBRATION_STATUSビューを使用してI/Oキャリブレーションの状態を確認できます。SELECT * FROM oceanbase.V$OB_IO_CALIBRATION_STATUS;クエリ結果は次のとおりです:
+----------------+----------+--------------+-------------+----------------------------+-------------+ | SVR_IP | SVR_PORT | STORAGE_NAME | STATUS | START_TIME | FINISH_TIME | +----------------+----------+--------------+-------------+----------------------------+-------------+ | xx.xx.xx.197 | 2882 | DATA | IN PROGRESS | 2023-06-27 14:30:38.393482 | NULL | +----------------+----------+--------------+-------------+----------------------------+-------------+ 1 row in setディスクI/Oキャリブレーションの状態は以下のように分類されます:
NOT AVAILABLE:I/Oキャリブレーションが開始されていないことを示します。IN PROGRESS:I/Oキャリブレーションが進行中であることを示します。READY:I/Oキャリブレーションが完了したことを示します。FAILED:I/Oキャリブレーションの実行に失敗したことを示します。
クエリ結果から、
STATUSフィールドの値がIN PROGRESSであることがわかります。これはディスクI/Oキャリブレーションが進行中であることを意味します。ディスクI/Oキャリブレーションが完了すると、STATUSフィールドの値はREADYに変わり、ディスクキャリブレーションが完了したことを示します。同時に、FINISH_TIMEフィールドに完了時間が表示されます。+----------------+----------+--------------+--------+----------------------------+----------------------------+ | SVR_IP | SVR_PORT | STORAGE_NAME | STATUS | START_TIME | FINISH_TIME | +----------------+----------+--------------+--------+----------------------------+----------------------------+ | xx.xx.xx.197 | 2882 | DATA | READY | 2023-06-27 14:25:20.202022 | 2023-06-27 14:27:00.398748 | +----------------+----------+--------------+--------+----------------------------+----------------------------+ 1 row in setディスクI/Oキャリブレーションが有効になっているかどうかを確認します。
ディスクI/Oキャリブレーションが完了した後、
GV$OB_IO_BENCHMARKまたはV$OB_IO_BENCHMARKビューを使用して、ディスクI/Oキャリブレーションが有効になっているかどうかを確認できます。SELECT * FROM oceanbase.GV$OB_IO_BENCHMARK;クエリ結果の例は以下のとおりです:
+----------------+----------+--------------+-------+---------+--------+------+---------+ | SVR_IP | SVR_PORT | STORAGE_NAME | MODE | SIZE | IOPS | MBPS | LATENCY | +----------------+----------+--------------+-------+---------+--------+------+---------+ | xx.xx.xx.197 | 2882 | DATA | READ | 4096 | 124648 | 486 | 128 | | xx.xx.xx.197 | 2882 | DATA | READ | 8192 | 118546 | 926 | 134 | | xx.xx.xx.197 | 2882 | DATA | READ | 16384 | 98870 | 1544 | 161 | | xx.xx.xx.197 | 2882 | DATA | READ | 32768 | 73857 | 2308 | 216 | | xx.xx.xx.197 | 2882 | DATA | READ | 65536 | 48015 | 3000 | 332 | | xx.xx.xx.197 | 2882 | DATA | READ | 131072 | 33780 | 4222 | 473 | | xx.xx.xx.197 | 2882 | DATA | READ | 262144 | 20650 | 5162 | 774 | | xx.xx.xx.197 | 2882 | DATA | READ | 524288 | 12111 | 6055 | 1321 | | xx.xx.xx.197 | 2882 | DATA | READ | 1048576 | 6237 | 6237 | 2565 | | xx.xx.xx.197 | 2882 | DATA | READ | 2097152 | 2762 | 5524 | 5795 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 4096 | 49771 | 194 | 321 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 8192 | 48566 | 379 | 329 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 16384 | 42784 | 668 | 373 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 32768 | 35187 | 1099 | 454 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 65536 | 24892 | 1555 | 642 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 131072 | 12720 | 1590 | 1257 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 262144 | 6889 | 1722 | 2322 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 524288 | 3452 | 1726 | 4636 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 1048576 | 1689 | 1689 | 9481 | | xx.xx.xx.197 | 2882 | DATA | WRITE | 2097152 | 876 | 1752 | 18296 | +----------------+----------+--------------+-------+---------+--------+------+---------+ 20 rows in set関連フィールドの説明は以下のとおりです:
STORAGE_NAME:ストレージ名を表します。DATAはデータディスクを表します。MODE:I/Oモードが読み取りまたは書き込みであることを表します。SIZE:単一のI/Oリクエストのデータ量を表します。単位はバイトです。IOPS:1秒間に完了するI/Oリクエストの数を表します。MBPS:ディスク帯域幅を表します。単位はMB/sです。LATENCY:ディスク応答時間を表します。単位はusです。
手動キャリブレーション
現在のOceanBaseクラスタに負荷がある場合、ディスクキャリブレーション情報を手動でリフレッシュすることで、ディスク性能を手動でキャリブレーションできます。
rootユーザーでクラスタのsysテナントにログインします。接続例は以下のとおりです。データベースへの接続時は、実際の環境に合わせてください。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -Aデータベース接続の詳細な操作手順については、データベース接続の概要を参照してください。
業務の使用シナリオに応じて、適切なコマンドを選択し、ディスクキャリブレーション情報を手動でリフレッシュします。
クラスタ内のすべてのOBServerノードのディスク性能情報を一度リフレッシュする
ALTER SYSTEM REFRESH IO CALIBRATION [STORAGE [=] 'storage_name'] [CALIBRATION_INFO [=] ("mode : size : latency : iops" [, "mode : size : latency : iops"])];クラスタ内のすべてのOBServerノードのディスク性能情報をクリアする
ALTER SYSTEM REFRESH IO CALIBRATION [STORAGE [=] 'storage_name'] CALIBRATION_INFO = ("");指定されたZone内のすべてのOBServerノードのディスクキャリブレーション情報を一度リフレッシュする
ALTER SYSTEM REFRESH IO CALIBRATION [STORAGE [=] 'storage_name'] [CALIBRATION_INFO [=] ("mode : size : latency : iops "[, "mode : size : latency : iops"])] ZONE [=] zone_name;指定されたOBServerノードのディスクキャリブレーション情報を一度リフレッシュする
ALTER SYSTEM REFRESH IO CALIBRATION [STORAGE [=] 'storage_name'] [CALIBRATION_INFO [=] ("mode : size : latency : iops" [, "mode : size : latency : iops"])] SERVER [=] 'svr_ip:svr_port';
関連パラメータの説明は以下のとおりです:
STORAGE:OceanBaseデータベースのストレージディスク名を指定します。現在はDATAのみサポートしており、これはデータディスクを指します。CALIBRATION_INFO:リフレッシュ対象のディスクキャリブレーション情報を指定します。指定しない場合、デフォルトで内部テーブルからディスク性能情報をリフレッシュします。CALIBRATION_INFOリストでは、読み取りモードと書き込みモードの少なくとも一方で1件のレコードを指定する必要があります。指定しない場合、システムはエラーを返します。説明
ディスクキャリブレーション情報を指定する際、現在関連するディスクの負荷テストデータがない場合は、FIOツールを使用してパフォーマンス負荷テストを1回実行し、現在のディスクの性能データを取得できます。FIOツールの詳細な紹介と使用方法については、FIOツール公式サイトを参照してください。
mode:I/Oモードを指定します。r、w、read、またはwriteをサポートします。size:単一I/Oリクエストのデータ量を指定します。設定時は必ず単位を付けた数値を指定してください。例:4K。単位はK、KB、M、MB、G、GBをサポートします。latency:ディスク応答時間を指定します。デフォルトの単位は秒です。指定された値が数字のみの場合、その単位はデフォルトで秒です。設定時には必ず単位を指定し、デフォルト単位は使用しないよう強く推奨します。単位はus、ms、s、min、hをサポートします。iops:1秒間に完了するI/Oリクエストの数を指定します。単位は1です。
zone_name:ディスクキャリブレーション情報をリフレッシュするZoneを指定します。現在は1つのZoneのみ指定をサポートしています。svr_ip:ディスクキャリブレーション情報をリフレッシュするOBServerノードのIPを指定します。svr_port:ディスクキャリブレーション情報をリフレッシュするOBServerノードのRPCポートを指定します。
例:
クラスタ内のすべてのOBServerノードのデータディスクの内部テーブルからディスク性能情報を一度リフレッシュする
ALTER SYSTEM REFRESH IO CALIBRATION;クラスタ内のすべてのOBServerノードのデータディスクのディスク性能情報をクリアする
ALTER SYSTEM REFRESH IO CALIBRATION CALIBRATION_INFO = ("");zone1内のすべてのOBServerノードのデータディスクのディスクキャリブレーション情報を一度リフレッシュするALTER SYSTEM REFRESH IO CALIBRATION STORAGE = 'DATA' CALIBRATION_INFO = ("read:4K:100us:200000","write:2M:5ms:1500") ZONE = zone1;この例では、リフレッシュされるディスクキャリブレーション情報は以下のとおりです:4KBデータのランダム読み取りのRTは100マイクロ秒、IOPSは200000、2MBデータのランダム書き込みのRTは5ミリ秒、IOPSは1500です。
指定されたOBServerノードのデータディスクのディスクキャリブレーション情報を一度リフレッシュする
ALTER SYSTEM REFRESH IO CALIBRATION STORAGE = 'DATA' CALIBRATION_INFO = ("read:4K:100us:200000","write:2M:5ms:1500") SERVER = 'xx.xx.xx.1:2882';
ディスクI/Oキャリブレーションが有効になっているか確認します。
ディスクキャリブレーション情報のリフレッシュが完了したら、
GV$OB_IO_BENCHMARKまたはV$OB_IO_BENCHMARKビューを使用して、ディスクI/Oキャリブレーションが有効になっているか確認できます。SELECT * FROM oceanbase.GV$OB_IO_BENCHMARK;クエリ結果の例は以下のとおりです:
+----------------+----------+--------------+-------+---------+--------+------+---------+ | SVR_IP | SVR_PORT | STORAGE_NAME | MODE | SIZE | IOPS | MBPS | LATENCY | +----------------+----------+--------------+-------+---------+--------+------+---------+ | xx.xx.xx.197 | 2882 | DATA | READ | 4096 | 200000 | 781 | 100 | +----------------+----------+--------------+-------+---------+--------+------+---------+ 1 rows in set関連フィールドの説明は以下のとおりです:
STORAGE_NAME:ストレージ名を表します。DATAはデータディスクを表します。MODE:I/Oモードが読み取りまたは書き込みであることを表します。SIZE:単一I/Oリクエストのデータ量をバイト単位で表します。IOPS:1秒間に完了するI/Oリクエストの数を表します。MBPS:ディスク帯域幅をMB/s単位で表します。LATENCY:ディスク応答時間をマイクロ秒単位で表します。