測試您的DB2資料庫:用JMeter測量效能

lin9792發表於2016-05-01

級別: 初級

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和他聯絡。


相關文章