このドキュメントでは、Tair (Enterprise Edition) の SSD ベースのインスタンスのパフォーマンスベンチマークに関するテスト環境、ツール、方法、および結果について説明します。
テスト環境
項目 | 説明 |
リージョンとゾーン | 杭州ゾーン J |
インスタンスアーキテクチャ | 標準マスター/レプリカアーキテクチャ。詳細については、「標準アーキテクチャ」をご参照ください。 |
ストレステストホスト |
|
テスト対象のインスタンスタイプ |
|
このベンチマークは、メモリ使用率の両極端を表す 2 つのシナリオを対象としています:
メモリサイズがデータ量より大きい:ほとんどのデータがメモリに収まります。メモリとデータの比率は約 7:1 です。これは、メモリ主体のアクセスパターンを表します。
データ量がメモリサイズより大きい:データの一部のみがメモリにキャッシュされ、ほとんどの読み取り/書き込みリクエストでディスク I/O が必要になります。メモリとデータの比率は約 1:4 です。これは、SSD 主体のアクセスパターンを表します。
テストツール
このベンチマークでは、オープンソースの Java ベースのデータベースベンチマークフレームワークである YCSB を使用します。
YCSB のソースコードは、LONG 型の recordcount パラメーターをサポートし、Redis の string コマンドをテストするように変更されています。変更されたソースコードについては、「YCSB ソースコード」をご参照ください。
テストスクリプト
次のスクリプトは、データ量がメモリサイズより大きいシナリオのパフォーマンステストを実行します:
#!/bin/bash
ip=192.168.0.23
port=3100
timeout=30000
command_group=string
recordcount=640000000
run_operationcount=640000000
fieldcount=1
fieldlength=100
threads=64
load_sleep_time=600
run_sleep_time=60
echo "##################################### $command_group ############################################"
# データロード
./bin/ycsb load redis -s -P workloads/workloada \
-p "redis.host=${ip}" -p "redis.port=${port}" \
-p "recordcount=${recordcount}" -p "operationcount=${recordcount}" \
-p "redis.timeout=${timeout}" -p "redis.command_group=${command_group}" \
-p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" \
-threads ${threads}
sleep ${load_sleep_time}
# 均一分布読み取り
./bin/ycsb run redis -s -P workloads/workloadc \
-p "redis.host=${ip}" -p "redis.port=${port}" \
-p "recordcount=${recordcount}" -p "operationcount=${run_operationcount}" \
-p "redis.timeout=${timeout}" -p "redis.command_group=${command_group}" \
-p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" \
-p "requestdistribution=uniform" -threads ${threads}
sleep ${run_sleep_time}
# Zipf分布読み取り
./bin/ycsb run redis -s -P workloads/workloadc \
-p "redis.host=${ip}" -p "redis.port=${port}" \
-p "recordcount=${recordcount}" -p "operationcount=${run_operationcount}" \
-p "redis.timeout=${timeout}" -p "redis.command_group=${command_group}" \
-p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" \
-p "requestdistribution=zipfian" -threads ${threads}
sleep ${run_sleep_time}
# 均一分布 50% 読み取り/50% 更新
./bin/ycsb run redis -s -P workloads/workloada \
-p "redis.host=${ip}" -p "redis.port=${port}" \
-p "recordcount=${recordcount}" -p "operationcount=${run_operationcount}" \
-p "redis.timeout=${timeout}" -p "redis.command_group=${command_group}" \
-p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" \
-p "requestdistribution=uniform" -threads ${threads}パラメーター
パラメーター | 説明 |
| Tair インスタンスの IP アドレス |
| Tair インスタンスのサービスポート |
| コマンドのタイムアウト。単位:ms |
| テストするデータ型。 |
| データロードフェーズでロードされるレコード数 |
| 実行フェーズでの操作数。どちらのシナリオでも、この値を |
| レコードあたりのフィールド数。 |
| 各フィールドの長さ (バイト単位)。 |
| YCSB クライアントのスレッド数。インスタンスタイプによって異なります。 |
テストメトリクス
メトリクス | 説明 |
QPS | 1 秒あたりに処理される読み取りおよび書き込み操作の数 |
平均レイテンシー | 読み取りまたは書き込み操作の平均レイテンシー。単位:µs |
99 パーセンタイルレイテンシー | 操作の 99% が完了する最大レイテンシー。単位:µs。たとえば、値が 500 µs の場合、99% の操作が 500 µs 以内に完了することを意味します。 |
テスト結果
メモリサイズがデータ量より大きい場合
メモリとデータの比率は約 7:1 です。ほとんどのリクエストはメモリから処理されます。
インスタンスタイプ | YCSB 設定 | ワークロード | QPS | 平均レイテンシー (µs) | 99 パーセンタイルレイテンシー (µs) |
| recordcount=20,000,000 run_operationcount=20,000,000 threads=64 fieldlength=100 | ロード | 42,275 | 1,511 | 4,987 |
均一分布読み取り | 104,303 | 611 | 2,163 | ||
Zipf分布読み取り | 105,217 | 605 | 2,259 | ||
均一分布 50% 読み取り/50% 更新 | 52,267 | 読み取り:1,114 | 読み取り:4,191 | ||
更新:1,329 | 更新:4,827 | ||||
| recordcount=40,000,000 run_operationcount=40,000,000 threads=128 fieldlength=100 | ロード | 64,104 | 1,993 | 5,951 |
均一分布読み取り | 174,533 | 730 | 2,049 | ||
Zipf分布読み取り | 177,612 | 718 | 2,033 | ||
均一分布 50% 読み取り/50% 更新 | 75,762 | 読み取り:1,509 | 読み取り:4,667 | ||
更新:1,864 | 更新:5,479 | ||||
| recordcount=60,000,000 run_operationcount=60,000,000 threads=192 fieldlength=100 | ロード | 116,107 | 1,647 | 9,983 |
均一分布読み取り | 225,613 | 847 | 3,687 | ||
Zipf分布読み取り | 234,014 | 816 | 3,279 | ||
均一分布 50% 読み取り/50% 更新 | 138,884 | 読み取り:1,321 | 読み取り:8,131 | ||
更新:1,435 | 更新:8,479 | ||||
| recordcount=120,000,000 run_operationcount=120,000,000 threads=384 fieldlength=100 | ロード | 170,447 | 2,246 | 11,935 |
均一分布読み取り | 323,136 | 1,184 | 4,005 | ||
Zipf分布読み取り | 330,023 | 1,159 | 3,951 | ||
均一分布 50% 読み取り/50% 更新 | 207,350 | 読み取り:1,759 | 読み取り:9,031 | ||
更新:1,934 | 更新:9,439 |
データ量がメモリサイズより大きい場合
メモリとデータの比率は約 1:4 です。ほとんどのリクエストでディスク I/O が必要になるため、レイテンシーは上記のメモリ主体のシナリオよりも高くなります。
インスタンスタイプ | YCSB 設定 | ワークロード | QPS | 平均レイテンシー (µs) | 99 パーセンタイルレイテンシー (µs) |
| recordcount=640,000,000 run_operationcount=640,000,000 threads=64 fieldlength=100 | ロード | 33,198 | 1,925 | 7,699 |
均一分布読み取り | 48,243 | 1,324 | 3,659 | ||
Zipf分布読み取り | 66,635 | 958 | 3,003 | ||
均一分布 50% 読み取り/50% 更新 | 28,779 | 読み取り:2,169 | 読み取り:7,531 | ||
更新:2,272 | 更新:7,851 | ||||
| recordcount=1,280,000,000 run_operationcount=1,280,000,000 threads=128 fieldlength=100 | ロード | 48,605 | 2,631 | 8,463 |
均一分布読み取り | 83,687 | 1,527 | 3,889 | ||
Zipf分布読み取り | 113,742 | 1,123 | 3,351 | ||
均一分布 50% 読み取り/50% 更新 | 46,606 | 読み取り:2,652 | 読み取り:8,815 | ||
更新:2,835 | 更新:9,367 | ||||
| recordcount=1,920,000,000 run_operationcount=1,920,000,000 threads=192 fieldlength=100 | ロード | 89,421 | 2,144 | 15,351 |
均一分布読み取り | 115,967 | 1,653 | 9,311 | ||
Zipf分布読み取り | 155,686 | 1,231 | 6,359 | ||
均一分布 50% 読み取り/50% 更新 | 72,890 | 読み取り:2,585 | 読み取り:16,479 | ||
更新:2,676 | 更新:16,719 | ||||
| recordcount=3,840,000,000 run_operationcount=3,840,000,000 threads=384 fieldlength=100 | ロード | 137,521 | 2,789 | 16,591 |
均一分布読み取り | 185,273 | 2,070 | 8,575 | ||
Zipf分布読み取り | 238,099 | 1,610 | 6,203 | ||
均一分布 50% 読み取り/50% 更新 | 128,080 | 読み取り:2,930 | 読み取り:15,535 | ||
更新:3,060 | 更新:15,807 |
