まえがき
某NW機器のDHCPサーバおよびDHCPリレー性能を測定するために、負荷試験を行ったときのメモ。
とっても便利でした。ありがとうございます。
dhcperf
他にも類似のツールがいくつかあるようだが、どうもnominumという会社が開発した dhcperf というツールが有名らしいので、ありがたく使わせてもらいました。
環境
dhcperf自体は最近アップデートされておらず、割と古いアプリケーションになる。
しかし、試した限りCentOS6.8 と CentOS7.2なら使えた。
依存関係が強いアプリケーションでもないので、最近のディストリビューションでも問題なく使えると思う。
[root@localhost ~]# uname -a
Linux localhost 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
準備
nominum社のWebサイトから探してもなかなか見つからない・・・
[root@localhost ~]# wget ftp://ftp.nominum.com/pub/nominum/dhcperf/1.0.1.0/dhcperf-1.0.1.0-1-rhel-4-i386.tar.gz
※略
[root@localhost ~]# tar -xzvf dhcperf-1.0.1.0-1-rhel-4-i386.tar.gz
dhcperf-1.0.1.0-1/
dhcperf-1.0.1.0-1/INSTALL
dhcperf-1.0.1.0-1/RELEASE_NOTES
dhcperf-1.0.1.0-1/dhcperf-1.0.1.0-1.i386.rpm
[root@localhost ~]# yum localinstall dhcperf-1.0.1.0-1/dhcperf-1.0.1.0-1.i386.rpm
※略
[root@localhost ~]# PATH=$PATH:/usr/local/nom/bin/
※rpm -Uvh ~~ を使用してもOK、ただし依存関係は自分で解決すること。CentOS7-minimalだとlibc.so.6は絶対必要。
※普段から使う場合は.bash_profileなどでパス通してあげたほうが良いです。
使用方法
基本構文
一先ず、これで試験自体は出来る。
--discoverと指定しているが、これにより、dhcp discover => offfer => request => ack => release のフルコースを自動的に行ってくれる
dhcperf --discover --server [dhcp_server] --progress
ex) dhcperf --discover --server 192.168.1.1 --progress
--progressは進捗状況表示なので、別になくてもいいが、一回ツールが走ると場合によっては数分待たされることになるので、精神衛生的にも状況が見えていたほうが良いと思う
実行後色々表示されるが、一番最後に秒間いくつを捌けたか、という値が表示される。
ex)
discoverのとき:
244 five-way handshakes per second.
renewのとき:
312 DHCPRENEW transactions per second.
主要なオプション
他にもあるのだけど、よく使うのは以下。
--discover: dhcp discover => offfer => request => ack => release を行う
--one-discover: dhcp discover => offfer => request => ack を一度だけ行う(後述するチェック用)
--renew: request => ack のみを行う
--retain-leases: --discoverと組み合わせて使用する。releaseを行わないようにする。
--test-duration: ツールを実行する期間。秒指定。
--test-load: 秒間いくつのdiscoverあるいはrenewを行うか。
--progress: 進捗表示
チェック
dhcperfには、ツールの動作状況をチェックするための便利オプションが備わっている。
本格的に使う前に必ず一度はこれを実行して動作状況を見ておいたほうが良い。
[root@localhost ~]# dhcperf --one-discover --server 192.168.1.1
Sending DHCPDISCOVER.
Received DHCPOFFER of 192.168.1.100.
Sending DHCPREQUEST for 192.168.1.100.
Received DHCPACK of 192.168.1.100.
Acquired address: 192.168.1.100
dhcp renewのみ試験
--discoverではなく、--renewを使用する
これにより、request => ack のみを行う。
releaseは行われないので、プールのリースアドレスが枯渇しないように注意。
[root@localhost ~]# dhcperf --renew --server 192.168.1.1
--test-duration --test-load について
上記2つのオプションを使うことで、何秒間、どれくらいのdhcp負荷に耐えられるか、という試験が行えるので、割と使う場合は多い。
※要は最大どれぐらい耐えられるのか?という調査目的より、絶対これぐらい、この程度の時間は耐えられるよな!!っていう確認の試験
ちなみに、--test-durationと--test-loadがない場合、dhcperfは自動測定モードになる。
なので、簡単にdhcpサーバがどこまで捌けるのか最大値を探りたいなら、何もオプションを付けずただ実行すれば良い。
ただ、私が試した限り、うまく動作しない状況があった(client ==> dhcp relay ==> dhcp server)
--one-discoverも成功するし、普通に使う分には全然平気なのだが・・・dhcperfを使うと、てんで性能が出ない。
そんなとき、--test-durationと--test-loadを使うとうまくいった。
自動モードだと一気にドカッとやりすぎて、サーバ側の調子が悪くなったのかも・・・?(とはいえCPU使用率などは普通だったんだけども)
サンプル
60秒間, 秒間250のdhcp discoverを捌けるかどうかを試験
[root@localhost ~]# dhcperf --discover --server 192.168.1.1 --test-duration 60 --test-load 500 --progress
Beginning DHCPDISCOVER load test.
secs success failure active | current
0 0 0 0 | 1
1 249 0 0 | 250
2 250 0 0 | 250
3 250 0 0 | 250
4 250 0 0 | 250
5 250 0 0 | 250
※略
55 250 0 0 | 250
56 250 0 0 | 250
57 250 0 0 | 250
58 250 0 0 | 250
59 250 0 0 | 250
60 250 0 0 | 250
15000/15000 successes: 100.0% succeeded.
60秒間, 秒間750のdhcp discover(releaseなし)を捌けるかどうかを試験
※実際にユーザが使うときに一気にdhcpでIPアドレス取得はしても、使い終わるタイミングはユーザによってそれぞれ違うので、releaseも同じタイミングでやらないほうが本当のユーザの使い方っぽいんじゃね?という想定
※releaseが行われない以上、アドレスをリースしっぱなしになるので枯渇しないように注意(下の例のように)
[root@localhost ~]# dhcperf --discover --server 192.168.1.1 --retain-leases --test-duration 60 --test-load 750
Beginning DHCPDISCOVER load test.
secs success failure active | current
※略
38 751 0 1 | 750
39 751 0 1 | 750
40 750 0 1 | 750
41 750 0 1 | 750
42 751 0 0 | 750
43 750 0 0 | 750
44 253 0 497 | 750
45 0 0 1247 | 750
secs success failure active | current
46 0 0 1998 | 750
47 0 0 2748 | 750
48 0 498 3000 | 750
49 0 750 3000 | 750
50 0 751 3000 | 750
51 0 749 3001 | 750
52 0 750 3000 | 750
53 0 750 3001 | 750
54 0 751 3000 | 750
55 0 751 3000 | 750
56 0 749 3000 | 750
57 0 750 3000 | 750
58 0 750 3001 | 750
59 0 751 3000 | 750
60 0 750 3000 | 750
32510/42011 successes: 77.4% succeeded.
動作負荷
こういった試験を行うときに、どこがボトルネックになりうるか?という観点が非常に重要で、
試験してみたら思ったより結果が悪い!サーバが悪い!と思ったら、クライアント(ツール)がボトルネックになっていた、なんていうおバカな話も少なくない。
この点、dhcperfは非常に負荷が少ないツールのようで、その辺のノートPC(CPU:2.2Ghz 2コア/4スレッド, RAM4GB)でも、秒間1000くらいなら問題なく走らせられた。
まぁシングルスレッドのアプリケーションのようなのでマルチコアの恩恵はほぼないと思うが・・・