Jmeterでメール送受信の負荷テストをやってみよう! | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

過去に、WebサーバーとDBサーバーの負荷テストに関するエントリを書いてみましたが、今回はJmeterを使ってメールサーバーの負荷テストを実行してみます。

なお、Jmeterは2010年02月時点で最新のバージョン2.3.4を利用しています。


Webサーバーの負荷テストに関しては、下記をエントリを参考にしてください。


負荷テストあれこれ-JMeterの使い方-


DBサーバーの負荷テストに関しては、下記のエントリを参考にしてください。


JmeterでDB負荷テストをやってみよう!


結果のレポートの見方に関しては、下記のエントリを参考にしてください。


負荷テストあれこれ-JMeter 負荷のかけ方、レポートの見方-


注意)
この負荷テストは大量のメールの送信、受信を行うことも可能になるため必ず自分が責任の取れるところのみで実行するようにしてください。



Jmeterでメール送受信テストをするための環境設定


まず、素のJmeterではメール送受信の負荷テストは実施できません。
必要になる、JavaMailJAF(Java Activation Framework) のライブラリを追加する必要があります。

サイトからライブラリをダウンロードしたら、ファイルを展開し必要なjarファイルをJmeterのlibフォルダへコピーします。


- コピーするjarファイル
JavaMail: mail.jar
JAF: activation.jar


A Day In The Boy's Life-Jmeterでメール負荷テスト1


これで事前に必要な環境設定は完了です。



メール受信テストをやってみる


Jmeterでメールの受信テストをするには、「Mail Reader Sampler」を利用します。

テスト計画の下にスレッドグループを作成したら、「追加」→「サンプラー」→「Mail Reader Sampler」で追加します。


A Day In The Boy's Life-Jmeterでメール負荷テスト2


追加したら上図のようにパラメータを指定していきます。


- Server Type
利用するプロトコルを指定します。「POP3」「POP3S」「IMAP」「IMAPS」から選択できます。


- Server
接続するメール(POPまたはIMAP)サーバーです。


- Username / Password
接続時のユーザー名とパスワードを指定します。


- Number of messages to retrieve
サーバー上にあるメールの受信数を設定します。「ALL」を指定すると全てのメールを受信します。


- Delete messages from the server
チェックするとメール受信後にサーバー上のメールを削除します。

繰り返しテストをする場合には、メールが削除されて空っぽになるとまずかったりするのでチェックを入れる必要は無いでしょう。


- Store the message using MIME
負荷テストの結果に、メールのヘッダ情報を含めて保存します。

リスナーに「結果をツリーで表示」を追加しておいた場合、ヘッダの詳細を確認することが可能になります。


パラメータの指定が完了したら、リスナーを追加して負荷テストの結果をレポートで見れるようにしておきます。

「グラフ表示」「結果を表で表示」「結果をツリーで表示」あたりのリスナーを追加しておけば、負荷の状況が把握できるでしょう。

リスナーの設定が完了したら「スレッドグループ」にて負荷のレベルを設定します。

メール受信に関する負荷レベルの調整は「負荷テストあれこれ-JMeter 負荷のかけ方、レポートの見方- 」を参照してみてください。


- 「結果をツリーで表示」の結果

A Day In The Boy's Life-Jmeterでメール負荷テスト3


メールサーバーから受信したメッセージを1つずつ確認することもできます。

(内容自体は文字化けして読めないですが・・・)

全体のレスポンスを確認したい場合は、「結果を表で表示」から確認し、パフォーマンスの状況を視覚化したい場合は「グラフ表示」から確認すると良いでしょう。



メール送信テストをやってみる


次は、メール送信のテストですがこちらはJmeter内に送信用のサンプラーが用意されているわけではありません。

「BeanShellサンプラー」を利用してメール送信プログラムを書いてあげます。


まずは、スレッドグループの下に「追加」→「サンプラー」→「BeanShellサンプラー」を追加します。

追加した後は、スクリプト欄に送信プログラムを記載します。

下記は、SMTP-AUTH用のサンプルコードです。

書き方は自由ですから、添付ファイルをつけたメールで負荷テストをするということもできたりします。


import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress; 

Properties props = new Properties();

// SMTPサーバーの情報をセット
props.put("mail.smtp.host", "smtp.example.com");
// SMTP-AUTHで送信する
props.put("mail.smtp.auth","true");
props.put("mail.debug", "true");

// SMTPポートの設定
props.put("mail.smtp.port", String.valueOf("25"));

Session sess = Session.getInstance (props);

MimeMessage mimeMessage = new MimeMessage(sess);

// 送信元アドレスと送信者名を指定
mimeMessage.setFrom(new InternetAddress("foo@example.com", "test","iso-2022-jp"));

// 送信先メールアドレスを指定
mimeMessage.setRecipients(Message.RecipientType.TO, "bar@example.com");

// 件名
mimeMessage.setSubject("テスト","iso-2022-jp");

// 送信日時
mimeMessage.setSentDate( new Date());

// 本文
mimeMessage.setText("テストメッセージ","iso-2022-jp");

// SMTPサーバーとコネクション確立
Transport tp = sess.getTransport("smtp");

// SMTP-AUTH用ユーザ名とパスワードを設定しコネクト
tp.connect(null,"foo@example.com","hogehoge");

// メール送信
tp.sendMessage( mimeMessage,mimeMessage.getAllRecipients());

// コネクションクローズ
tp.close();

プログラムができたら、受信のときと同様にリスナーを追加しておきます。

メール送信に関する負荷レベルは、送信プログラム内で大量送信するようなロジックもかけてしまいますが、どれくらいの負荷(コネクションやメール送信数)をかければサーバーのパフォーマンスが落ちるのかなどの結果が分りづらくなるため、基本プログラムはメールを1通送るというようなシンプルなものにして、スレッドグループで調整したほうが無難かと思います。


プログラムにエラーがある場合は、「結果をツリーで表示」内にエラー内容が出てきますので、その情報から
デバッグすることもできます。


- 「結果をツリーで表示」の結果


A Day In The Boy's Life-Jmeterでメール負荷テスト4



あまり機会はないかもしれませんが、メールの大量送信・大量受信をした際のメールサーバー側の負荷やパフォーマンスをチェックしたいというときにJmeterを利用できるかと思います。


参考: Jmeterでメール配信 @ 覚えたことを忘れない為のメモ