用 JMeter 测量性能--测试您的 DB2 数据库
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
級別: 初級
Kulvir Singh Bhogal, IBM 電子商務(wù)顧問, Austin, TX
2004 年 11 月 01 日
??? 作者 Kulvir Singh Bhogal 介紹了一個叫作 JMeter 的開放源代碼工具,該工具可以測量 DB2 Universal Database 的查詢性能和吞吐量。
簡介
在當(dāng)今快節(jié)奏的世界中,只是完成工作是不夠的。完成工作,并且要以最簡便的方式完成工作,這才是關(guān)鍵。數(shù)據(jù)庫世界也不能幸免這種對性能的渴求。客戶希望能夠迅速而有效地保存和提取其數(shù)據(jù)。在許多場合設(shè)置中,IBM 的 ? DB2? Universal Database TM 都擁有領(lǐng)先的性能跟蹤記錄,領(lǐng)先于眾多的數(shù)據(jù)庫競爭對手。
不幸的是,由于數(shù)據(jù)庫或者配置中的某些設(shè)計缺陷,許多 DB2 用戶可能無法獲得 DB2 性能的所有益處。有許多關(guān)于 DB2 性能調(diào)整的文章和論文,DB2 中也有許多能夠進行深入分析的好工具。我將在這篇文章中介紹一個工具 —— Apache 的 JMeter,這是另外一個可以添加到您的工具箱中的工具,它可以幫助您了解數(shù)據(jù)庫的性能,還能幫助您進行模擬測試。
關(guān)于 Apache JMeter
JMeter 是 Apache Jakarta 項目麾下的一個產(chǎn)品。JMeter 是基于 Java TM Swing 的桌面應(yīng)用程序,是為進行負載測試、測量系統(tǒng)性能而設(shè)計的。最初,它是為測試 Web 應(yīng)用程序而設(shè)計的。但是它后來進行了擴展,現(xiàn)在您已經(jīng)可以用它來測試關(guān)系數(shù)據(jù)庫了(通過 JDBC TM)。在 JMeter 的官方站點http://jakarta.apache.org/jmeter/上,您可以了解關(guān)于它的更多內(nèi)容。
利用 JMeter,您可以確保您的數(shù)據(jù)庫可以滿足某些指標(biāo)(例如能夠處理一定數(shù)量的并發(fā)用戶)。模擬測試是成功項目的關(guān)鍵。JMeter 可以針對 DB2 模擬出繁重的負載。這可以通過 JMeter 的多線程框架來實現(xiàn)。JMeter 的多線程框架允許大量線程進行并發(fā)采樣。正如您將在本文后面看到的,JMeter 能為您提供圖形化的反饋。
獲得 JMeter 并設(shè)置您的測試環(huán)境
您可以從http://jakarta.apache.org/builds/jakarta-jmeter/release/下載 JMeter 的最新發(fā)行版。在我撰寫這篇文章時,最新的 JMeter 版本是 1.8。JMeter 要求在 Sun 的 JDK1.4(或者更高)環(huán)境中工作。IBM JDK(指當(dāng)前版本)似乎與 JMeter 不兼容。JMeter 已經(jīng)在各種 UNIX? 變體 (包括 Solaris 和 Linux) 和 Windows?(98?、NT? 和 2000?)上通過了測試。
為了方便我們對 DB2 進行的 JDBC 測試,需要把 DB2 的 JDBC 驅(qū)動程序復(fù)制到 <jmeter 安裝目錄>jakarta-jmeterlib 目錄下。對于 DB2 8.1 ,在默認安裝情況下,DB2 驅(qū)動程序的位置是 c:program filesibmsqllibjavadb2java.zip。奇怪的是,如果 DB2 的 JDBC 驅(qū)動程序以 zip 文件命名,JMeter 將找不到 DB2 的 JDBC 驅(qū)動程序。要解決這個問題,您必須將文件名更改為 .JAR 文件。您可以把 lib 目錄中的文件改名為 db2java.jar。另一方面,如果想測試 DB2 8.1 Java Common Client (JCC) 驅(qū)動程序,只需將 db2jcc.jar文件復(fù)制到 JMeter 的 lib 目錄下即可(不用更改名稱)。
在沙箱中放沙子
在我們開始使用 JMeter 之前,我們需要建立一個有一些測試數(shù)據(jù)的數(shù)據(jù)庫。
??? 在 DB2 的命令行處理器中輸入以下內(nèi)容:
????
??? create db loaddb
??? 連接 loaddb 數(shù)據(jù)庫,如下所示:
????
??? connect to loaddb user db2admin using db2admin
??? 建立一個表,保存我們的測試數(shù)據(jù):
????
??? create table loadtable (col1 varchar(25) not null,
??? col2 varchar(25) not null,
??? col3 varchar(25) not null)
??? 用大量記錄填充表,這樣我們才能用 JMeter 來測試查詢性能。我用了一個小小的 JDBC 程序來完成這項工作,在清單1中可以看到它,該程序?qū)⒃诳裳b入表中插入 30,000 條記錄。然后編譯并執(zhí)行這段代碼,用測試數(shù)據(jù)填充可裝入表。
清單 1. 將記錄插入數(shù)據(jù)庫
?
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();
??? }
? }
}
現(xiàn)在我們有了相當(dāng)數(shù)量的記錄,讓我們用 JMeter 來測試一下查詢性能。
進入 JMeter
要啟動 JMeter,需要運行 <jmeter 安裝目錄 >jakarta-jmeterin 目錄下的 jmeter.bat 文件。
當(dāng)啟動 JMeter 時,您會看到一個主屏幕,屏幕左邊有一個面板,其中還沒有定義測試計劃(參見 圖 1)。在 JMeter 中,一個測試計劃是由一個或多個線程組構(gòu)成的。線程代表模擬用戶, 線程組(thread group)是一組模擬用戶。
圖 1. JMeter 的主屏幕
讓我們從建立線程組開始。方法是右擊 TestPlan 節(jié)點,選擇 Add => Thread Group。參見 圖 2。
?
圖 2. 添加線程組
在下一個屏幕中(參見 圖 3),您可以定義測試中所要包含的線程或模擬用戶的數(shù)量。 等候周期(Ramp-Up Period)指定了 JMeter 在向數(shù)據(jù)庫暴露模擬用戶之前應(yīng)當(dāng)?shù)却臅r間。例如,如果我們有 30 個模擬用戶,等候周期為15秒,那么我們就會每秒向數(shù)據(jù)庫暴露 2 個用戶(30 個用戶/15 秒)。如果將等候周期設(shè)置為 0,JMeter 會自動一次啟動所有模擬用戶。循環(huán)計數(shù)(Loop Count)指定了 JMeter 要重復(fù)測試的次數(shù)。在這個屏幕中,還可以修改我們的線程組名稱。接下來按 圖 3 所示輸入設(shè)置,這將為我們提供 30 個同時啟動的用戶。該測試將運行 100 次。
圖 3. 線程組的設(shè)置
與數(shù)據(jù)庫對話
現(xiàn)在,我們將指定如何與 DB2 UDB 通信。我們要以 JDBC 請求的形式與 DB2 UDB 進行通信。右擊剛才建立的線程組( DB2 Test),選擇 Add => Sampler => JDBC Request。
然后,您將看到一個屏幕,我們可以在其中設(shè)置一些只與 DB2 有關(guān)的信息,這樣才能與我們的 DB2 數(shù)據(jù)庫進行對話。這些信息包括:JDBC URL、JDBC 驅(qū)動程序,以及我們的用戶名和口令。在這個屏幕上, 我們還可以指定有關(guān)連接池的信息,以及想要應(yīng)用到數(shù)據(jù)庫上的 SQL 查詢。
接下來,我們使用 圖 5 所示的值進行測試。對于那些不太熟悉連接池的讀者來說,連接池就是一組數(shù)據(jù)庫連接的維護,以便應(yīng)用程序重復(fù)使用。數(shù)據(jù)庫連接池在 Web 環(huán)境中很常見,因為 Web 用戶連接、斷開連接非常頻繁。在數(shù)據(jù)庫世界中,獲得數(shù)據(jù)庫連接是一項昂貴的操作。我們必須建立連接、維持連接,然后在操作完成的時候斷開連接。利用 JMeter,我們可以分析連接池的優(yōu)勢。
圖 5. 指定數(shù)據(jù)庫的連接信息
用監(jiān)聽器監(jiān)聽結(jié)果
這時,我們真正定義了一個 JMeter 測試,它將測試我們的 DB2 數(shù)據(jù)庫。此時我們面臨的問題是沒有辦法看到測試結(jié)果。為了解決這個問題,請右擊 JDBC Request,然后選擇 Add => Listener => Graph Results ,如下圖所示:
圖 6. 指定圖形化結(jié)果
?
?
把您的腳放在 JMeter 的踏板上
現(xiàn)在是啟動 JMeter 測試的時候了。從主菜單中選擇 Run ,然后選擇 Start,如 圖 7 所示。
圖 7. 啟動測試
請注意在屏幕右上角閃亮的屏幕區(qū)域。這個區(qū)域表明測試正在運行。在這個時候,您應(yīng)當(dāng)看到,圖形被有關(guān)信息填充,信息的內(nèi)容是執(zhí)行指定查詢所需要的時間(平均時間)(參見 圖 8)。
圖 8. 進行測試時以圖形方式顯示結(jié)果
您可能會考慮采用更多并發(fā)用戶(線程組中的線程),來查看增加用戶負載對于執(zhí)行相同查詢的平均時間的影響。您可能要給查詢所涉及的字段添加索引,然后實際查看索引為具體數(shù)據(jù)庫環(huán)境帶來的好處。
JMeter 允許您通過使用 File => Save Test Plan 保存測試計劃,從而指定保存 JMeter 測試計劃的位置。
JMeter 真的在工作嗎?
不幸的是,JMeter 的錯誤報告功能不那么強大。實際上,在我使用這個工具的時候,我以為錯誤報告功能起作用,而實際上它沒有。因此,您應(yīng)當(dāng)考慮使用 斷言(assertions)特性。斷言允許 JMeter 用戶審核數(shù)據(jù)庫服務(wù)器的響應(yīng),并“斷言”響應(yīng)中確實存在某項數(shù)據(jù)。
在我們進行斷言之前,需要知道我們想從查詢中得到什么結(jié)果。我們可以在命令行處理器中運行查詢,得到我們想要的結(jié)果,如 圖 9 所示。
圖 9. 示例查詢
要添加斷言,需要右擊 JDBC Request,然后選擇 Add => Assertions => Response Assertion,如 圖 10所示。
圖 10. 添加斷言
?
?
您可以在該屏幕中添加文本斷言。單擊 Add ,然后在 Patterns to Test 字段中添加文本 Col1Test-20015 ,因為我們知道在返回結(jié)果中應(yīng)當(dāng)包含該文本(參見 圖 11)。
圖 11. 將文本添加到測試中
現(xiàn)在,我們要添加一個監(jiān)聽器,以監(jiān)聽響應(yīng)斷言。右擊 JDBC Request,然后選擇 Add => Listener => Assertion Results,如 圖 12所示。
圖 12. 添加斷言監(jiān)聽器
這樣您就可以看到斷言結(jié)果屏幕( 圖 13),您甚至可以在該屏幕中指定一個數(shù)據(jù)文件,把斷言數(shù)據(jù)寫入數(shù)據(jù)文件。
現(xiàn)在,當(dāng)您運行測試對象的時候,您應(yīng)該看到用否定或肯定斷言填充的斷言結(jié)果屏幕,是肯定還是否定則取決于是否滿足斷言中的條件。
圖 14 顯示的是成功的斷言
圖 14. 斷言測試為肯定時的結(jié)果
如果修改斷言,查找 Col1Test-40000 (我們知道數(shù)據(jù)庫數(shù)據(jù)中沒有這個文本),那么我們將得到類似 圖 15所示的屏幕。
圖 15. 斷言測試結(jié)果為否定時的結(jié)果
結(jié)束語
可以利用 JMeter 在系統(tǒng)、服務(wù)器和網(wǎng)絡(luò)上模擬繁重的負載。本文中,我們用 JMeter 分析了 DB2 數(shù)據(jù)庫的查詢性能。我們只觸及到 JMeter 功能中很表面的部分。可以用 JMeter 來建立相當(dāng)復(fù)雜卻很有意義的測試計劃。JMeter 會以圖形和活動曲線的形式,快速提供關(guān)于系統(tǒng)性能的可視反饋。您可以用 JMeter 提供的數(shù)據(jù)來確保能夠在調(diào)整您的企業(yè)運作的情況下獲得最佳性能。
致謝
感謝 IBM 多倫多實驗室的 Larry Menard 和 Robert,感謝他們在 JDBC 上的專長,以及他們對本文的幫助。
Kulvir Singh Bhogal 是 IBM 的一名顧問,負責(zé)在全國各地的客戶站點上開發(fā)和實現(xiàn)以 Java 為中心的解決方案。您可以通過 Kulvir 的電子郵件kbhogal@us.ibm.com和他聯(lián)系。
轉(zhuǎn)載于:https://my.oschina.net/bysu/blog/751631
總結(jié)
以上是生活随笔為你收集整理的用 JMeter 测量性能--测试您的 DB2 数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tuxera NTFS for Mac中
- 下一篇: SQL Server timeout分析