This topic describes the tests on Tair (Enterprise Edition) persistent memory-optimized instances. The test environment, tool, methods, and results are introduced.
Overview
Tair persistent memory-optimized instances adopt persistent memory to provide large-capacity in-memory databases that are compatible with open source Redis. Persistent memory-optimized instances do not use disks to implement data persistence and cost 30% less than ApsaraDB for Redis Community Edition instances while delivering almost identical throughput and latency and maintaining the persistence of each operation. This helps improve the reliability of business data. For more information, see Persistent memory-optimized instances.
Test environment
Item | Description |
Region and zone | All tests are performed in Zhangjiakou Zone A. |
Instance architecture | The standard master-replica architecture is used. For more information, see Standard master-replica instances. |
Virtual machine on which a stress testing tool is deployed | An Elastic Compute Service (ECS) instance of the ecs.g6e.8xlarge type is used. For more information, see Overview of instance families. |
Instance type | In the test, the instance type is tair.scm.standard.32m.128d. |
Test tool
You can use open source YCSB to perform stress tests. YCSB is a Java tool that can be used to benchmark the performance of multiple types of databases. For more information about how to install and use YCSB, see YCSB.
Open source YCSB tests only hashes. To use YCSB to test strings, you must use the RedisClient.java file to replace the original file that has the same name in the YCSB/redis/src/main/java/site/ycsb/db directory after you download YCSB.
Workloads
The total amount of data involved in the test is 8 GB. The data distribution method is Zipfian. The performance of persistent memory-optimized instances is tested in the following scenarios:
Data loading: 100% write operations.
Workload C: 100% read operations.
Workload A: 50% update operations and 50% read operations.
For more information about workloads, see Core Workloads.
The complex commands for sets and zsets are not suitable for this test due to their applicable scenarios. You can customize a test for sets and zsets based on your business scenario.
Test commands
# Load data.
workload=a
./bin/ycsb load redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads} -p "redis.password=***:*****"
# Run Workload C.
workload=c
./bin/ycsb run redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads} -p "redis.password=***:*****"
# Run Workload A.
workload=a
./bin/ycsb run redis -s -P workloads/workload${workload} -p "redis.host=${server_ip}" -p "redis.port=${port}" -p "redis.password=${password}" -p "recordcount=${recordcount}" -p "operationcount=${operationcount}" -p "redis.timeout=30000" -p "redis.command_group=${command_group}" -p "fieldcount=${fieldcount}" -p "fieldlength=${fieldlength}" -threads ${threads} -p "redis.password=***:*****"
Table 1. Parameters
Parameter | Description |
server_ip | The IP address of the instance. |
port | The service port of the instance. |
password | The password format varies based on the selected account:
Note If you forget your password, you can reset it. For more information, see Change or reset the password. |
recordcount | The amount of prepared data. |
operationcount | The amount of data involved in the operation. |
command_group | The type of data that you want to test. In this test, the following types of data are tested in sequence:
|
fieldcount | The number of fields or elements. To test strings, set this parameter to 1. To test other types of data, set this parameter to 10. |
fieldlength | The value length. Set this parameter based on the test requirements. |
threads | The number of YCSB threads. Set this parameter based on the instance type. |
Test results
Test metric | Description |
QPS | The number of read and write operations that are processed per second. |
INSERT Average Latency | The average latency of write operations. Unit: µs. |
INSERT 99th Percentile Latency | The highest latency for the fastest 99% of write operations. Unit: µs. For example, if this parameter is set to 500 µs, 99% of the operations are processed within 500 µs. |
READ AverageLatency | The average latency of read operations. Unit: µs. |
READ 99thPercentileLatency | The highest latency for the fastest 99% of read operations. Unit: µs. |
UPDATE AverageLatency | The average latency of update operations. Unit: µs. |
UPDATE 99thPercentileLatency | The highest latency for the fastest 99% of update operations. Unit: µs. |
Test results for data loading
Table 2. Strings
Value length (bytes) | QPS | INSERT average latency (µs) | INSERT 99th percentile latency (µs) |
128 | 134,478 | 473 | 687 |
256 | 126,139 | 504 | 828 |
1,024 | 99,775 | 638 | 1,051 |
2,048 | 77,130 | 826 | 1,157 |
4,096 | 60,646 | 1,050 | 1,534 |
Table 3. Hashes
Number of fields in a key | Value length (bytes) | QPS | INSERT average latency (µs) | INSERT 99th percentile latency (µs) |
10 | 128 | 47,353 | 1,348 | 1,885 |
256 | 46,716 | 1,366 | 2,181 | |
1,024 | 27,759 | 2,297 | 2,873 | |
2,048 | 16,605 | 3,833 | 4,923 |
Table 4. Lists
Number of elements in a key | Value length (bytes) | QPS | INSERT average latency (µs) | INSERT 99th percentile latency (µs) |
10 | 128 | 64,950 | 979 | 1,310 |
256 | 47,157 | 1,348 | 1,752 | |
1,024 | 26,719 | 2,386 | 3,457 | |
2,048 | 16,714 | 3,811 | 4,751 | |
4,096 | 10,129 | 6,279 | 7,891 |
Table 5. Sets
Number of members in a key | Value length (bytes) | QPS | INSERT average latency (µs) | INSERT 99th percentile latency (µs) |
10 | 128 | 63,670 | 1,001 | 1,514 |
256 | 44,707 | 1,427 | 2,129 | |
1,024 | 25,375 | 2,513 | 3,239 | |
2,048 | 14,318 | 4,451 | 5,619 | |
4,096 | 8,378 | 7,608 | 9,095 |
Table 6. Sorted sets
Number of elements in a key | Value length (bytes) | QPS | INSERT average latency (µs) | INSERT 99th percentile latency (µs) |
10 | 128 | 40,292 | 1,585 | 2,469 |
256 | 34,168 | 1,869 | 2,569 | |
1,024 | 21,347 | 2,989 | 3,905 | |
2,048 | 12,868 | 4,956 | 6,255 | |
4,096 | 7,864 | 8,101 | 9,599 |
Test results for Workload C
Table 7. Strings
Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) |
128 | 170,699 | 362 | 546 |
256 | 163,829 | 380 | 565 |
1,024 | 161,491 | 386 | 569 |
2,048 | 130,189 | 487 | 729 |
4,096 | 115,433 | 548 | 808 |
Table 8. Hashes
Number of fields in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) |
10 | 128 | 96,111 | 662 | 874 |
256 | 86,892 | 733 | 915 | |
1,024 | 61,608 | 1,030 | 1,293 | |
2,048 | 37,334 | 1,696 | 2,331 | |
4,096 | 25,943 | 2,429 | 3,319 |
Table 9. Lists
Number of elements in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) |
10 | 128 | 105,296 | 604 | 889 |
256 | 97,047 | 655 | 890 | |
1,024 | 66,384 | 955 | 1,192 | |
2,048 | 35,796 | 1,769 | 2,461 | |
4,096 | 26,314 | 2,392 | 3,271 |
Table 10. Sets
Number of members in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) |
10 | 128 | 97,825 | 651 | 896 |
256 | 80,954 | 787 | 970 | |
1024 | 59,924 | 1060 | 1313 | |
2048 | 33,356 | 1900 | 2637 | |
4096 | 23,605 | 2677 | 3723 |
Table 11. Sorted sets
Number of elements in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) |
10 | 128 | 58,380 | 1,093 | 1,341 |
256 | 56,287 | 1,133 | 1,390 | |
1,024 | 47,468 | 1,338 | 1,688 | |
2,048 | 30,073 | 2,096 | 2,783 | |
4,096 | 21,850 | 2,880 | 3,765 |
Test results for Workload A
Table 12. Strings
Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) | UPDATE average latency (µs) | UPDATE 99th percentile latency (µs) |
128 | 141,120 | 451 | 616 | 450 | 618 |
256 | 137,551 | 463 | 617 | 461 | 618 |
1,024 | 124,165 | 516 | 724 | 508 | 725 |
2,048 | 92,652 | 695 | 881 | 678 | 871 |
4,096 | 78,994 | 819 | 1,042 | 791 | 1,024 |
Table 13. Hashes
Number of fields in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) | UPDATE average latency (µs) | UPDATE 99th percentile latency (µs) |
10 | 128 | 99,495 | 646 | 831 | 633 | 820 |
256 | 88,235 | 731 | 985 | 712 | 966 | |
1,024 | 72,013 | 892 | 1,159 | 863 | 2,049 | |
2,048 | 45,790 | 1,379 | 1,898 | 1,354 | 2,821 | |
4,096 | 32,912 | 1,891 | 2,931 | 1,915 | 7,887 |
Table 14. Lists
Number of elements in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) | UPDATE average latency (µs) | UPDATE 99th percentile latency (µs) |
10 | 128 | 71,696 | 591 | 775 | 1,185 | 1,383 |
256 | 66,294 | 638 | 800 | 1,281 | 1,456 | |
1,024 | 53,402 | 791 | 1,006 | 1,581 | 1,865 | |
2,048 | 36,519 | 1,221 | 1,581 | 2,232 | 2,831 | |
4,096 | 28,390 | 1,618 | 2,113 | 2,803 | 3,777 |
Table 15. Sets
Number of members in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) | UPDATE average latency (µs) | UPDATE 99th percentile latency (µs) |
10 | 128 | 66,346 | 640 | 792 | 1,282 | 1,445 |
256 | 60,010 | 707 | 993 | 1,415 | 1,957 | |
1,024 | 45,359 | 933 | 1,128 | 1,858 | 2,073 | |
2,048 | 29,027 | 1,529 | 2,021 | 2,820 | 4,507 | |
4,096 | 21,440 | 2,144 | 2,773 | 3,726 | 5,095 |
Table 16. Sorted sets
Number of elements in a key | Value length (bytes) | QPS | READ average latency (µs) | READ 99th percentile latency (µs) | UPDATE average latency (µs) | UPDATE 99th percentile latency (µs) |
10 | 128 | 49,695 | 861 | 1,050 | 1,707 | 1,912 |
256 | 48,036 | 891 | 1,084 | 1,763 | 1,970 | |
1,024 | 39,795 | 1,081 | 1,386 | 2,107 | 2,563 | |
2,048 | 28,415 | 1,597 | 1,981 | 2,855 | 3,589 | |
4,096 | 21,317 | 2,247 | 2,821 | 3,665 | 4,787 |