为什么80%的码农都做不了架构师?>>>   

级别: 初级

Kulvir Singh Bhogal, IBM 电子商务顾问, Austin, TX

2004 年 11 月 01 日

作者 Kulvir Singh Bhogal 介绍了一个叫作 JMeter 的开放源代码工具,该工具可以测量 DB2 Universal Database 的查询性能和吞吐量。

简介

在当今快节奏的世界中,只是完成工作是不够的。完成工作,并且要以最简便的方式完成工作,这才是关键。数据库世界也不能幸免这种对性能的渴求。客户希望能够迅速而有效地保存和提取其数据。在许多场合设置中,IBM 的 ® DB2® Universal Database TM 都拥有领先的性能跟踪记录,领先于众多的数据库竞争对手。

不幸的是,由于数据库或者配置中的某些设计缺陷,许多 DB2 用户可能无法获得 DB2 性能的所有益处。有许多关于 DB2 性能调整的文章和论文,DB2 中也有许多能够进行深入分析的好工具。我将在这篇文章中介绍一个工具 —— Apache 的 JMeter,这是另外一个可以添加到您的工具箱中的工具,它可以帮助您了解数据库的性能,还能帮助您进行模拟测试。

关于 Apache JMeter

JMeter 是 Apache Jakarta 项目麾下的一个产品。JMeter 是基于 Java TM Swing 的桌面应用程序,是为进行负载测试、测量系统性能而设计的。最初,它是为测试 Web 应用程序而设计的。但是它后来进行了扩展,现在您已经可以用它来测试关系数据库了(通过 JDBC TM)。在 JMeter 的官方站点http://jakarta.apache.org/jmeter/上,您可以了解关于它的更多内容。

利用 JMeter,您可以确保您的数据库可以满足某些指标(例如能够处理一定数量的并发用户)。模拟测试是成功项目的关键。JMeter 可以针对 DB2 模拟出繁重的负载。这可以通过 JMeter 的多线程框架来实现。JMeter 的多线程框架允许大量线程进行并发采样。正如您将在本文后面看到的,JMeter 能为您提供图形化的反馈。

获得 JMeter 并设置您的测试环境

您可以从http://jakarta.apache.org/builds/jakarta-jmeter/release/下载 JMeter 的最新发行版。在我撰写这篇文章时,最新的 JMeter 版本是 1.8。JMeter 要求在 Sun 的 JDK1.4(或者更高)环境中工作。IBM JDK(指当前版本)似乎与 JMeter 不兼容。JMeter 已经在各种 UNIX® 变体 (包括 Solaris 和 Linux) 和 Windows®(98®、NT® 和 2000®)上通过了测试。

为了方便我们对 DB2 进行的 JDBC 测试,需要把 DB2 的 JDBC 驱动程序复制到 <jmeter 安装目录>jakarta-jmeterlib 目录下。对于 DB2 8.1 ,在默认安装情况下,DB2 驱动程序的位置是 c:program filesibmsqllibjavadb2java.zip。奇怪的是,如果 DB2 的 JDBC 驱动程序以 zip 文件命名,JMeter 将找不到 DB2 的 JDBC 驱动程序。要解决这个问题,您必须将文件名更改为 .JAR 文件。您可以把 lib 目录中的文件改名为 db2java.jar。另一方面,如果想测试 DB2 8.1 Java Common Client (JCC) 驱动程序,只需将 db2jcc.jar文件复制到 JMeter 的 lib 目录下即可(不用更改名称)。

在沙箱中放沙子

在我们开始使用 JMeter 之前,我们需要建立一个有一些测试数据的数据库。

在 DB2 的命令行处理器中输入以下内容:

create db loaddb

连接 loaddb 数据库,如下所示:

connect to loaddb user db2admin using db2admin

建立一个表,保存我们的测试数据:

create table loadtable (col1 varchar(25) not null,
    col2 varchar(25) not null,
    col3 varchar(25) not null)

用大量记录填充表,这样我们才能用 JMeter 来测试查询性能。我用了一个小小的 JDBC 程序来完成这项工作,在清单1中可以看到它,该程序将在可装入表中插入 30,000 条记录。然后编译并执行这段代码,用测试数据填充可装入表。

清单 1. 将记录插入数据库

package com.ibm.jmetertest;
import java.sql.*;
 
public class JMeterPopulator
{
  public static void main(String[] args)
  {
    try
    {
      Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
 String dbName = "loaddb";
 String url = "jdbc:db2:" + dbName;
 String userName = "db2admin";
 String password = "db2admin";
 Connection con
          = DriverManager.getConnection(url,userName, password);
 int numOfTestRecords = 30000;
 PreparedStatement statement
          = con.prepareStatement("INSERT INTO LOADTABLE VALUES(?,?,?)");
 for (int i =0; i<numOfTestRecords; i++)
 {
   statement.setString(1,"Col1Test-" + i);
   statement.setString(2,"Col2Test-" + i);
   statement.setString(3,"Col3Test-" + i);
   statement.executeUpdate();
   System.out.println(i);
 }
    }
    catch(Exception e)
    {
       System.out.println("An error has occurred: " + e.toString());
       e.printStackTrace();
    }
  }
}
现在我们有了相当数量的记录,让我们用 JMeter 来测试一下查询性能。

进入 JMeter

要启动 JMeter,需要运行 <jmeter 安装目录 >jakarta-jmeterin 目录下的 jmeter.bat 文件。

当启动 JMeter 时,您会看到一个主屏幕,屏幕左边有一个面板,其中还没有定义测试计划(参见 图 1)。在 JMeter 中,一个测试计划是由一个或多个线程组构成的。线程代表模拟用户, 线程组(thread group)是一组模拟用户。

图 1. JMeter 的主屏幕

让我们从建立线程组开始。方法是右击 TestPlan 节点,选择 Add => Thread Group。参见 图 2。

图 2. 添加线程组

在下一个屏幕中(参见 图 3),您可以定义测试中所要包含的线程或模拟用户的数量。 等候周期(Ramp-Up Period)指定了 JMeter 在向数据库暴露模拟用户之前应当等待的时间。例如,如果我们有 30 个模拟用户,等候周期为15秒,那么我们就会每秒向数据库暴露 2 个用户(30 个用户/15 秒)。如果将等候周期设置为 0,JMeter 会自动一次启动所有模拟用户。循环计数(Loop Count)指定了 JMeter 要重复测试的次数。在这个屏幕中,还可以修改我们的线程组名称。接下来按 图 3 所示输入设置,这将为我们提供 30 个同时启动的用户。该测试将运行 100 次。

图 3. 线程组的设置

与数据库对话

现在,我们将指定如何与 DB2 UDB 通信。我们要以 JDBC 请求的形式与 DB2 UDB 进行通信。右击刚才建立的线程组( DB2 Test),选择 Add => Sampler => JDBC Request。

然后,您将看到一个屏幕,我们可以在其中设置一些只与 DB2 有关的信息,这样才能与我们的 DB2 数据库进行对话。这些信息包括:JDBC URL、JDBC 驱动程序,以及我们的用户名和口令。在这个屏幕上, 我们还可以指定有关连接池的信息,以及想要应用到数据库上的 SQL 查询。

接下来,我们使用 图 5 所示的值进行测试。对于那些不太熟悉连接池的读者来说,连接池就是一组数据库连接的维护,以便应用程序重复使用。数据库连接池在 Web 环境中很常见,因为 Web 用户连接、断开连接非常频繁。在数据库世界中,获得数据库连接是一项昂贵的操作。我们必须建立连接、维持连接,然后在操作完成的时候断开连接。利用 JMeter,我们可以分析连接池的优势。

图 5. 指定数据库的连接信息

用监听器监听结果

这时,我们真正定义了一个 JMeter 测试,它将测试我们的 DB2 数据库。此时我们面临的问题是没有办法看到测试结果。为了解决这个问题,请右击 JDBC Request,然后选择 Add => Listener => Graph Results ,如下图所示:

图 6. 指定图形化结果

把您的脚放在 JMeter 的踏板上

现在是启动 JMeter 测试的时候了。从主菜单中选择 Run ,然后选择 Start,如 图 7 所示。

图 7. 启动测试

请注意在屏幕右上角闪亮的屏幕区域。这个区域表明测试正在运行。在这个时候,您应当看到,图形被有关信息填充,信息的内容是执行指定查询所需要的时间(平均时间)(参见 图 8)。

图 8. 进行测试时以图形方式显示结果

您可能会考虑采用更多并发用户(线程组中的线程),来查看增加用户负载对于执行相同查询的平均时间的影响。您可能要给查询所涉及的字段添加索引,然后实际查看索引为具体数据库环境带来的好处。

JMeter 允许您通过使用 File => Save Test Plan 保存测试计划,从而指定保存 JMeter 测试计划的位置。

JMeter 真的在工作吗?

不幸的是,JMeter 的错误报告功能不那么强大。实际上,在我使用这个工具的时候,我以为错误报告功能起作用,而实际上它没有。因此,您应当考虑使用 断言(assertions)特性。断言允许 JMeter 用户审核数据库服务器的响应,并“断言”响应中确实存在某项数据。

在我们进行断言之前,需要知道我们想从查询中得到什么结果。我们可以在命令行处理器中运行查询,得到我们想要的结果,如 图 9 所示。

图 9. 示例查询

要添加断言,需要右击 JDBC Request,然后选择 Add => Assertions => Response Assertion,如 图 10所示。

图 10. 添加断言

您可以在该屏幕中添加文本断言。单击 Add ,然后在 Patterns to Test 字段中添加文本 Col1Test-20015 ,因为我们知道在返回结果中应当包含该文本(参见 图 11)。

图 11. 将文本添加到测试中

现在,我们要添加一个监听器,以监听响应断言。右击 JDBC Request,然后选择 Add => Listener => Assertion Results,如 图 12所示。

图 12. 添加断言监听器

这样您就可以看到断言结果屏幕( 图 13),您甚至可以在该屏幕中指定一个数据文件,把断言数据写入数据文件。

现在,当您运行测试对象的时候,您应该看到用否定或肯定断言填充的断言结果屏幕,是肯定还是否定则取决于是否满足断言中的条件。

图 14 显示的是成功的断言

图 14. 断言测试为肯定时的结果

如果修改断言,查找 Col1Test-40000 (我们知道数据库数据中没有这个文本),那么我们将得到类似 图 15所示的屏幕。

图 15. 断言测试结果为否定时的结果

结束语

可以利用 JMeter 在系统、服务器和网络上模拟繁重的负载。本文中,我们用 JMeter 分析了 DB2 数据库的查询性能。我们只触及到 JMeter 功能中很表面的部分。可以用 JMeter 来建立相当复杂却很有意义的测试计划。JMeter 会以图形和活动曲线的形式,快速提供关于系统性能的可视反馈。您可以用 JMeter 提供的数据来确保能够在调整您的企业运作的情况下获得最佳性能。

致谢

感谢 IBM 多伦多实验室的 Larry Menard 和 Robert,感谢他们在 JDBC 上的专长,以及他们对本文的帮助。

Kulvir Singh Bhogal 是 IBM 的一名顾问,负责在全国各地的客户站点上开发和实现以 Java 为中心的解决方案。您可以通过 Kulvir 的电子邮件kbhogal@us.ibm.com和他联系。

转载于:https://my.oschina.net/bysu/blog/751631

用 JMeter 测量性能--测试您的 DB2 数据库相关推荐

  1. 性能进阶:使用JMeter进行websocket测试

    摘要 本次测试案例主要是分享如何使用JMeter进行websocket协议下的聊天接口性能测试. 包含websocket插件的下载安装.线程组及sampler的设置.csv参数化和组建分布式测试的方法 ...

  2. 性能进阶:使用JMeter进行websocket测试【建议收藏】

    本次测试案例主要是分享如何使用JMeter进行websocket协议下的聊天接口性能测试. 包含websocket插件的下载安装.线程组及sampler的设置.csv参数化和组建分布式测试的方法.如何 ...

  3. jmeter 高并发测试报告_使用 JMeter 进行压力测试

    原文连接:使用 JMeter 进行压力测试 一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率:预估系统的承载能力 ...

  4. 在ASP.NET Core微服务架构下使用数据库切分和扩展, 并用JMeter进行负载测试

    原文链接:https://itnext.io/how-to-scale-an-asp-net-core-microservice-and-sharded-database-load-test-with ...

  5. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试

    jmeter异步请求测试 尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务. 对我们来说, ...

  6. 利用JMeter进行Web测试(简介适合初学者)

    利用JMeter进行Web测试 JMeter介绍 脚本录制 运行JMeter进行测试 JMeter主要组件介绍 参数化设置 动态数据关联 使用命令行运行JMeter脚本 利用XSLT分析JMeter结 ...

  7. 不写一行代码,基于Jmeter打造性能测试数据平台

    前 言 在服务端性能测试工具中,Jmeter毫无疑问是其中的王者,拥有开源.轻便.灵活.学习成本低等等很多优点. 但是在压测过程中,也有很多不便之处,最不方便的地方,就是执行压测过程中,没有实时展示的 ...

  8. jmeter压力测试_如何使用Jmeter进行压力测试?这篇入门讲解拿去不谢!

    一.下载安装jmeter 这里不多说了,大家可以自行下载. 二.运行jmeter.bat 在bin目录下,使用管理员方式运行jmeter.bat 随之会打开jmeter的GUI界面,注意不要关闭运行的 ...

  9. 云效平台性能测试功能:一个基于Jmeter的性能压测平台

    云效平台性能测试功能(Galaxy)是一个基于Jmeter的性能压测平台,它集脚本.场景.压测.监控和报表展示为一体,是一个能快速.低成本实施压测的平台.降低了入门使用成本,让开发和测试都可以方便的执 ...

最新文章

  1. Python之路----迭代器与生成器
  2. FreeBSD Top States
  3. PCA目标函数的推导
  4. 未排序正整数组中累加和为指定值的最长子数组长度
  5. C# MD5摘要算法、哈希算法
  6. C#设计模式(7)-Singleton Pattern
  7. C/C++程序员必读的十本书(上)
  8. 【MySQL】MySQL 一些 使用 案例
  9. vdcode C语言不能弹出运行窗口_C语言编程常见问题分析,以及错误解决办法!
  10. Linux交叉编译+粤嵌LCD实现三色图
  11. 最近服务器总被webshell攻击,木马也非常猖獗
  12. 台式计算机接口示意图,台式机硬盘接口_台式机硬盘接口图解
  13. AtCoder题解——Beginner Contest 168——E - ∙ (Bullet)
  14. iOS HealthKit
  15. JS中利用AJAX调用淘宝API获取网络时间的方法
  16. 枪林弹雨 该服务器维护中,枪林弹雨登陆BUG解决方法
  17. ios5.1.1旧版软件下载_苹果iOS 14.1正式版推送 关闭旧版本降级通道
  18. 网大网剧备案要避免的几大错误,内附最新备案流程!
  19. 王子救公主(DFS)
  20. matlab中 hold on 与 hold off,figure作用

热门文章

  1. php按照字段合并数组,PHP实现数组根据某个字段进行水平合并横向合并代码实例...
  2. java快速教程_Java快速入门
  3. python怎样打开加密的文件_python基础教程如何用Python 加密文件
  4. python温度转换代码分析_Python温度转换实例分析
  5. linux 下查看应用版本信息,Linux下查看版本信息
  6. python动态显示数据_python中plot实现即时数据动态显示方法
  7. html怎么添加图片幻灯,使用CSS3实现的超酷幻灯图片效果
  8. 动态更改echarts 高度_结合Echarts、Ajax技术实现可视化大屏监控 3D
  9. 如何启动mongoDB并用Robo 3T连接
  10. 支持 简体,繁体,英文的js日历控件