В данной заметке поделюсь полезными скриптами на PowerShell с использованием latte.exe для замеров и диагностики сети между узлами на Windows.
Не все знают, что у Microsoft есть данная утилита работающая по клиент-серверной архитектуре. Официальная страница в полной мере описывает суть утилиты "Latte -- The Windows tool for latency measurement "
What is latte? Latte is a Microsoft tool for measuring network latency. Unlike other latency tools, such as ping, that measure ICMP, latte measures TCP or UDP delivery time. This is an important distinction because real world applications use TCP or UDP.
Задача
У нас стояла задача проверить связность по сети между несколькими узлами и выявить есть ли просадка связности в определенные интервалы времени
О Latte и параметрах
Latte запускается как клиент и сервер и взаимодействует друг с другом по указанным параметрам
This tool measures the average latency between T0 and T3 over a number of iterations of the following sequence of operations:
T0: client sends a message to server
T1: server receives the message
T2: server sends the message back to client
T3: client receives the message back
Так на системе один запускается серверная часть
PS C:\Temp> .\latte.exe -a 10.90.88.3:5012 -i 10100
Protocol TCP
SendMethod Blocking
ReceiveMethod Blocking
SO_SNDBUF Default
SO_RCVBUF Default
MsgSize(byte) 4
Iterations 10100
Latency(usec) 296.92
CPU(%) 61.3
CtxSwitch/sec 12682 (3.77/iteration)
SysCall/sec 31559 (9.37/iteration)
Interrupt/sec 11145 (3.31/iteration)
На клиенте (ключ -с)
PS C:\Temp> .\latte.exe -c -a 10.90.88.3:5012 -i 10100
Protocol TCP
SendMethod Blocking
ReceiveMethod Blocking
SO_SNDBUF Default
SO_RCVBUF Default
MsgSize(byte) 4
Iterations 10100
Latency(usec) 296.93
CPU(%) 10.3
CtxSwitch/sec 11971 (3.55/iteration)
SysCall/sec 25306 (7.51/iteration)
Interrupt/sec 12271 (3.64/iteration)
Помимо задержки (latency) мы видим и иные интересные для статистики параметры систем: CPU, SysCall, смену контекста, прерывания. Что полезно в ходе диагностики.
Но как быть если мы хотим, замерить и проанализировать данные, например за ночь?
Following parameters control the behavior:
-ga : get args from client (server only, must be specified first)
-sa : send args to server (client only, must be specified first)
-so : turns server off (client only, must be specified first)
-c : client (default: server)
-a <IP address/port> : communication address
-bl <IP address/port> : local address (client only, default: wildcard)
-tcp | -udp | -raw : socket type (default: tcp)
-s : use send-then-receive sequence on server (-tcp only)
-r : use receive-then-send sequence on client (-tcp only)
-rio : Use RIO send/receive
-riopoll <count> : Poll <count> times before waiting on RIO CQ
-proc <proc number> : processor number to affinitize to (default: no affinity)
-group <group number>: processor group to affinitize to
-mcast : use multicast (-udp and -raw only)
-snd b | nb | ove | ovc | ovp | sel : send method (default: b - blocking)
-rcv b | nb | ove | ovc | ovp | sel : receive method (default: b - blocking)
-m <message size in bytes> (default: 4)
-i <iterations> (default: 10000)
-t <duration> : test duration (sec) (default: iterations will be used)
if -t and -i are both present -t overrides the -i option
-sb <send buffer size> (default: SO_SNDBUF not set)
-rb <receive buffer size> (default: SO_RCVBUF not set)
-tick : Use GetTickCount() instead of performance counters
-csv : print results in CSV format on a single line without headers
-csvh : print results in CSV format on a single line with headers
-csvtag <tag> : adds the specified tag string to the CSV output
-hist : print histogram of per-iteration latency values (client only)
-hs <start-value> : histogram 1st interval start value (default: 0 usec)
-hl <interval-length> : length of histogram intervals (default: 100 usec)
-hc <interval-count> : number of histogram intervals (default: 10)
-ver : print the version and exit
-it <timeout> : iteration timeout (msec) (default: no timeout)
-dump <filename> : dump all values to <filename>
-hrtt : calculate half round-trip latency
В Latte.exe есть интересные параметры
-csv : print results in CSV format on a single line without headers
-csvh : print results in CSV format on a single line with headers
И на выходе получим csv формат, вида
12/2/2020 7:17:39 AM,TCP,Blocking,Blocking,Default,Default,12,8192,340.56,84.1,17645,32777,14926,12/2/2020 7:17:43 AM
12/2/2020 7:17:53 AM,TCP,Blocking,Blocking,Default,Default,12,8192,227.81,74.2,23407,300929,15822,12/2/2020 7:17:58 AM
Согласитесь, такой набор данных уже куда проще анализировать.
Начало работы
На системах было выполнено добавление в исключение фаервола
netsh advfirewall firewall add rule program=c:\temp\latte.exe name="Latte" protocol=any dir=in action=allow enable=yes profile=ANY
Иначе получите сообщение о блокировке, а не результат
PS C:\Temp> .\latte.exe -a 10.90.88.3:5012 -i 10100
Protocol TCP
SendMethod Blocking
ReceiveMethod Blocking
SO_SNDBUF Default
SO_RCVBUF Default
MsgSize(byte) 4
Iterations 10100
Далее скриптуем серверную
for(;;) {
try {
$startTime = (get-date).toString(); # Написали время старта
$value = (C:\Temp\latte.exe -a 10.77.80.3:5012 -i 8192 -m 12 -csv).toString(); # получили значение работы программы
$endTime = (get-date).toString(); # указали дату завершения
$result = $startTime+','+$value+','+$endTime
echo $result >> C:\Temp\app-db.txt # записали строку в файл
}
catch {
}
Start-sleep 10 # пауза 10 секунд
}
и клиентские части
for(;;) {
try {
$startTime = (get-date).toString(); # Написали время старта
$value = (C:\Temp\latte.exe -c -a 10.77.80.3:5012 -i 8192 -m 12 -csv).toString(); # получили значение работы программы
$endTime = (get-date).toString(); # указали дату завершения
$result = $startTime+','+$value+','+$endTime
echo $result >> C:\Temp\db-app.txt # записали строку в файл
}
catch {
}
Start-sleep 10 # пауза 10 секунд
}
В данном примере они работают на 5013 порту системы с ip адресом 10.77.80.3 и записывают результат в текстовый файл C:\Temp\db-app.txt и C:\Temp\app-db.txt на каждом из узлов.
Внимание, если на одной машине требуется запустить несколько серверных частей, например, в случае когда проверяем связность до более чем одного узла с "серверной" части, меняйте слушающий порт.
То есть общий план действий по анализу теперь прост
- Скачиваем latte.exe на системы котоые хотим померить
- Добавляем для загруженного файла исключение в сетевом экрате (netsh см. выше)
- Берем скрипты выше, запускаем на системах как на сервере, так и на клиенте (определяете сами кто будет сервером и клиентом)
- Чистим полученные csv файлы (будет далее), добавляем заголовки и вперед на мат. анализ и мат. статисктику.
Далее получаем массивы csv данных вида
12/2/2020 7:15:12 AM,TCP,Blocking,Blocking,Default,Default,12,8192,340.69,78.7,12066,33065,10746,12/2/2020 7:15:16 AM
12/2/2020 7:15:27 AM,TCP,Blocking,Blocking,Default,Default,12,8192,326.88,85.7,13007,30289,12120,12/2/2020 7:15:32 AM
12/2/2020 7:15:42 AM,TCP,Blocking,Blocking,Default,Default,12,8192,288.35,78.8,13058,30396,12455,12/2/2020 7:15:48 AM
12/2/2020 7:15:58 AM,TCP,Blocking,Blocking,Default,Default,12,8192,653.58,100.0,10038,36582,6070,12/2/2020 7:16:06 AM
12/2/2020 7:16:18 AM,TCP,Blocking,Blocking,Default,Default,12,8192,236.49,52.8,25422,33336,19531,12/2/2020 7:16:21 AM
12/2/2020 7:16:31 AM,TCP,Blocking,Blocking,Default,Default,12,8192,243.35,40.2,19895,33597,18241,12/2/2020 7:16:33 AM
12/2/2020 7:16:43 AM,TCP,Blocking,Blocking,Default,Default,12,8192,257.57,40.0,15587,31462,12997,12/2/2020 7:16:48 AM
12/2/2020 7:16:58 AM,TCP,Blocking,Blocking,Default,Default,12,8192,223.91,41.1,18545,29415,14905,12/2/2020 7:17:01 AM
12/2/2020 7:17:12 AM,TCP,Blocking,Blocking,Default,Default,12,8192,1640.76,100.0,6708,21119,3567,12/2/2020 7:17:27 AM
12/2/2020 7:17:39 AM,TCP,Blocking,Blocking,Default,Default,12,8192,340.56,84.1,17645,32777,14926,12/2/2020 7:17:43 AM
12/2/2020 7:17:53 AM,TCP,Blocking,Blocking,Default,Default,12,8192,227.81,74.2,23407,300929,15822,12/2/2020 7:17:58 AM
12/2/2020 7:18:08 AM,TCP,Blocking,Blocking,Default,Default,12,8192,247.00,32.2,22213,35335,15120,12/2/2020 7:18:10 AM
12/2/2020 7:18:20 AM,TCP,Blocking,Blocking,Default,Default,12,8192,251.26,95.5,16368,96735,13908,12/2/2020 7:18:25 AM
12/2/2020 7:18:35 AM,TCP,Blocking,Blocking,Default,Default,12,8192,128.39,76.9,22469,44893,26044,12/2/2020 7:18:39 AM
Добавляем заголовок
TimeStart, Protocol,SendMethod,ReceiveMethod,SO_SNDBUF,SO_RCVBUF,MsgSize(byte),Iterations,Latency(usec),CPU(%),CtxSwitch/sec,SysCall/sec,Interrupt/sec
TCP,Blocking,Blocking,Default,Default,12, TimeEnd
и убираем где ошибки строчки регулярными выражениями.
Ну а далее - всё становиться удобно для анализа.
Но и один запуск бывает достаточным для выявления факта наличия проблем.
Удачи!