DHCP 負荷試験(dhcperf)

## まえがき
某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は自動測定モードになる。<br>
なので、簡単に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.
```

### 動作負荷
こういった試験を行うときに、どこがボトルネックになりうるか？という観点が非常に重要で、<br>
試験してみたら思ったより結果が悪い！サーバが悪い！と思ったら、クライアント(ツール)がボトルネックになっていた、なんていうおバカな話も少なくない。

この点、dhcperfは非常に負荷が少ないツールのようで、その辺のノートPC(CPU:2.2Ghz 2コア/4スレッド, RAM4GB)でも、秒間1000くらいなら問題なく走らせられた。

まぁシングルスレッドのアプリケーションのようなのでマルチコアの恩恵はほぼないと思うが・・・

## 参考
* ftp://ftp.nominum.com/pub/nominum/dhcperf/
* http://om.hatenablog.com/entry/2015/01/23/154936