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

举报
zuozewei 发表于 2021/08/17 21:18:44 2021/08/17
【摘要】 当你在使用 JMeter 测试来测试一个高 TPS 程序时能够非常小心,我们都需要小心在测试脚本中加入哪些元素。

前言

我们可以看到大部分基于 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 程序时能够非常小心,我们都需要小心在测试脚本中加入哪些元素。

源码地址:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。