前言
我们可以看到大部分基于 JMeter 分布式压测平台大多数都将 JMeter 测试的测试数据保存在 CSV 文件中。即使 CSV 文件是一个非常好的选择—通过让测试数据远离测试脚本,当你在分布式模式下使用 JMeter 时,它变得非常难以管理。你可能知道,JMeter 只是在所有从压测服务器中执行相同的 jmx 文件。因此,CSV文件,这是你的 JMeter 测试的依赖,也应该由您复制到所有的 slave 节点,有时,slave1 使用的测试数据不应该被 slave2 使用。在这种情况下,你需要将 CSV 文件分割为每个 slave 服务器的多个文件,并将它们移动到对应压测服务器,以成功运行测试。
在 JMeter 分布式模式测试中,Redis 是一个选择,因为它可以为所有 slave 提供数据。
什么是 Redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
对比测试
CSV Data Set config
首先,我创建了一个包含 100,000 条记录的非常简单的 CSV 文件。
void createCsvDate() throws FileNotFoundException, UnsupportedEncodingException {
int maximum = 1000000;
PrintWriter writer = new PrintWriter("d:/redis-csv-compare.csv","UTF-8");
for (int i=1;i<=maximum;i++){
writer.println("name" + i + ",age" + i +",addresss" + i);
}
writer.close();
}
我创建了一个简单的 JMeter 脚本测试来读取 CSV文件。
Redis Data Set config
现在让我们使用 Redis Data Set Config 做一个类似的测试。
首先确保安装了“Redis Data Set Config”插件。
让我们像在 CSV 中所做的那样在 Redis 中创建这 100,000 条记录。
void createRedisDate(){
//连接本地的redis,port如果没有修改可以不用传
Jedis jedis = new Jedis("172.16.106.237");
// System.out.println(jedis.getClient().getPort());
// System.out.println("连接本地的Redis服务器成功");
// //查看服务是否运行
// System.out.println("服务正在运行:" + jedis.ping());
//
int maximum = 1000000;
for (int i=1;i<=maximum;i++){
jedis.lpush("user-row","name" + i + ",age" + i +",addresss" + i);
}
jedis.close();
}
我创建了一个非常简单的测试来使用 Redis 数据集配置而不是 CSV。其他一切都保持不变。
结果对比
在非 Gui 模式下运行测试:
测试结果:
- 有 CSV 数据集配置的 JMeter 可以在一秒钟内读取 8.6 万条记录。
- 有 Redis 数据集配置的 JMeter 能够在一秒钟内读取大约 2400 条记录,测试结果还不错。
影响因素:
- Redis TPS 不高的原因是由于我在单独的机器上运行 Redis 服务器时的存在网络延迟,JMeter 连接到 redis 服务器去获取数据。
- JMeter 测试中只有一个线程在运行。因此,JMeter 将向 Redis 发送 100,000 个请求以顺序读取数据。
- 可以通过在同一台服务器上运行 JMeter 和 Redis 来做一个类似的测试,这样性能会好得多。但我们的目的是看看如何将 Redis 用于 JMeter 分布式测试。在这种情况下,Redis 必须在单独的机器上运行。这就是以这种方式测试的原因。
- 建议你进行类似的测试并自己比较性能。结果对你来说可能完全不同,并且因你的机器配置而异。
总结
我预期这个结果,因为 CSV 文件在本地和 Redis DB 运行在网络的其他地方。网络延迟将在 Redis TPS 中扮演重要角色。因此,CSV 文件读取将比 Redis 更好。
然而,CSV 读取性能比 Redis 好 35 倍,这确实令人惊讶的。当你在使用 JMeter 测试来测试一个高 TPS 程序时能够非常小心,我们都需要小心在测试脚本中加入哪些元素。
源码地址: