Поиск проблем в Windows сети


Давно озадачился отлавливанием сетевых проблем, которые возникают при наличии разветвленной топологии сети. Например, столкнулись с такой ситуацией: скорость копирования файла с клиента на шару нормальная (от 50 до 90 Мбит/с при 100 Мбит/с –ном интерфейсе на клиенте), а скорость чтения файла с шары очень медленная (4-10 Мбит/с). Пользователь практически не испытывает проблем пока не начнет запускать приложения с сильной нагрузкой на сеть. Например, может медленно запускаться большой exe-ник или мультимедиа приложение квакать. Но внешне всё выглядит прекрасно: никаких ошибок на коммутаторах и в системе Windows. Наша задача найти рабочие места и/или сегменты сети с такой проблемой.   При разветвленной топологии сети существует масса коммутаторов, куда подключены пользователи. Делать вручную проверки – это очень высокие трудозатраты. Требуется как-то это автоматизировать. Для начала надо определиться со средствами. Первое что было протестировано это давно известная утилита iperf. Утилита работает по принципу клиент-сервер. Использует для передачи потока данных сокет низкого уровня и позволяет задавать достаточно много параметров. Неудобство утилиты в нашем случае в том, что нужно подобрать параметры, которые позволят обнаружить конкретную проблему. При этом совершенно непонятно какой набор параметров должен быть для моделирования копирования файла системой Windows по сети. Кроме этого утилиту надо распространить по рабочим местам и разрешить в фаэрволе, что тоже неудобно. Вывод – утилита совершенно не подходит для решения нашей задачи. Поэтому пришлось обратиться к Powershell. Поиск навёл на скрипт Test-NetworkSpeed. Идея его простая. Кроме того для копирования используются те же стандартные средства, у которых и нужно выявлять проблему – копирование по сети посредством SMB протокола. Powershell на рабочих местах уже есть. Фаэрвол также уже настроен. Значит мы на верном пути. Исходный скрипт оказался непригодным для нашей задачи. Поэтому его пришлось хорошо доработать. Во-первых, сделать совместимым с Powershell 2.0, т.к. именно он разлит на рабочие места Windows 7 (и XP) через WSUS (более новые версии через WSUS не приезжают). Во-вторых, вместо готового файла-заготовки используется генерация временного файла нужного размера, который удаляется после выполнения теста. В-третьих, сразу выставлены параметры по умолчанию, которые нам нужны. Осталось выполнить доставку скрипта на рабочие места и сбор результатов теста. В моём случае наличие SCCM всё сильно упростило: Compliance Management как раз решает эту задачу. Ниже сам скрипт:


function Test-NetworkSpeed {
<#
.SYNOPSIS
Determine network speed in Mbps
.DESCRIPTION
This script will create a dummy file, default size of 50mb, and copy to
and from a target server.  The Mbps will be determined from the time it
takes to perform this operation.

A folder will be created in the designated Path location called SpeedTest.
The dummy file will be copied to and from that location to determine the
network speed.
.PARAMETER Path
Each Path specified must be in UNC format, i.e. \\server\share
.PARAMETER Size
Designate the size of the dummy file in MB
.INPUTS
<string> UNC of path
.OUTPUTS
PSCustomObject
Server          Name of Server
TimeStamp       Time when script was run
WriteTime       TimeSpan object of how long the write test took
WriteMbps       Mbps of the write test
ReadTime        TimeSpan object of how long the read test took
ReadMbps        Mbps of the read test
.EXAMPLE
.\Test-NetworkSpeed.ps1 -Path "\\server1\share","\\server2\share2"
.EXAMPLE
.\Test-NetworkSpeed.ps1 -Path (Get-Content c:\shares.txt) -Size 25 -Verbose

Pulls paths from c:\Shares.txt (in UNC format), creates a 25mb dummy file for
testing and produces Verbose output.
.EXAMPLE
Get-Content c:\shares.txt | .\Test-NetworkSpeed.ps1 -Size 100

Also pulls paths from c:\Shares.txt, but takes input from the pipeline.  Dummy
file size will be 100mb.
.NOTES
Author:             Martin Pugh
Twitter:            @thesurlyadm1n
Spiceworks:         Martin9700
Blog:               www.thesurlyadmin.com

Changelog:
1.0             Initial Release
2.0             New Release by Ilya Sazonov
.LINK
http://community.spiceworks.com/scripts/show/2502-network-bandwidth-test-test-networkspeed-ps1
#>
#requires -Version 2.0

[CmdletBinding()]
Param (
[Parameter(ValueFromPipeline = $true)]
[String[]]$Path = "\\fs.domain.ru\test\",
[ValidateRange(1,1000)]
[int]$Size = 50
)

Begin {
Write-Verbose "$(Get-Date): Test-NetworkSpeed Script begins"
Write-Verbose "$(Get-Date): Create dummy file, Size: $($Size)MB"
$DummySize = $Size * 1048576

$testfilename = [System.IO.Path]::GetTempFileName()
$a1=[System.IO.File]::Open($testfilename, "Open")
$a1.SetLength($DummySize)
$a1.Close()

Try {
$TotalSize = (Get-ChildItem $testfilename -ErrorAction Stop).Length
}
Catch {
Write-Warning "Unable to locate dummy file"
Write-Warning "Last error: $($Error[0])"
Exit
}
Write-Verbose "$(Get-Date): Source for dummy file: $testfilename"
$RunTime = Get-Date
}

Process {
ForEach ($ServerPath in $Path)
{   $Server = $ServerPath.Split("\")[2]
$Target = "$ServerPath\SpeedTest"
Write-Verbose "$(Get-Date): Checking speed for $Server..."
Write-Verbose "$(Get-Date): Destination: $Target"

If (-not (Test-Path $Target))
{   Try {
New-Item -Path $Target -ItemType Directory -ErrorAction Stop | Out-Null
}
Catch {
Write-Warning "Problem creating $Target folder because: $($Error[0])"
[PSCustomObject]@{
Server = $Server
TimeStamp = $RunTime
Status = "$($Error[0])"
WriteTime = New-TimeSpan -Days 0
WriteMbps = 0
ReadTime = New-TimeSpan -Days 0
ReadMbps = 0
}
Continue
}
}

Try {
Write-Verbose "$(Get-Date): Write Test..."
$WriteTest = Measure-Command {
$targetfile = Copy-Item $testfilename $Target -PassThru -ErrorAction Stop
}

Remove-Item $testfilename -ErrorAction SilentlyContinue

Write-Verbose "$(Get-Date): Read Test..."
$ReadTest = Measure-Command {
$testfilename = Copy-Item $targetfile $testfilename -PassThru -ErrorAction Stop
}

Remove-Item $testfilename -ErrorAction SilentlyContinue
Remove-Item $targetfile -ErrorAction SilentlyContinue

$Status = "OK"
$WriteMbps = [Math]::Round((($TotalSize * 8) / $WriteTest.TotalSeconds) / 1048576,2)
$ReadMbps = [Math]::Round((($TotalSize * 8) / $ReadTest.TotalSeconds) / 1048576,2)
}
Catch {
Write-Warning "Problem during speed test: $($Error[0])"
$Status = "$($Error[0])"
$WriteMbps = $ReadMbps = 0
$WriteTest = $ReadTest = New-TimeSpan -Days 0
}

[PSCustomObject]@{
Server = $Server
TimeStamp = $RunTime
Status = "OK"
WriteTime = $WriteTest
WriteMbps = $WriteMbps
ReadTime = $ReadTest
ReadMbps = $ReadMbps
}
Remove-Item $testfilename -ErrorAction SilentlyContinue
}
}

End {
Get-ChildItem $testfilename -ErrorAction SilentlyContinue | Remove-Item -ErrorAction SilentlyContinue
Write-Verbose "$(Get-Date): Test-NetworkSpeed completed!"
}

} # Test-NetworkSpeed

Реклама

комментариев 15

  1. подскажите как complince setting решает это проблему,это же соответствие параметрам. собственно вопрос каким параметрам и откуда они берутся? Генерируются после выполнения скрипта,а что именно генерируется. столкнулись с проблемой работы с файлами расположенными в сети на файловом сервере. вот хочу применить ваш скрипт. Заранее спасибо за ответ.

    • Compliance settings никак не решают проблему: в данном случае просто выполняется диагностика, и вы получаете списки компьютеров: 1. для которых скорость копирования по сети в норме, 2. для которых копирование ниже нормы. Далее нужно анализировать ситуацию и предпринимать конкретные шаги по исправлению проблемы: исправить или заменить роутер, заменить драйвер сетевой карты и т.п.

      • Странно при запуске скрипта ничего не происходит,даже ошибок не выдает.
        Я поменял строку «\\fs.domain.ru\test\» на свою «\\pc\test\»
        пробовал запускать через Ise и через ps1 с параметром -path «\\userpc\test» тоже ничего. вы не могли бы немного пояснить какие данные должен получить скрипт что бы он заработал?

      • Вы можете запустить вскрипт с параметром Verbose, чтобы вывести дополнительные сообщения.
        Вы можете выполнить скрипт в ISE пошагово и точно установить проблему.
        На шару должны быть полные права у учетной записи из под которой выполняется скрипт.

  2. Ничего не выходит, ни Verbose ни Debug не позволяют понять где кроется проблема и почему скрипт не выводит ни ошибок ни информации,вообще ничего,кстати скрипт основы который вы переделали работает без проблем и даже строит графики. Только проблема в том что у нас такая же проблема с работой по сетке с открытием файлов autocad.

  3. Посветив целый день изучению вашего скрипта,я узнал очень много интересного,за что вам очень благодарен.

  4. Если я правильно понял вы использовали compliance Item,
    вы не могли бы поделиться информацией по его настройкам?

    • Да, использован compliance Item в варианте Script — это выбрано в визарде. Никаких особых настроек нет.

      • вопрос в том какой Data type использовать для powershell есть несколько вариантов
        string
        data and time
        integer
        floating point
        version
        boolean.
        Я выбрал string
        Затем выбираем Compliance rule там у нас есть rule type: я выбрал value,хотя можно еще выбрать existential, далее выбрать чему должно соответсвовать это значение,я поставил equals -> OK
        Но результат один,не соответствует
        Какой все таки Data type использовать и чему в итоге он должен быть равен. Заранее извиняюсь за беспокойство.

      • 1. Выбираете тип Compliance, который Script.
        2. Открываете окно скрипта и выбираете Powershell
        3. Вставляете скрипт
        4. После скрипта добавляете его вызов:

        $a = Test-NetworkSpeed \\server\share

        5. Следующей командой проверяете то, что вам нужно. Например, скорость записи больше 50 Мб:
        $a.WriteMbps -gt 50.0

        6. Закрываете окно скрипта. В этом примере проверка была логическая, следовательно тип вы должны выбрать логический.

  5. Cпасибо огромное. Но есть проблемка,при запуске скрипта локально,через ISE все отрабатывает без проблем как через baseline так и через ISE ,а вот с нужной шарой проблема, baseline выдает ошибку.
    DcmWmiProvider.log прилагаю http://1drv.ms/1y8TKGE
    Права на шару даны через NTFS.
    Странно что если через ISE скрипт создает папку и проблем нету а вот через baseline не хочет.

  6. […] труд, дал мне толчок на изучения PowerShell оригинал статьи здесь. Там я вступил с ним в переписку. Не все получилось […]

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: