Este documento descreve o ambiente de teste, as ferramentas, a metodologia e os resultados do benchmark de desempenho de instâncias Tair (Enterprise Edition) baseadas em SSD.
Ambiente de teste
|
Item |
Descrição |
|
Região e zona |
Hangzhou Zone J |
|
Arquitetura da instância |
Arquitetura mestre-réplica padrão. Para obter mais informações, consulte Standard architecture. |
|
Host de teste de carga |
Instância Elastic Compute Service (ECS) do tipo |
|
Tipos de instância testados |
|
O benchmark abrange dois cenários que representam extremos opostos no espectro de utilização de memória:
Memória maior que o volume de dados: A maior parte dos dados cabe na memória. A proporção entre memória e dados é de aproximadamente 7:1. Esse cenário representa um padrão de acesso com predominância de memória.
Volume de dados maior que a memória: Apenas uma parcela dos dados permanece em cache na memória, e a maioria das solicitações de leitura e gravação exige E/S de disco. A proporção entre memória e dados é de aproximadamente 1:4. Esse cenário representa um padrão de acesso com predominância de SSD.
Ferramenta de teste
O benchmark utiliza o YCSB, um framework de benchmark de banco de dados open source baseado em Java.
O código-fonte do YCSB foi modificado para suportar um parâmetro recordcount do tipo LONG e testar comandos de string do Redis. Para acessar o código-fonte modificado, consulte Código-fonte do YCSB.
Script de teste
O script a seguir executa testes de desempenho para o cenário em que o volume de dados supera a memória:
#!/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 ############################################"
# Load
./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}
# Uniform-Read
./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}
# Zipfian-Read
./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}
# Uniform-50%Read-50%Update
./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}
Parâmetros
|
Parâmetro |
Descrição |
|
|
Endereço IP da instância Tair |
|
|
Porta de service da instância Tair |
|
|
Tempo limite do comando. Unidade: ms |
|
|
Tipo de dado a testar. Defina como |
|
|
Número de registros carregados durante a fase de carga de dados |
|
|
Número de operações durante a fase de execução. Em ambos os cenários, defina este valor igual a |
|
|
Número de campos por registro. Defina como |
|
|
Tamanho de cada campo em bytes. Defina como |
|
|
Número de threads do cliente YCSB. Varia conforme o tipo de instância. |
Métricas de teste
|
Métrica |
Descrição |
|
QPS |
Quantidade de operações de leitura e gravação processadas por segundo |
|
Latência média |
Latência média das operações de leitura ou gravação. Unidade: µs |
|
Latência do percentil 99 |
Maior latência observada entre os 99% de operações mais rápidas. Unidade: µs. Por exemplo, um valor de 500 µs indica que 99% das operações foram concluídas em até 500 µs. |
Resultados dos testes
Memória maior que o volume de dados
A proporção entre memória e dados é de aproximadamente 7:1. A maioria das solicitações é atendida diretamente pela memória.
Tipo de instância | Configuração do YCSB | Carga de trabalho | QPS | Latência média (µs) | Latência do percentil 99 (µs) |
| recordcount=20.000.000 run_operationcount=20.000.000 threads=64 fieldlength=100 | Load | 41.960 | 1.522 | 5.523 |
Uniform-Read | 110.867 | 574 | 2.515 | ||
Zipfian-Read | 116.309 | 547 | 2.429 | ||
Uniform-50%Read-50%Update | 53.116 | Read: 1.094 | Read: 4.025 | ||
Update: 1.310 | Update: 4.655 | ||||
| recordcount=40.000.000 run_operationcount=40.000.000 threads=128 fieldlength=100 | Load | 64.378 | 1.985 | 6.091 |
Uniform-Read | 205.584 | 620 | 2.279 | ||
Zipfian-Read | 211.290 | 603 | 2.217 | ||
Uniform-50%Read-50%Update | 80.796 | Read: 1.406 | Read: 4.631 | ||
Update: 1.756 | Update: 5.495 | ||||
| recordcount=60.000.000 run_operationcount=60.000.000 threads=192 fieldlength=100 | Load | 110.169 | 1.737 | 11.279 |
Uniform-Read | 233.028 | 820 | 4.675 | ||
Zipfian-Read | 235.489 | 811 | 4.655 | ||
Uniform-50%Read-50%Update | 122.866 | Read: 1.480 | Read: 10.311 | ||
Update: 1.635 | Update: 10.735 | ||||
| recordcount=120.000.000 run_operationcount=120.000.000 threads=384 fieldlength=100 | Load | 180.502 | 2.122 | 10.727 |
Uniform-Read | 429.252 | 891 | 3.293 | ||
Zipfian-Read | 438.533 | 872 | 3.365 | ||
Uniform-50%Read-50%Update | 231.044 | Read: 1.541 | Read: 8.663 | ||
Update: 1.772 | Update: 9.151 |

Volume de dados maior que a memória
A proporção entre memória e dados é de aproximadamente 1:4. Como a maioria das solicitações requer E/S de disco, a latência é superior à do cenário com predominância de memória apresentado acima.
Tipo de instância | Configuração do YCSB | Carga de trabalho | QPS | Latência média (µs) | Latência do percentil 99 (µs) |
| recordcount=640.000.000 run_operationcount=640.000.000 threads=64 fieldlength=100 | Load | 32.596 | 1.961 | 8.135 |
Uniform-Read | 50.227 | 1.272 | 3.753 | ||
Zipfian-Read | 71.804 | 889 | 2.947 | ||
Uniform-50%Read-50%Update | 27.063 | Read: 2.306 | Read: 8.199 | ||
Update: 2.416 | Update: 8.535 | ||||
| recordcount=1.280.000.000 run_operationcount=1.280.000.000 threads=128 fieldlength=100 | Load | 50.608 | 2.526 | 9.071 |
Uniform-Read | 78.931 | 1.619 | 4.371 | ||
Zipfian-Read | 113.338 | 1.127 | 3.347 | ||
Uniform-50%Read-50%Update | 47.564 | Read: 2.598 | Read: 8.471 | ||
Update: 2.778 | Update: 8.959 | ||||
| recordcount=1.920.000.000 run_operationcount=1.920.000.000 threads=192 fieldlength=100 | Load | 88.483 | 2.167 | 16.383 |
Uniform-Read | 119.177 | 1.609 | 8.775 | ||
Zipfian-Read | 156.079 | 1.228 | 7.663 | ||
Uniform-50%Read-50%Update | 70.402 | Read: 2.670 | Read: 19.295 | ||
Update: 2.777 | Update: 19.535 | ||||
| recordcount=3.840.000.000 run_operationcount=3.840.000.000 threads=384 fieldlength=100 | Load | 147.757 | 2.596 | 16.559 |
Uniform-Read | 217.186 | 1.766 | 7.087 | ||
Zipfian-Read | 282.698 | 1.356 | 6.131 | ||
Uniform-50%Read-50%Update | 135.495 | Read: 2.766 | Read: 18.591 | ||
Update: 2.895 | Update: 18.815 |
