Я пытаюсь взять список IP-адресов и разрешить их DNS-имя с помощью Powershell. Если хост не может решить, я пытаюсь записать его в файл ошибки. В настоящее время сценарий работает невероятно быстро (до 10 мс) на IP-адресах, способных разрешать имя хоста, но для тех, которые не разрешают сценарий, требуется длительный период времени (примерно 4500 мс на IP). Я попробовал синхронизацию только разрешения DNS на неразрешающих IP-адресах, и я получаю примерно 65 мс, когда они терпят неудачу, поэтому я не уверен, что добавляет это дополнительное время перетаскивания более 4000 мс к разрешению. Это становится очень интенсивным процессом синхронизации при обработке более 1000 IP-адресов. В приведенном ниже сценарии содержатся инструкции по измерениям, которые я использовал для поиска неисправностей.DNS Resolution Incredibly Slow
$ips = get-content ".\source_ip.txt"
$outFile = ".\resolvedTest.txt"
$errorFile = ".\resolveErrorTest.txt"
$commandTimes = @()
foreach ($ip in $ips){
$measure = Measure-Command{
try {[string] $hostname = [System.Net.Dns]::GetHostByAddress($ip).HostName}
catch [system.exception]{$hostname = $ip}
$hostname = $hostname.Replace("@{HostName=","")
$hostname = $hostname.Replace("}","")
if ($hostname -eq $ip){
Add-Content $errorFile "$hostname, Error"
} else {
Add-Content $outFile "$ip, $hostname"
}
}
Write-Host $measure.TotalMilliseconds
$commandTimes += ,$measure.TotalMilliseconds
}
'[System.Net.DNS] :: GetHostByAddress ($ ip) .HostName' должен быть строкой. Кастинг [string] $ hostname не нужен. Две строки, использующие '.Replace()', не нужны. Удаление их поможет со скоростью, но, скорее всего, это не проблема. Это обратный DNS, поэтому нет встроенных командлетов, которые, как я знаю, будут делать это и, надеюсь, включать таймаут. Кроме того, вы можете удалить структуру if и переместить часть ошибки в блок catch вместо части, которая устанавливает $ hostname и перемещает выходную часть. вы получите «try {}; catch {}; Add-content ....' – Xalorous