Skip to main content

A performance benchmarking tool for RESP protocol databases.

Project description

resp-benchmark

License

用来测试兼容 RESP 协议的数据库,比如 Redis、Valkey、Tair 等,提供命令行工具与 Python 库(方便编写自动化测试脚本)。

安装

pip install resp-benchmark

使用

命令行工具

resp-benchmark --help

Python 库

from resp_benchmark import Benchmark

bm = Benchmark(host="127.0.0.1", port=6379)
bm.flushall()
bm.load_data(command="SET {key sequence 10000000} {value 64}", count=1000_0000, connections=128)
result = bm.bench("GET {key uniform 10000000}", seconds=3, connections=16)
print(result.qps, result.avg_latency_ms, result.p99_latency_ms)

自定义命令

resp-benchmark 支持自定义要测试的命令,使用如下占位符语法:SET {key uniform 10000000} {value 64} 表示执行 SET 命令,key 的分布是 uniform,随机范围是 0-10000000,value 的大小是 64 字节

支持的占位符有:

  • {key uniform N}: 生成范围在 0N-1 的随机数。比如 {key uniform 100} 可能会生成 key_0000000099
  • {key sequence N}: 同上,但是是顺序产生,用于在加载数据时保证数据覆盖。比如 {key sequence 100} 会生成 key_0000000000, key_0000000001, ...
  • {key zipfian N}: 同上,但是分布是指数为 1.03 的 Zipfian 分布,用于模拟真实场景下的 key 分布。
  • {value N}: 生成长度为 N 字节的随机字符串。比如 {value 64} 可能会生成 92xsqdNgAyKcqtR4pyXz7j1GQAlRJQJ9TagOmCZ5xR3q3UCXl6B7QysZfgYd4Vmd
  • {rand N}: 生成一个 0N-1 之间的随机数。比如 {rand 100} 可能会生成 99
  • {range N W}: 生成一对随机数,两个数字的范围是 0N-1,两个数字的差值是 W,用来测试各类 *range* 命令。比如 {range 100 10} 可能会生成 89 99

最佳实践

压测 zset

# 1. 加载数据
resp-benchmark --load -n 1000000 -P 10 "ZADD {key sequence 1000} {rand 1000} {value 8}"
# 2. 压测
resp-benchmark "ZRANGEBYSCORE {key uniform 1000} {range 1000 10}"

压测 lua script

redis-cli 'SCRIPT LOAD "return redis.call('\''SET'\'', KEYS[1], ARGV[1])"'
resp-benchmark "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 100000} {value 64}"

与 redis-benchmark 的差异

使用 resp-benchmark 与 redis-benchmark 测试 Redis 时,可能会得到不同的结果。常见有以下原因:

  1. redis-benchmark 在测试 set 命令时总是使用相同的 value,这不会导致 DB 的持久化与复制机制。resp-benchmark 则可以使用 {value 64} 对每条命令都重新生成数据。
  2. redis-benchmark 在测试 list/set/zset/hash 等命令时,总是使用相同的 primary key,可能会导致多线程 DB 的性能数据失真。resp-benchmark 可以通过 {key uniform 10000000} 等占位符生成不同的 key。
  3. redis-benchmark 在集群模式下,发到不同节点的请求都被指定了相同的 slot,可能会导致多线程 DB 的性能数据失真。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resp_benchmark-0.1.2.tar.gz (25.0 kB view hashes)

Uploaded Source

Built Distributions

resp_benchmark-0.1.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp312-none-win_amd64.whl (915.0 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

resp_benchmark-0.1.2-cp312-none-win32.whl (851.5 kB view hashes)

Uploaded CPython 3.12 Windows x86

resp_benchmark-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-cp312-cp312-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

resp_benchmark-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

resp_benchmark-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 macOS 10.12+ x86-64

resp_benchmark-0.1.2-cp311-none-win_amd64.whl (913.0 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

resp_benchmark-0.1.2-cp311-none-win32.whl (852.2 kB view hashes)

Uploaded CPython 3.11 Windows x86

resp_benchmark-0.1.2-cp311-cp311-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-cp311-cp311-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-cp311-cp311-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-cp311-cp311-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

resp_benchmark-0.1.2-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

resp_benchmark-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 macOS 10.12+ x86-64

resp_benchmark-0.1.2-cp310-none-win_amd64.whl (914.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

resp_benchmark-0.1.2-cp310-none-win32.whl (852.2 kB view hashes)

Uploaded CPython 3.10 Windows x86

resp_benchmark-0.1.2-cp310-cp310-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-cp310-cp310-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-cp310-cp310-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-cp310-cp310-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

resp_benchmark-0.1.2-cp310-cp310-macosx_11_0_arm64.whl (1.0 MB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

resp_benchmark-0.1.2-cp39-none-win_amd64.whl (915.1 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

resp_benchmark-0.1.2-cp39-none-win32.whl (852.7 kB view hashes)

Uploaded CPython 3.9 Windows x86

resp_benchmark-0.1.2-cp39-cp39-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-cp39-cp39-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-cp39-cp39-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-cp39-cp39-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

resp_benchmark-0.1.2-cp39-cp39-macosx_11_0_arm64.whl (1.0 MB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

resp_benchmark-0.1.2-cp38-none-win_amd64.whl (915.3 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

resp_benchmark-0.1.2-cp38-none-win32.whl (853.1 kB view hashes)

Uploaded CPython 3.8 Windows x86

resp_benchmark-0.1.2-cp38-cp38-musllinux_1_2_x86_64.whl (1.3 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

resp_benchmark-0.1.2-cp38-cp38-musllinux_1_2_i686.whl (1.4 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

resp_benchmark-0.1.2-cp38-cp38-musllinux_1_2_armv7l.whl (1.4 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARMv7l

resp_benchmark-0.1.2-cp38-cp38-musllinux_1_2_aarch64.whl (1.3 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARM64

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.3 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

resp_benchmark-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page