Skip to content

Resp.benchmark 工具

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

该工具位于以下文件夹中:

bash
> Garnet\benchmark\Resp.benchmark

用法

可以通过使用 --help 命令行开关来查看 Resp.benchmark 可用的选项。示例:

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

实现细节

基准测试分为两个阶段。

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

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

ReqGen 类的构造函数展示了生成请求的几个选项。

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

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

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

以下方法用于以指定的参数运行给定操作的基准测试的次数

csharp
        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: 值中的总字节数。

基准测试的命令

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

原始字符串命令

  • SET
  • 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 个客户端会话运行的情况:

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

对于使用 16 个客户端会话运行的情况:

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

对于使用 ZADD 和 ZCARD 命令运行的情况:

bash
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 or threads: 工具将创建的连接数。
  • --client: 要使用的客户端。GarnetClientSession 是将系统压力提高到最大的好选择。SERedis 代表 StackExchange.Redis 库。
  • --keylength: 键的长度。

离线基准测试

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

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

bash
dotnet run -c Release -f net8.0 -- --op GET -t 2,4,8,16 -b 512 --dbsize 10241024 --keylength 1024
bash
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:
bash
dotnet run -c Release -f net8.0 -- --op MSET --dbsize 16777216 --keylength 512

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

bash
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