Engula NetTrace Synth(流量回放工具)
Engula 提供一款名为 NetTrace Synth 的 TCP 流量回放工具,用于对数据库系统进行更贴近真实场景的性能测试与负载分析。该工具会捕获真实业务流量模式,并将其回放到 Engula 实例上,从而获得更可靠的基准结果与性能评估。
目标
该工作负载回放工具的主要目标包括:
- 性能基准:通过回放真实生产工作负载,在更真实的流量条件下测量系统性能
- 容量规划:用可控、可复现的回放测试推断资源需求与扩展上限
- 回归验证:用一致的流量模式验证变更/升级是否引入性能或行为回退
- 压力测试:在不同负载条件下观察系统行为,定位瓶颈与潜在故障点
- 兼容性验证:对同一工作负载,比较 Engula 与参考实现的处理行为是否一致
该工具弥合了“纯合成基准”与“真实业务场景”之间的差距,帮助您评估 Engula 在真实应用模式与查询分布下的表现。
非目标
该工具不是数据迁移/传输工具。它专注于流量模式分析与性能基准测试,而非数据同步或迁移。
主要限制:
- 数据一致性:回放过程中不保证数据一致性/正确性,核心目标是工作负载模拟而非数据准确性
- 状态保留:捕获与回放之间不保留数据库状态,目标系统应预先准备好对应的测试数据集
- 数据迁移:不用于在不同实例或环境间传输数据
- 备份/恢复:不提供备份或容灾能力;仅回放命令序列,不保证底层数据语义正确
- 实时同步:不能作为源与目标系统之间的实时数据同步机制
重要说明
该工具依赖 pcap(抓包)在网卡层截获流量,因此运行时需要 root 权限。
使用指南
在 Redis 所在机器上执行下述命令安装前置组件。以下示例以 Ubuntu 22.04 为例。
下载 Engula Server
Refer to Engula Downloads
安装 OpenJDK 17.x
1sudo apt-get install openjdk-17-jdk
2export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
3export PATH=$PATH:$JAVA_HOME/bin
4java -version
安装 Gradle 8.14.x
1wget https://services.gradle.org/distributions/gradle-8.14.2-bin.zip
2unzip gradle-8.14.2-bin.zip
3export GRADLE_HOME=$PWD/gradle-8.14.2
4export PATH=$PATH:$GRADLE_HOME/bin
5gradle -v
构建 pcap_resp_replay
1git clone https://github.com/montplex/pcap_resp_replay.git
2cd pcap_resp_replay
3gradle jar
4cd build/libs
5java -jar pcap_resp_replay-1.0.0.jar --help
命令行参数说明:
Usage: java -jar pcap_resp_replay-1.0.0.jar [-d] [-b=<bufferSize>]
[-B=<sendCmdBatchSize>] [-c=<maxPacketCount>] [-f=<filter>] [-h=<host>]
[-H=<targetHost>] [-i=<itf>] [-m=<bigKeyTopNum>] [-p=<port>]
[-P=<targetPort>] [-r=<readTimeout>] [-R=<readScale>]
[-s=<runningSeconds>] [-W=<writeScale>]
TCP monitor / filter and then replay / redirect to target redis server.
-b, --buffer-size=<bufferSize>
buffer size, default: 1048576 (1M)
-B, --send-cmd-batch-size=<sendCmdBatchSize>
send cmd pipeline size, default: 1, max 10, means no
pipeline
-c, --max-packet-count=<maxPacketCount>
receive max packet count, default: -1, means not limit
-d, --debug debug mode, if true, just log resp data, skip execute
to target redis server
-f, --filter=<filter> filter, default: tcp dst port 6379
-h, --host=<host> host, eg: localhost
-H, --target-host=<targetHost>
target host, eg: localhost
-i, --interface=<itf> interface, eg: lo, default: lo
-m, --big-key-top-num=<bigKeyTopNum>
big key top num, default: 10, max 100
-p, --port=<port> port, eg: 6379
-P, --target-port=<targetPort>
target port, eg: 6380
-r, --read-timeout=<readTimeout>
read timeout seconds by capture from network
interface, default: 10
-R, --read-scale=<readScale>
read scale, default: 1, max 100
-s, --running-seconds=<runningSeconds>
running seconds, default: 60, max 36000
-W, --write-scale=<writeScale>
write scale, default: 1, max 100
用 Engula 测试您的真实工作负载
启动 Engula Server
engula-server --port 6380 --save "" --appendonly no --protected-mode no
运行 pcap_resp_replay 做初步验证
1sudo java -Xmx1g -Xms1g -XX:+UseZGC -XX:+ZGenerational -jar pcap_resp_replay-1.0.0.jar -i lo -p 6379 -H 127.0.0.1 -P 6380 -s 30
分析性能输出与统计摘要
1+---------+---------+-----------+
2| ps_recv | ps_drop | ps_ifdrop |
3+---------+---------+-----------+
4| 4490 | 42 | 0 |
5+---------+---------+-----------+
6+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
7| timeout packet get count | invalid resp data count | valid resp data count | read cmd count | write cmd count | other cmd count |
8+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
9| 2 | 0 | 2190 | 764 | 1414 | 12 |
10+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
11+--------------------+--------------------------+---------------------+---------------------------+
12| forward read count | forward read error count | forward write count | forward write error count |
13+--------------------+--------------------------+---------------------+---------------------------+
14| 764 | 0 | 1413 | 1 |
15+--------------------+--------------------------+---------------------+---------------------------+
16+-------------+-------+
17| cmd | count |
18+-------------+-------+
19| append | 51 |
20| client | 6 |
21| config | 2 |
22| decr | 59 |
23| decrby | 66 |
24| get | 595 |
25| getdel | 49 |
26| getex | 53 |
27| getrange | 68 |
28| getset | 53 |
29| hello | 3 |
30| incr | 51 |
31| incrby | 57 |
32| incrbyfloat | 68 |
33| mget | 53 |
34| mset | 51 |
35| msetnx | 51 |
36| ping | 1 |
37| set | 617 |
38| setex | 66 |
39| setnx | 49 |
40| setrange | 73 |
41| strlen | 48 |
42+-------------+-------+
43big key top n 10:
44+---------------------------------------------+--------+
45| key | length |
46+---------------------------------------------+--------+
47| string:4a65d70f-2260-4c1d-9ef9-ef36f3041c0c | 749 |
48| string:9825eed7-7529-4cfb-bb79-611281ebb2ee | 787 |
49| string:90d40f8d-cd9d-430a-85a7-e0e1d4cf7077 | 780 |
50| string:da6ee415-b4b3-4d54-925e-02aa3900f29e | 927 |
51| string:67bd18a8-ffdb-4418-a1ad-6df4dfc116cf | 892 |
52| string:1918dec2-c048-4879-b045-ac8291ab0e05 | 944 |
53| string:76096a81-36df-4671-8402-fa6cd64ba7c9 | 992 |
54| string:0e5b9f2f-938d-4005-8f62-723152e6f42e | 955 |
55| string:848cadae-e9fb-4c38-89ac-a3f024a6b1bc | 943 |
56| string:667cd229-4e33-455a-a08e-7da1280e97ab | 962 |
57+---------------------------------------------+--------+
预加载 RDB 数据到 Engula
为了让回放结果更具参考价值,目标实例应预先加载具有代表性的数据集,以便真实的数据访问模式能够被准确复现。我们强烈建议在进行回放测试前,先将 RDB 文件加载到 Engula。
生成 RDB 的方式与 Redis 一致:在 Redis 上执行 BGSAVE,然后将生成的 RDB 文件复制到 Engula 的数据目录中。
调整读写流量缩放参数
进行回放测试时,您可能需要按测试目的调整读/写缩放参数,以模拟不同的流量模式与负载特征。
关键参数
- --read-scale=:回放时读操作的缩放系数,默认 1
- --write-scale=:回放时写操作的缩放系数,默认 1
使用场景
- 读多写少:提高 --read-scale 并保持 --write-scale 较低,以模拟读密集型应用
- 写多读少:提高 --write-scale 并保持 --read-scale 较低,以模拟写密集型场景(如日志写入)
- 读写均衡:保持两者相等,以维持捕获流量的原始读写比例
- 放大负载:使用大于 1 的值,将回放流量放大到超过原始捕获量
- 限流回放:使用 0~1 的值,降低回放工作负载强度