Appearance
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