DHCPv6負荷試験ツール

Table of Contents

Table 1: 更新履歴
ver 種別 内容      
0.1.0 新規作成 DHCPv6負荷ツール作成      
0.1.1 機能追加 トランザクションごとに、シナリオデータを変化させる機能を追加      
0.1.2 不具合修正 ステータスコードを正しく判定するように修正      
0.1.3 不具合修正 リレー経由のときに、異常なステータスコードを受けた時に、Segmentation Fault になる不具合を修正      
           

はじめに

本書は DHCPv6負荷試験ツール「dhcp6perf」についてのリファレンスマニュアルです。

DHCPv6負荷試験ツールは、DHCPv6サーバに対して複数のクライアントが同時にDHCPアドレスを取得する動作を模倣し、高負荷時の性能試験・評価を行うためのツールです。
また、DHCPv6の情報はシナリオデータファイルを用いることで、クライアントによるリース要求・解放以外にも、リレー経由や独自なオプションを指定しての試験が可能となっています。

クイックスタートガイド

DHCPv6負荷試験ツールは、以下のような書式で起動します。

./dhcp6perf -v -s <DHCPサーバ IPアドレス> <デバイス名>

<デバイス名>はDHCPv6サーバが設置されているネットワーク内のネットワークデバイス名に置き換えてください。
指定したDHCPv6サーバのIPアドレスへユニキャストでSOLICITメッセージ、REQUESTメッセージ、RELEASEメッセージを送信します。

DHCPサーバとの通信ができないと、以下のように表示され、測定失敗となります。

secs success failure  active | minimum current maximum | average slowest fastest
   1       0       0       0 |       0       0       0 |       0       0       0
   2       0       0       2 |       0       0       0 |       0       0       0
   3       0       0       3 |       0       0       0 |       0       0       0
Unable to continue.

DHCPサーバとの通信に成功すると、以下のような表示から始まります。

secs success failure  active | minimum current maximum | average slowest fastest
   1       0       0       0 |       0       0       0 |       0       0       0
   2       1       0       1 |       0       0       0 |     303     303     303
   3       2       0       1 |       0       2       2 |     303     303     303
...

最初にDHCPv6サーバの限界性能を測定します。
currentの値は、1秒あたりのDHCPメッセージ処理数数を表しており、2000のときは約 0.5ミリ秒間隔で送信しています。
各カラムの説明は統計情報出力についてに記載されています。

最大処理数を決定したら、最大処理数の半分の処理数から測定を開始します。
この測定時間はデフォルト120秒で、この間エラーが小さければ測定成功となり処理数を上げ、逆にエラーが増えると処理を下げ、再び測定を行います。

secs success failure  active | minimum current maximum | average slowest fastest
  19    4125     133    2726 |       0    2000    2000 |     302     332     300
Inital probe complete: High-water mark is 2000 clients/second.

最終的に、エラーが小さく処理数が多い結果をDHCPサーバの性能として評価します。

secs success failure  active | minimum current maximum | average slowest fastest
  20    4936     505    3579 |       0       0    2000 |     302     332     300
  21    5174    1008    2334 |       0       0    2000 |     302     334     300
  22    5174    1000    1334 |       0       0    2000 |     302     334     300
  23    5174    1334       0 |       0       0    2000 |     302     334     300
Preparing for next test run.
  24    5174       0       0 |       0       0    2000 |     302     334     300
  25    5174       0       0 |       0       0    2000 |     302     334     300
  26    5174       0       0 |       0       0    2000 |     302     334     300
  27    5174       0       0 |       0       0    2000 |     302     334     300
  28    5174       0       0 |       0       0    2000 |     302     334     300
Beginning test run: 1000 clients/second for 120 seconds.
  29       0       0       0 |       0    1000    2000 |       0       0       0
  30     566       0     372 |       0    1000    2000 |     301     303     300
  31    1372       0     507 |       0    1000    2000 |     301     304     300
  32    2160       0     659 |       0    1000    2000 |     301     304     300
  33    2943     134     681 |       0    1000    2000 |     301     304     300
Stopping run after 33 seconds; 134/7056 clients failed.
Preparing for next test run.
  33    2943       0     682 |       0       0    1000 |     301     304     300
  34    3182     134     309 |       0       0    1000 |     302     335     300
  35    3182     155     154 |       0       0    1000 |     302     335     300
  36    3182     154       0 |       0       0    1000 |     302     335     300
  37    3182       0       0 |       0       0    1000 |     302     335     300
Beginning test run: 500 clients/second for 120 seconds.
  38       0       0       0 |       0     500    1000 |       0       0       0
...
 706   88228       0     455 |     775     777     779 |     302     377     300
Succeeded test run: 88228/88246 clients/seconds.

この結果は、「1秒あたり 777 トランザクションを処理できる」ことを示しています。

Finished and report: 777 transactions per second.

以上が、基本的な試験の流れになります。
ただし、この試験は簡易的なものです。細かなパラメータを指定した試験は、シナリオデータファイルを用いて行ってください。

インストール方法

本ツールは、現在 CentOS 5, 6, 7 の 64bit が用意されています。RPM版は

rpm -ivh dhcp6perf-<バージョン番号>.rpm

コマンドでインストールすることができ、以下のファイルが展開されます。

/usr/bin/dhcp6perf
/usr/share/ncad/dhcp6perf/relays.dat
/usr/share/ncad/dhcp6perf/release.dat
/usr/share/ncad/dhcp6perf/request.dat
/usr/share/ncad/dhcp6perf/solicit.dat

起動オプション

  • -h –help
    ヘルプメッセージを表示
  • -V –version
    バージョン情報を表示
  • -q –quiet
    メッセージをまったく表示しない
  • –test-mode [name]
    highload: 最高速を測定し、徐々に下げる
    endless: 一定数の負荷をかけつづける
    once: 1回だけ処理を行う
  • -v –progress
    1秒ごとに統計情報を表示
  • -s –server サーバIPアドレス
    DHCPv6サーバのIPアドレスを指定。無指定の場合は、マルチキャストアドレスで行う
  • -t –test-duration 時間
    測定時間(秒)を指定。デフォルト値は120秒
  • -c –clients 個数
    初期時における1秒間の同時リクエスト数を指定
  • –timeout 時間
    DHCPv6パケットのタイムアウトとして判定する時間を指定。デフォルトは3秒
  • –cooldown-time 時間
    測定して終わってから、次の測定が始まるまでの待機時間を指定。デフォルトは5秒
  • –nthreads スレッドプール数を指定
    プログラムで使用するスレッドプール数を指定。コア数に合わせると処理効率が高まる

データ定義

シナリオデータファイルには、DHCPv6リクエストの内容を定義することができます。

DHCPv6メッセージ名

DHCPv6パケットは、以下の7種類のメッセージを指定することができます。

  • SOLICIT
    SOLICITメッセージを送信します。
  • REQUEST
    REQUESTメッセージを送信します。
  • CONFIRM
    CONFIRMメッセージを送信します。
  • RENEW
    RENEWメッセージを送信します。
  • REBIND
    REBINDメッセージを送信します。
  • RELEASE
    RELEASEメッセージを送信します。
  • DECLINE
    DECLINEメッセージを送信します。

オプションパラメータ

DHCPv6パケットのオプションデータは、以下のような形式で定義することができます。
ただし、払い出し指定に利用されるオプションコードは特殊な形式で定義します。(詳しくは払い出しオプションコードを参照)

<Option-Code> = <Option-Value>

オプションコード

<Option-Code>には、以下の名称を指定することができます。
また、名称が定義されていない場合でも、数値で指定することが可能です。

Table 2: オプション名の種類
番号 名称 意味    
1 CID      
2 SID      
3 IA_NA      
4 IA_TA      
5 IAADDR      
6 REQUEST_OPTION      
7 PREFERENCE      
8 ELAPSED_TIME      
9 RELAY_MESSAGE      
11 AUTHENTICATION      
13 STATUS_CODE      
14 RAPID_COMMIT      
15 USER_CLASS      
16 VENDOR_CLASS      
17 VENDOR_INFO      
18 INTERFACE_ID      
19 RECONFIGURE_MESSAGE      
20 RECONFIGURE_ACCEPT      
23 NAME_SERVERS      
24 DOMAIN_SEARCH      
25 IA_PD      
26 IAPREFIX      
32 INFO_REFRESH_TIME      
37 REMOTE_ID      
38 SUBSCRIBER_ID      
39 CLIENT_FQDN      
44 LEASEQUERY_QUERY      
45 CLIENT_DATA      
46 CLIENT_LT_TIME      
47 CLIENT_RENEWAL_DATA      

オプション値

<Option-Value>には、整数、文字列、IPv6アドレスを組み合わせたパラメータを指定したり、DHCPv6サーバからのリプライパケットを指定することが可能です。

  • 文字データ

    文字データは、1バイトのデータを表す際に使用します。
    'A' のように、シングルクォートで1文字を囲うことで表現でき、文字はアスキーコードに基づいた値 97 が設定されます。
    また、'\141' と記述すると8進数表記になり、'\x61' と記述すると16進数表記になります。

'a'  '\141'   '\x61'
  • 16ビット整数データ

    16ビット整数データは、日常で使われる 1 や 2 といった数値で表現することができます。
    ただし、-1 などの負の数や 3.14 といった小数点を含む数は指定することはできません。

100   200   300
  • 32ビット整数データ

    32ビット整数データは、16ビット整数の接尾に l または L を指定することで表現することができます。

100L   200L   300L

※ 16ビット整数と32ビット整数は、バイトオーダーの変換に違いがあります。16ビット整数であれば、16ビット単位でネットワークバイトオーダーに変換され、32ビット整数であれば、32ビット単位でネットワークバイトオーダーに変換されます。

  • 文字列データ

    ""(ダブルクォート)で囲われた範囲が文字列データとして表現されます。

"hello"   "world"
  • 16進数データ列

    16進数をハイフン繋ぎで記述すると16進数データ列として表現されます。

1-12-23-34-45-56-67-78-89-9a-ab-bc-cd-de-ef
  • IPv6アドレス

    IPv6アドレスを記述すると、32バイト長のIPv6アドレスとして表現されます。

fe00::100
  • 連結

    上記6種のデータをスペース区切りで並べることで、複雑なオプションデータを表現することができます。

    例えば、REMOTE_ID は先頭4バイトは enterprise-number データで、それ以降が remote-id データであるとRFC4649に明記されています。
    その場合に enterprise-number に相当する4バイトを32ビット整数で設定し、それ以降を文字列として設定することで REMOTE_IDオプションを設定することができます。この記述例を以下に示します。

REMOTE_ID  =  32473L  "example"
  • @auto

    オプション値に「@auto」を指定すると、DHCPv6サーバからのリプライパケットの値を利用することができます。
    例えば SID は、DHCPv6サーバからのリプライされて初めて認識できる値で、これに @auto を指定することでDHCPv6サーバからの応答によって変化するパラメータを指定することが可能となります。

    CID は特別で、ユニークなCIDが自動で割り振られます。

払い出しオプションコード

IPv6アドレス払い出し

IPv6アドレスの払い出しは、IA_NA, IAADDR オプションを以下のような形式で定義します。

IA_NA  <IAID>  {
    T1  =  <T1>,
    T2  =  <T2>,
    IAADDR  =  @auto
}

<IAID>, <T1>, <T2>には、0以上、2^32より小さい範囲の数値を指定してください。
IAADDR は、DHCPv6サーバで払いだされたIPv6アドレスが指定されますので、通常は @auto を指定します。

また、T1,T2パラメータは省略可能で、省略した場合は無制限となります。

※IAID は、1以上であることがRFC3315に明記されていますが、試験ツールのため 0 を指定することが可能です。

IPv6プレフィックスアドレス払い出し

IPv6プレフィックスアドレスの払い出しは、IA_PD, IAPREFIX オプションを以下のような形式で定義します。

IA_PD  <IAID>  {
    T1  =  <T1>,
    T2  =  <T2>,
    IAPREFIX  =  @auto
}

<IAID>, <T1>, <T2>には、0以上、2^32より小さい範囲の数値を指定してください。
IAPREFIX は、DHCPv6サーバで払いだされたIPv6アドレスが指定されますので、通常は @auto を指定します。

また、T1,T2パラメータは省略可能で、省略した場合は無制限となります。

※IAID は、1以上であることがRFC3315に明記されていますが、試験ツールのため 0 を指定することが可能です。

シナリオデータファイル

DHCPv6負荷試験ツールは、シナリオデータファイルを用いて、様々な試験を行うことができます。

シンプルなシナリオ

DHCPv6の負荷試験には、SOLICIT, REQUEST, RELEASE の3つの動作で行うことがよくあるので、それを例にとって設定方法を説明します。
1つのファイルで1つのDHCPv6送信パケットを定義します。最初は SOLICIT で、最も簡潔に記述できる方法を以下に示します。

SOLICIT {
    CID = @auto,
    SID = @auto,
    IA_NA 1 {
        IAADDR = @auto
    }
}

REQUEST や RELEASE も SOLICIT と同じで、以下のように記述します。

REQUEST {
    CID = @auto,
    SID = @auto,
    IA_NA 1 {
        IAADDR = @auto
    }
}
RELEASE {
    CID = @auto,
    SID = @auto,
    IA_NA 1 {
        IAADDR = @auto
    }
}

これらのファイルを dhcp6perf に指定して実行すれば、SOLICIT、REQUEST, RELEASE の3つの動作を用いた負荷試験が行えます。

./dhcp6perf -v <デバイス名> ./solicit.dat ./request.dat ./release.dat

IA_NA、IA_PD の同時払い出しのシナリオ

1度に IA_NA と IA_PD を同時に払い出す場合、つなげて記述するだけで定義することができます。

SOLICIT {
    CID = @auto,
    SID = @auto,
    REQUEST_OPTION = 23 24,
    IA_NA 1 {
        IAADDR = @auto
    },
    IA_PD 1 {
        IAPREFIX = @auto
    }
}
REQUEST {
    CID = @auto,
    SID = @auto,
    REQUEST_OPTION = 23 24,
    IA_NA 1 {
        IAADDR = @auto
    },
    IA_PD 1 {
        IAPREFIX = @auto
    }
}
RELEASE {
    CID = @auto,
    SID = @auto,
    REQUEST_OPTION = 23 24,
    IA_NA 1 {
        IAADDR = @auto
    },
    IA_PD 1 {
        IAPREFIX = @auto
    }
}

※ 本ツールは、複数の払い出し要求を指定した場合、すべての要求に対してアドレスが払い出されないと成功として判定されないので注意してください。

リレー経由のシナリオ

DHCPv6で、リレー経由を行うためには、リレー用のシナリオファイルが必要です。

リレー用のシナリオファイル

リレー用のシナリオファイルは、以下のように記述します。

RELAY <Peer-Address> <= <Link-Address>  {
    <Option-Code> = <Option-Value>,
    <Option-Code> = <Option-Value> ...
}

<Peer-Address> には、DHCPv6サーバ側のPeerAddressを、<Link-Address> にはクライアント側のLinkAddressを、ぞれぞれ指定します。
※ リレー用のシナリオファイルには、@auto を指定することができないので注意してください。

また、リレーを多段に行うことも可能で、その場合は、以下のように記述します。

RELAY <Peer-Address1> <= <Link-Address2>  {
},
RELAY <Peer-Address2> <= <Link-Address2>  {
},
RELAY <Peer-Address3> <= <Link-Address3>  {
} ...

このファイルを dhcp6perf の最初のシナリオファイルとして指定し、実行すれば、SOLICIT、REQUEST, RELEASE の3つの動作をリレー経由での負荷試験となります。

./dhcp6perf -v <デバイス名> ./relay.dat ./solicit.dat ./request.dat ./release.dat

転送先DHCPv6サーバの指定

DHCPv6の通信は、クライアント動作の場合であれば、マルチキャストアドレス ff05::1:3 を用いていましたが、リレー経由の場合はリレーエージェントから指定のDHCPv6サーバへ転送させる場合があります。
その場合、コマンドライン引数の -s オプションを指定することで、DHCPv6サーバとユニキャストで通信することが可能です。

トランザクションごとにシナリオデータを変化させる

以下のようなDHCPのシナリオデータを記述すると、トランザクションごとにオプション値を変化させることができます。 

<Option-Code> = [ <Option-Value>, <Option-Value>, ... , <Option-Value> ]

また、シナリオデータファイルを複数使用する場合、2つ目以降のファイルに @auto を指定すれば、使用したオプション値を再利用します。
例えば、INTERFACE_ID を "sample1", "sample2", "sample3" を使用する場合は、まず SOLICIT用のファイルに以下のような記述を追加します。

INTERFACE_ID = [ "sample1", "sample2", "sample3" ]

次に、REQUEST や RELEASE のシナリオデータファイルには、以下のような記述になります。

INTERFACE_ID = @auto

リレー用のシナリオデータファイルも同様の設定でオプション値を変化させることができます。
リレーには @auto の指定はありませんが、必ず同じトランザクションでは同じパラメータを利用します。

負荷試験の種類

  • default
    最初に最大負荷を測定します。一秒ごとに負荷を上げ、エラー率がしきい値を超えたときを最大負荷とします。
    最大負荷を求めたら、計測時間だけ一定の負荷を与え続け、エラー率がしきい値を超えた場合、負荷を下げます。逆にエラー率がしきい値をこえなかったら負荷を上げ、DHCPv6の性能を評価します。
  • endless
    一定の負荷をずっと与え続ける試験です。
  • 1
    DHCPv6サーバとの処理を1回だけ行う試験です。

統計情報出力について

コマンドライン引数 -v もしくは –progress を付けて起動すると、1秒ごとの統計種情報が標準出力に表示されるようになります。

各項目は、以下のようになっています。

  • secs
    プログラムが起動してからの時間
  • success
    処理が正常に完了した累積数
  • failure
    NAK応答もしくは、一定時間無応答の数
  • active
    処理中もしくは受信待ちの数
  • minimum
    1秒あたり最低処理数
  • current
    1秒あたりの処理数
  • maximum
    1秒あたりの最大処理数
  • average
    1処理の開始から終了までに要した平均時間。単位ミリ秒
  • slowest
    1処理の開始から終了までに要した最長時間。単位ミリ秒
  • fastest
    1処理の開始から終了までに要した最短時間。単位ミリ秒

Date: 2014年 12月 25日

Author: 日本シー・エー・ディー株式会社 製品開発事業部

Created: 2015-08-24 月 23:44

Emacs 24.4.1 (Org mode 8.0.7)

Validate