DHCPv6負荷試験ツール
Table of Contents
ver | 種別 | 内容 | |||
---|---|---|---|---|---|
0.1.0 | 新規作成 | DHCPv6負荷ツール作成 | |||
0.1.1 | 機能追加 | トランザクションごとに、シナリオデータを変化させる機能を追加 | |||
0.1.2 | 不具合修正 | ステータスコードを正しく判定するように修正 | |||
0.1.3 | 不具合修正 | リレー経由のときに、異常なステータスコードを受けた時に、Segmentation Fault になる不具合を修正 | |||
0.1.4 | 不具合修正 | request.dat を指定したときに Segmentation Fault になる不具合を修正 | |||
0.1.5 | 機能追加 | パラメータに空文字を記述できる機能を追加 | |||
はじめに
本書は DHCPv6負荷試験ツール「dhcp6perf」についてのリファレンスマニュアルです。
DHCPv6負荷試験ツールは、DHCPv6サーバに対して複数のクライアントが同時にDHCPアドレスを取得する動作を模倣し、高負荷時の性能試験・評価を行うためのツールです。
また、DHCPv6の情報はシナリオデータファイルを用いることで、クライアントによるリース要求・解放以外にも、リレー経由や独自なオプションを指定しての試験が可能となっています。
クイックスタートガイド
DHCPv6負荷試験ツールは、以下のような書式で起動します。
./dhcp6perf [起動オプション]... <デバイス名> [シナリオデータファイル]...
簡単に試すときは、以下のように、指定してください。
./dhcp6perf -v -s <DHCPv6サーバ IPアドレス> <デバイス名>
<デバイス名>はdhcp6perfを実行するホストのネットワークデバイスのうち、DHCPv6サーバのネットワークへ通信が可能なものの名前に置き換えてください。
指定したDHCPv6サーバのIPアドレスへユニキャストでSOLICITメッセージ、REQUESTメッセージ、RELEASEメッセージを送信します。
DHCPv6サーバとの通信ができないと、以下のように表示され、測定失敗となります。
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.
DHCPv6サーバとの通信に成功すると、以下のような表示から始まります。
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.
最終的に、エラーが小さく処理数が多い結果をDHCPv6サーバの性能として評価します。
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>には、以下の名称を指定することができます。
また、名称が定義されていない場合でも、数値で指定することが可能です。
番号 | 名称 | 意味 | ||
---|---|---|---|---|
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パラメータは省略可能で、省略した場合は0が指定されます。
※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パラメータは省略可能で、省略した場合は0が指定されます。
※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処理の開始から終了までに要した最短時間。単位ミリ秒