前言

我们可以看到大部分基于 JMeter 分布式压测平台大多数都将 JMeter 测试的测试数据保存在 CSV 文件中。即使 CSV 文件是一个非常好的选择—通过让测试数据远离测试脚本,当你在分布式模式下使用 JMeter 时,它变得非常难以管理。你可能知道,JMeter 只是在所有从压测服务器中执行相同的 jmx 文件。因此,CSV文件,这是你的 JMeter 测试的依赖,也应该由您复制到所有的 slave 节点,有时,slave1 使用的测试数据不应该被 slave2 使用。在这种情况下,你需要将 CSV 文件分割为每个 slave 服务器的多个文件,并将它们移动到对应压测服务器,以成功运行测试。

在 JMeter 分布式模式测试中,Redis 是一个选择,因为它可以为所有 slave 提供数据。

JMeter Redis 数据集 vs CSV 数据集性能对比_Redis

什么是 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文件。JMeter Redis 数据集 vs CSV 数据集性能对比_服务器_02

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。其他一切都保持不变。JMeter Redis 数据集 vs CSV 数据集性能对比_服务器_03

结果对比

在非 Gui 模式下运行测试:JMeter Redis 数据集 vs CSV 数据集性能对比_Redis_04

测试结果:

  • 有 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 程序时能够非常小心,我们都需要小心在测试脚本中加入哪些元素。


源码地址: