2011年01月11日

実践SNMP+Java-Trap受信性能

久しぶりにSNMP4Jです。今回はTrap受信性能について評価してみます。
一般的な商用ソフトウェアのTrap受信性能は1000~1200(trap/sec)といったところですが、
SNMP4Jの受信性能はどの程度でしょうか?

早速確認してみましょう。

1.目的

SNMP4JライブラリのSNMP Trap受信性能を評価し、運用可能な最大受信性能(受信数/秒)を評価する。


2.原理・方法

1)SNMP Trap

SNMP TrapはSNMPエージェントの状態をマネージャに通知する仕組みであり、
各SNMPバージョン(v1, v2, v3)に応じてPDUフォーマット、暗号化のサポート有無などの
違いがあります。
今回の性能検証ではSNMPv2を利用します。


2)SNMPトラップの送信と受信性能の定義

SNMPトラップ送信は、個別記事:SNMP+Java SNMPv2 トラップ送信で作成したコードを利用します。
トラップ数は5, 10, 50, 100, 150, 200に分け、それぞれトラップ数と同数のスレッドにより送信し、
送信所要時間(ミリ秒)を計測します。
送信数に対し、受信側で欠損すること無く全てのトラップを受信出来た場合、その時の送信数/所要時間を
最大受信性能(受信トラップ数/秒)として考えます。
尚、送信するトラップのバーバインド数は5(全てOCTET STRING値)にします。


3)SNMPトラップの受信

SNMPトラップ受信は、個別記事:実践SNMP+Java - Trap/Inform Receiverで作成したコードを利用します。
但し、受信性能の計測に影響する標準出力は行わず、キューイングした受信数を、ShutdownHookを利用し、
受信プログラムを停止する際に一度だけカウントします。
具体的には次のように受信時は、呼び出されるprocessPduメソッドで受け取るCommandResponderEventを
queue(Collection)にaddするだけで標準出力は行いません。

  public void processPdu(CommandResponderEvent snmpEvent) {
    try {
      queue.add(snmpEvent);
    } catch (Exception e) {
      // notify exception.
      e.printStackTrace();
    }
  }

queueの中身はShutdownHookでCTRL+C又はSIGTERMシグナル受信時に標準出力します。

  public void regsitShutdownHook() {
    Runtime.getRuntime().addShutdownHook( new Thread(this) );
  }

  public void run() {
    // This method is called by SIGTERM.
    System.out.println("receive total: " + queue.size());
  }


4)受信側スレッド数

受信側でMultiThreadedMessageDispatcherに渡すスレッド・プールのサイズが大きい程、
スレッド処理により単位時間あたりの受信可能数が大きくなります。
(但し、物理的なI/Oが並列になる訳ではありませんので必ず上限があります)

  // message dispatcher
  int numWorkers = 5;
  ThreadPool pool = ThreadPool.create("workers", numWorkers);
  dispatcher = new MultiThreadedMessageDispatcher(pool, new MessageDispatcherImpl());

この受信側スレッド数を5, 10, 50, 100, 150, 200とし、それぞれで2)で示した受信性能測定を行います。

5)全体構成

Linuxサーバ上のSNMPマネージャ(受信側)、送信側SNMPエージェント、L2スイッチで構成します。
マネージャ、エージェントPC間の遅延は1ミリ秒以下であることから、2)でエージェント側のトラップ
送信所要時間を概ね受信所要時間であると考え送信所要時間を使って最大受信性能を定義しています。

trap_pfm1


3.結果
測定結果を受信側ThreadPool数毎に表1)-6)で示します。

1)受信側スレッド(ThreadPool)数:5
No.send trapsend time
(msec)
send speed
(trap/sec)
receive trap lost trapreceive speed
(trap/sec)
11031322.6100322.6
250471063.85001063.8
3100472127.766341404.3
4150622419.466841064.5
5200932150.5109911172.0

2)受信側スレッド(ThreadPool)数:10
No.send trapsend time
(msec)
send speed
(trap/sec)
receive trap lost trapreceive speed
(trap/sec)
11015666.7100666.7
250461087.05001087.0
3100621612.971291145.2
4150791898.779711000.0
5200932150.5109911172.0

3)受信側スレッド(ThreadPool)数:50
No.send trapsend time
(msec)
send speed
(trap/sec)
receive trap lost trapreceive speed
(trap/sec))
11015666.7100666.7
250471063.85001063.8
3100621612.910001612.9
4150622419.4111391790.3
5200782564.1136641743.6

4)受信側スレッド(ThreadPool)数:100
No.send trapsend time
(msec)
send speed
(trap/sec)
receive trap lost trapreceive speed
(trap/sec)
11032312.5100312.5
250471063.85001063.8
3100472127.710002127.7
4150781923.115001923.1
5200932150.5161391731.2

5)受信側スレッド(ThreadPool)数:150
No.send trapsend time
(msec)
send speed
(trap/sec)
receive trap lost trapreceive speed
(trap/sec))
11015666.7100666.7
250471063.85001063.8
3100621612.910001612.9
4150781923.115001923.1
52001101818.220001818.2

6)受信側スレッド(ThreadPool)数:200
No.send trapsend time
(msec)
send speed
(trap/sec)
receive traplost trapreceive speed
(trap/sec)
11030333.3100333.3
250471063.85001063.8
3100472127.710002127.7
4150781923.114731884.6
5200782564.120002564.1


4.考察・最大受信性能(速度)評価

1)、2)からは、受信側スレッド数が5, 10では受信速度として500〜700(trap/sec)程度を
満たすが、1000(trap/sec)前後まで早くなると全ては受信出来ないことがわかります。
次に3)、4)からは受信速度として1000(trap/sec)は満たしているが、1600(trap/sec)
以上になると欠損が発生していることがわかります。
最後に5)、6)を見ると1800(trap/sec)で欠損が発生しており、スレッド数を増やした場合にも
受信性能の上限が1800(trap/sec)であることがわかります。

尚、より詳細な評価を行う為、3.結果以外に追加で各2回測定した結果、
 
・ThreadPool数が200の場合にも1400(trap/sec)前後から欠損が発生する。
・ThredPooll数を50以上した場合1400(trap/sec)以下の受信速度では欠損は発生しない。

こともわかりました。
以上より、Trap受信に付随する処理も考慮すると運用上の上限は1100〜1200(trap/sec)が最大値であり、
受信側のThreadPoolは50前後に設定することが望ましいと考えられます。
*最大受信速度が600(trap/sec)以下であればThreadPool数は10でも問題無い。 

 
入門SNMP
入門SNMP
posted with amazlet at 11.01.11
ダグラス・R. マウロ ケビン・J. シュミット 
オライリー・ジャパン 
売り上げランキング: 304385

Google Androidプログラミング入門
江川 崇 竹端 進 山田 暁通 麻野 耕一 山岡 敏夫 藤井 大助 藤田 泰介 佐野 徹郎 
アスキー・メディアワークス 
売り上げランキング: 1306

Posted by netbuffalo at 09:11│TrackBack(0) 実践SNMP+Java 


この記事へのトラックバックURL

'); label.html('\ ライブドアブログでは広告のパーソナライズや効果測定のためクッキー(cookie)を使用しています。
\ このバナーを閉じるか閲覧を継続することでクッキーの使用を承認いただいたものとさせていただきます。
\ また、お客様は当社パートナー企業における所定の手続きにより、クッキーの使用を管理することもできます。
\ 詳細はライブドア利用規約をご確認ください。\ '); banner.append(label); var closeButton = $('