はじめに
Windows Server 2016でDHCPサーバを運用していますが、各スコープで使用されなくなった予約IPアドレスが大量に残っています。このままではリソースの無駄遣いなので棚卸しを実施することにしました。
一定期間、IPアドレスの使用履歴がないものを洗い出して削除します。
PowerShellを使って大量のデータを一気に削除する予定ですが、数千から数万件のデータを一度に削除してパフォーマンスやサービスに影響がないのか、また時間はどれくらいかかるのかが気になりました。
そこで簡単に検証環境を構築しテストしてみました。
検証環境の準備
サーバのスペック
CPU:Intel(R) Core(TM)i7-6700 CPU @3.40GHz(2Core)
メモリ:2GB
検証環境なのでロースペックです。
スコープの新規作成
スコープを1,000個以上作成します。今回は2,550個作成しています。
#スコープを新規作成
for ( $i = 1; $i -le 10; $i++ ){
for ( $j = 1; $j -le 255; $j++ ){
$var = "Add-DhcpServerv4Scope -Name TestScope -StartRange 10." + $i + "." + $j + ".1 -EndRange 10." + $i + "." + $j + ".254 -SubnetMask 255.255.255.0 -State Active"
Invoke-Expression $var
}
}
予約IPアドレスの登録
1つのスコープに200個ずつ予約IPアドレスを登録します。スコープを2,550個作成したので、510,000個の予約IPアドレスが登録できました。MACアドレスは変数($i,$j,$k)の値を16進数に変換して文字連結させることでユニークな値を生成しています。
#予約IPアドレスの登録
for ( $i = 1; $i -le 10; $i++ ){
for ( $j = 1; $j -le 255; $j++ ){
for ( $k = 1; $k -le 200; $k++ ){
$var = "Add-DhcpServerv4Reservation -ScopeId 10." + $i + "." + $j + ".0 -Name TestPC -IPAddress 10." + $i + "." + $j + "." + $k + " -ClientId aabbcc" + $i.ToString("x2") + $j.ToString("x2") + $k.ToString("x2") + " -Description TestPC"
Invoke-Expression $var
}
}
}
検証結果
Measure-Commandコマンドレットを使用して処理時間を計測します。
Measure-Command {
$num = 0
$max_count = 1000
:Outloop for ( $i = 1; $i -le 10; $i++ ){
for ( $j = 1; $j -le 255; $j++ ){
for ( $k = 1; $k -le 200; $k++ ){
if ($num -ge $max_count){break Outloop}
$var = "Remove-DhcpServerv4Reservation -IPAddress 10." + $i + "." + $j + "." + $k + ""
$num += 1
#$var
Invoke-Expression $var
}
}
}
}
削除した予約IPアドレス | 削除にかかった秒数 |
1,000 | 27秒 |
10,000 | 4分6秒 |
50,000 | 20分38秒 |
100,000 | 38分3秒 |
削除処理実行中にCPUやメモリの使用率を確認したが特に問題は見受けられませんでした。
ロースペックの検証環境だったので処理にそれなりの時間がかかっていますが、この結果を見る限り、パフォーマンスやサービスの稼働には影響はありません。
コメント