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