Load Tester (multiple remote servers) Powered by Apache JMeter™は、Apache JMeter™をMicrosoft Azure上の複数のサーバーで稼働させ、大規模な負荷テストができるものです。

JMeterデフォルトでは添付されていないJDBC Driverが必要なデータソースへの負荷テストを行う場合、そのJDBC DriverファイルをすべてのJMeterサーバーに配布する必要があります。
しかし、多数のJMeterサーバーを用意した場合、そのすべてにJDBC Driverをセットアップすることは面倒な作業です。

Load Tester (multiple remote servers) Powered by Apache JMeter™では、それを簡単に実現する方法が用意されています。

手順概要

  1. JDBC Driverを取得する
  2. JMeterサーバーのJavaライブラリ用ディレクトリをネットワークディスクに作成し、JDBC Driverファイルを配置する
  3. JMeterサーバー用のjmeter.propertiesファイルでuser.classpathを設定する
  4. すべてのJMeterサーバーを一括再起動する

手順詳細

今回は、Microsoft SQL Server用JDBC Driverを導入し、Azure SQL Databaseへのテストをすることとします。

  1. JDBC Driverを取得する
    JMeterクライアントにリモートデスクトップでログインし、Webブラウザを利用して以下のページから最新のJDBC Driverをダウンロードします。
    https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15
    コンソールで以下のようなコマンドを実行することでもダウンロードすることができます。
    $ curl -L https://go.microsoft.com/fwlink/?linkid=2137600 -o sqljdbc.zip
    
    (2020/08/10現在)
  1. JMeterサーバーのJavaライブラリ用ディレクトリをネットワークディスクに作成し、JDBC Driverファイルを配置する
    クライアントおよびサーバーの /mnt/systmp および /mnt/jmuserdata にネットワークディスクがマウントされています。
    このいずれかに、サーバー用のJDBC Driverファイルを配置するためのディレクトリを作成し、そこにJDBC Driverファイルをコピーします。
    $ mkdir /mnt/systmp/lib
    $ unzip {ダウンロードファイル.zip}
    $ cp sqljdbc_{バージョン}\\enu/mssql-jdbc-{バージョン}.jre8.jar /mnt/systmp/lib
    

    2020/08/10時点でリリースされているLoad TesterでのJMeterはJava 8を利用しているため、ここではそれに対応したファイル(*.jre8.jar)をコピーしています。
    Load Testerは次のリリースで、Javaのバージョンを選択できるようになります。

  1. JMeterサーバー用のjmeter.propertiesファイルでuser.classpathを設定する
    JMeterサーバー用のjmeter.propertiesファイルは、クライアントから /mnt/systmp/jmeter.properties ファイルを編集することでサーバーに反映することができます。
    ファイル内から "user.classpath"を探し出し、以下のように前の手順でJDBC Driverファイルを配置したディレクトリを設定します。
    # List of directories that JMeter will search for utility and plugin dependency classes.
    # Use your platform path separator to separate multiple paths.
    # Any jar file in such a directory will be automatically included,
    # jar files in sub directories are ignored.
    # The given value is in addition to any jars found in the lib directory.
    # All entries will be added to the class path of the system class loader
    # and also to the path of the JMeter internal loader.
    # Paths with spaces may cause problems for the JVM
    user.classpath=/mnt/systmp/lib
    
  1. JMeterサーバーを再起動する
    Azure PortalでJMeterサーバーの仮想マシンのスケールセットを再起動します。
    JMeterサーバーの仮想マシンのスケールセットは、Load Testerの導入時にJMeter ServersのVirtual machine scale set nameとして指定した名前で作られています。
    Azure Portal
    これにより、すべてのJMeterサーバーが一括で再起動され、JDBC Driverが利用可能になります。

動作確認

それではJMeterでAzure SQL Databaseに対してテストをしてみましょう。

  1. JMeterを起動する
  1. Test Planに"JDBC Connection Configuration"を追加し設定する
    Add (追加) > Config Element (設定エレメント) > JDBC Connection Configuration
    JDBC Connection Configuration
    • Variable Name Bound to Pool
      • Variable Name for created pool: JDBC Request Samplerから指定する識別名
    • Database Connection Configuration
      • Database URL: 接続文字列(サーバー名およびデータベース名)
        例)
        jdbc:sqlserver://SERVERNAME.database.windows.net:1433:database=DBNAME;
        
      • JDBC Driver class: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
      • Username: 接続するユーザー名
      • Password: 接続するユーザーのパスワード
  1. Test Planに"Thread Group"を追加する
    Add (追加) > Threads (Users) > Thread Group (スレッドグループ)
  1. 追加したThread Groupに"JDBC Request"サンプラーを追加し設定する
    Add (追加) > Sampler (サンプラー) > JDBC Request
    JDBC Request
    • Variable Name Bound to Pool
      • Variable Name of Pool declared in JDBC Connection Configuraion:
        前のJDBC Connection Configurationで"Variable Name Bound to Pool"設定した値
    • SQL Query: テスト実行するSQL文
  1. Test Planあるいは同じThread Groupに適当なリスナーを追加する
    ここでは動作確認のために"View Results Tree"を追加します。
    Add (追加) > Listener (リスナー) > View Results Tree (結果をツリーで表示)
  1. テストを実行する
    メニュー > Run (実行) > Remote Start All (全て開始(リモート))
  1. 結果を確認する
    View Results Treeで適当なJDBC RequestのSampler resultを選択し、Response messageが"OK"であればテストによるリクエストが成功しています。
    View Results Tree

リクエストが成功しない場合は、以下の手順で切り分けができるかもしれません。

  • ログビューアを参照する
    1. メニューの Options (オプション) > Log Viewer
    2. ウィンドウ右下に表示されるログビューアに出力されたExceptionなどの情報から判断する
  • クライアントだけでテストを実行する
    1. JMeterクライアントにJDBC Driverファイルを配置する
      JDBC Driverファイルを /usr/local/jmeter/lib にコピーします。
      $ cp sqljdbc_{バージョン}\\enu/mssql-jdbc-{バージョン}.jre8.jar /usr/local/jmeter/lib/
      
    2. クライアントのJMeterを起動または再起動する
    3. メニュー > Run (実行) > Start (開始)
    4. View Results TreeのエラーになっているJDBC Requestの"Response data"から問題を判断する
  • クライアントだけでのテストではエラーにならない場合は、リモートテストでもResponse dataが取得できるようにする
    1. クライアントの設定ファイル (/usr/local/jmeter/bin/jmeter.properties) でmodeをStandardにする
      # Remote batching support
      # Since JMeter 2.9, default is MODE_STRIPPED_BATCH, which returns samples in
      # batch mode (every 100 samples or every minute by default)
      # Note also that MODE_STRIPPED_BATCH strips response data from SampleResult, so if you need it change to
      # another mode
      # Batch returns samples in batches
      # Statistical returns sample summary statistics
      # mode can also be the class name of an implementation of org.apache.jmeter.samplers.SampleSender
      mode=Standard
      
    2. クライアントのJMeterを起動あるいは再起動する
    3. "Remote Start All (すべて開始(リモート))"でテストを実行し、View Results TreeのエラーになっているJDBC Requestの"Response data"から問題を判断する

    解決したら、jmeter.propertiesファイルのmode設定を元に戻すことを忘れないように注意してください

JMeter Pluginも同様の方法で導入することができます。
その詳細な手順については今後書きたいと思っています。