跳到主要内容

Resp.benchmark 工具

Garnet 项目包含一个基准测试工具,用于使用不同的客户端、不同的工作负载和不同的策略来运行 RESP 基准测试,以测量吞吐量、性能和延迟。

此工具位于文件夹下

> Garnet\benchmark\Resp.benchmark

用法

可以通过使用 --help 命令行开关运行基准测试工具来查看 Resp.benchmark 可用的选项。例如

> cd Garnet\benchmark\Resp.benchmark
> dotnet run -c Release -f net8.0 -- --help

实现细节

基准测试分两个阶段进行。

  • 将键加载到数据库中
  • 为单个命令运行基准测试

在这两个阶段,ReqGen 都用于生成用于加载数据或执行基准测试的请求。

如 ReqGen 类的构造函数所示,有几种生成请求的选项。

        public ReqGen(
int Start,
int DbSize,
int NumOps,
int BatchSize,
OpType opType,
bool randomGen = true,
bool randomServe = true,
int keyLen = default,
int valueLen = default)
  • 开始:键偏移量。
  • DbSize:数据库中的键数量
  • NumOps:要执行的操作总数
  • BatchSize:批处理中的操作总数。
  • opType:要执行的操作(例如 GET、MSET、INCR)
  • randomGen:是按顺序还是随机生成键。
  • randomServe:是随机处理请求还是按生成顺序处理请求。
  • keyLen:键的最小字节数。键从 (Start,DbSize) 范围分配,并相应地填充以构建至少一组。默认大小等于 DbSize 的最大位数。
  • valueLen:值的总字节数。

以下方法用于将数据加载到数据库中

        public void LoadData(
int loadDbThreads = 8,
int BatchSize = 1 << 12,
int keyLen = default,
int valueLen = default)
  • loadDbThreads:用于加载的线程总数
  • BatchSize:批处理中的键值对总数
  • keyLen:键的长度(以字节为单位)。
  • valueLen:值的长度(以字节为单位)。

以下方法用于针对给定操作使用指定参数运行基准测试的迭代

        public void Run(
OpType opType,
int TotalOps,
int[] NumThreads,
int BatchSize = 1 << 12,
TimeSpan runTime = default,
bool randomGen = true,
bool randomServe = true,
int keyLen = default,
int valueLen = default)
  • opType:要进行基准测试的操作
  • totalops:为给定基准测试执行的总操作数。
  • NumThreads:用于运行基准测试的客户端总数
  • BatchSize:单个批处理中的操作总数。
  • runTime:运行基准测试的最短持续时间。
  • randomGen:请求中键的生成顺序。
  • randomServe:请求缓冲区的访问顺序。
  • keyLen:单个键的最小字节数。
  • valueLen:值的总字节数。

已进行基准测试的命令

可以从每个类别进行基准测试的命令

原始字符串命令

  • 集合
  • GET
  • MGET
  • INCR
  • SETEX

位图命令

  • SETBIT
  • BITOP
  • GETBIT
  • BITCOUNT
  • BITPOS
  • BITOP_AND
  • BITOP_OR
  • BITOP_XOR
  • BITOP_NOT
  • BITFIELD_GET
  • BITFIELD_SET
  • BITFIELD_INCR

Hyperloglog 命令

  • PFADD
  • PFCOUNT
  • PFMERGE

有序集合和地理命令

  • ZADD
  • GEOADD
  • ZREM
  • ZCARD

服务器命令

  • PING

基准测试类型

在线基准测试

这些选项以连续在线模式测量服务器的性能。

从文件夹

Garnet/benchmark/Resp.benchmark

运行 1 个客户端会话

dotnet run -c Release -f net8.0 -- --online --op-workload GET,SET --op-percent 50,50 -b 1  -t 1

运行 16 个客户端会话

dotnet run -c Release -f net8.0 -- --online --op-workload GET,SET --op-percent 50,50 -b 1  -t 16

使用 ZADD 和 ZCARD 命令运行

dotnet run -c Release -f net8.0 -- --online --op-workload ZADD,ZCARD --op-percent 50,50 -b 1  -t 1 --keylength --client SERedis

其中

  • --op-workload:要发送的不同命令。
  • --online:要执行的基准测试类型。
  • --op-percent:每个命令的负载权重。
  • --t 或 threads:工具将创建以发送负载的连接数。
  • --client:要使用的客户端。GarnetClientSession 是将系统压力最大化的好选择。SERedis 代表 StackExchange.Redis 库。
  • --keylength:键大小的长度。

离线基准测试

这类基准测试使用我们预先创建批次的 LightClient,以测量服务器在给定时间段内可以实现的吞吐量。

运行离线基准测试的一些示例如下

dotnet run -c Release -f net8.0 -- --op GET -t 2,4,8,16 -b 512 --dbsize 10241024 --keylength 1024
dotnet run -c Release -f net8.0 -- --op ZADDCARD -t 64 --b 512 --dbsize 16777216 --keylength 512

其中

  • --op:要发送的命令。ZADDCARD 将在同一运行中执行 ZADD 和 ZCARD。
  • --t 或 threads:要使用的线程数。
  • --dbsize:要在存储中创建的键的数量

预加载数据进行基准测试

您可以在运行 GET 基准测试之前通过执行以下步骤预填充存储:

  • 使用 Resp Benchmark 工具执行 MSET
dotnet run -c Release -f net8.0 -- --op MSET --dbsize 16777216 --keylength 512

然后在在线模式下执行 GET 命令

dotnet run -c Release -f net8.0 -- --op-workload GET --online -b 1 --op-percent 100 -t 64 --client GarnetClientSession --itp 1024 --runtime -1 --dbsize 16777216 --keylength 512

如果您想知道命中率有多高,可以从任何客户端 CLI 工具执行

INFO stats

查看 garnet_hit_rate 指标,理想情况下,该值应接近 100。

Garnet 服务器需要启用指标才能使用 INFO 命令获取统计信息

 --latency-monitor --metrics-sampling-freq 5