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

Posted zuozewei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMeter Redis 数据集 vs CSV 数据集性能对比相关的知识,希望对你有一定的参考价值。

一、前言

我们可以看到大部分基于 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)等类型。

三、对比测试

1、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文件。

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

源码地址:

  • https://github.com/zuozewei/blog-example/tree/master/Performance-testing/01-test-tool/jmeter/csv-redis-data-set-config

以上是关于JMeter Redis 数据集 vs CSV 数据集性能对比的主要内容,如果未能解决你的问题,请参考以下文章

Jmeter连接Redis,获取Redis数据集

如何使用CSV数据集配置在Jmeter的不同线程中使用不同输入登录多个用户

使用 JMeter 中的 CSV 数据集配置多次运行 HTTP 请求后提取有序结果

从 Jmeter 中的 CSV 文件中随机选择

我要自学-jmeter -CSV文件变量

Jmeter接口测试-redis测试客户端连接数问题