доля потерянных пакетов (измеряется при постоянной нагрузке на различных уровнях нагрузки);
возможные причины: коллизии, переполнение буфера в промежуточном устройстве
время ответа (ping, traceroute, netperf);
возможные причины больших задержек: перегрузка сети или хоста, ошибки в сети или NIC,
неудачный маршрут, несоответствие MTU, загрузка одного из промежуточных устройств
посторонними задачами (например, пересчёт OSPF)
задержка устройства определяется как время от поступления последнего бита кадра на вход
устройства до поступления первого бита кадра на выходе устройства;
может меняться в зависимости от размера кадра
загруженность в течении определённого интервала времени
(какую долю времени канал занят передачей данных), Network Utilization
(pathload)
пропускная способность, Network Throughput (остаток ёмкости), максимальная скорость
при которой ещё нет потерь; может отличаться для различных условий (размер пакета, дуплекс)
Методы получения информации о производительности сети:
Утилита ping посылает ICMP пакеты ECHO_REQUEST на указанный хост и использует
полученные (или неполученные) в ответ ICMP пакеты ECHO_RESPONSE для определения доступности
этого хоста и времени реакции. В Linux требует прав CAP_NET_RAWIO (обычно через suid root).
Ключи:
-a (звуковое сопровождение каждого полученного ответа)
-A (интервал между посылками адаптируется к времени реакции, так чтобы в пути находилось
не более 1 запроса; для обычного пользователя интервал не м.б. менее 200 мс)
-b (разрешить посылать запрос на широковещательный адрес)
-c число-запросов (по умолчанию, пакеты посылаются пока не прервать выполнение программы)
-f (после посылки каждого пакета ECHO_REQUEST выводится точка, после получения ECHO_RESPONSE
она стирается; если интервал не указан, то он устанавливается в 0 при наличии прав root
и пакеты посылаются каждые 10мс или сразу по получении ответа)
-i интервал (в секундах, можно указывать плавающее число; по умолчанию - 1 секунда;
только root может устанавливать интервал менее 200мс)
-I исходящий-адрес (или имя интерфейса)
-l число (количество пакетов, которые могут быть одновременно "в пути")
-L (не посылать пакета на групповой адрес себе)
-n (не преобразовывать IP адреса в имена)
-p шаблон (пакет заполняется указанным шаблоном, до 16 байт в 16-ричной записи;
по умолчанию в начале пакета записывается временная отметка)
-Q флаг (TOS, QoS или DS)
-q (минимум вывода)
-R (запоминает до 9 адресов промежуточных узлов в обоих направлениях
и выводит их при получении ECHO_RESPONSE)
-r (не использовать таблицу маршрутизации, послать пакет через указанный в -I интерфейс)
-s число (по умолчанию - 56; число байт данных в пакете; заголовок ICMP - 8 байт;
заголовок IP - от 20 байт)
-t TTL
-T tsonly (включить в пакет отметку времени; при получении ECHO_RESPONSE выводятся
смещения времени в милисекундах на 9 промежуточных в обоих направлениях узлах)
-T tsandaddr (включить в пакет отметку времени и адрес)
-T tsprespec хост... (включить в пакет отметку времени и адреса)
-M стратегия-выбора-MTU (do - запретить фрагментацию; want - автоматически определять
MTU, при локальных посылках разрешить фрагментирование пакетов;
dont - не устанавливать флаг DF)
-U (выводить время ответа без учёта вспомогательных затрат на DNS и т.д.)
-v (выводить больше информации, не заметил излишеств)
-w секунд (закончить работу после истечения указанного интервала)
-W секунд (время ожидания первого ответа; затем интервал ожидания устанавливается в 2*RTT)
Утилита traceroute позволяет выяснить маршрут следования пакетов к хосту назначения.
Для этого она посылает серию UDP пакетов с TTL от 1 до 30 и получает ответы от промежуточных
маршрутизаторов об истечении TTL (ICMP TIME_EXCEEDED).
Для обеспечения работоспособности необходимо открыть сетевые экраны
на пути следования для пакетов UDP на нужные порты.
Вторым параметром можно указать размер пакета (40; путь может зависеть от размера бакета;
помогает выяснить MTU в сочетании с ключом -F). Ключи:
-4 (использовать IPv4)
-6 (использовать IPv6)
-I (использовать ICMP пакеты ECHO_REQUEST вместо UDP)
-T (использовать TCP SYN вместо UDP)
-U (UDP; по умолчанию; непривилегированному пользователю доступен только этот метод)
-F (запретить фрагментацию пакетов)
-f начальный-TTL (1)
-g первый-шлюз (установить первый шлюз в маршрутизации "от источника" - source routing;
скорее всего такой пакет будет отфильтрован)
-i имя-интерфейса
-m максимальный-TTL (30)
-N число-параллельных-запросов (16; рекомендуется установить в 1)
-n (не преобразовывать IP адреса в имена)
-p номер-порта-назначения (для UDP при каждом запросе номер порта увеличивается на 1;
для TCP номер порта не изменяется; для ICMP устанавливается начальный последовательный номер,
который увеличивается на 1)
-q число (3; число проб на каждый промежуточный узел)
-r (не использовать таблицу маршрутизации, послать пакет через указанный в -i интерфейс)
-s исходящий-адрес
-t флаг (TOS, QoS или DS)
-w секунд (5; время ожидания ответа)
-z интервал-между-посылками (если меньше 10, то в секундах, если больше - в милисекундах)
-A (заодно определяет автономную систему)
Загадочные значки в ответах:
!H - хост недоступен
!N - сеть недоступна
!P - протокол (в смысле IP протокол -TCP, UDP) недоступен
!S - маршрутизация от источника запрещена
!F - требуется фрагментация
!X - административный запрет
!V - host precedence violation
!C - precedence cutoff
traceroute6 - эквивалент traceroute -6.
tracert - эквивалент traceroute -I.
tcptraceroute - эквивалент traceroute -T -p 80.
tracepath позволяет выяснить маршрут следования пакетов к хосту назначения
и MTU, используя UDP-метод. Вторым параметром можно указать порт назначения.
netperf - "классический" (документация от HP к версии 2.0 от 1995 года!)
инструмент измерения пропускной способности сети и времени задержки ответа
(TCP, UDP, DLPI - уровень канала, UNIX domain sockets, SCTP; IPv4 и IPv6).
Доступна для различных вариантов Unix, Linux, MS Windows, OpenVMS и др..
Состоит из 2 частей: netserver, который должен быть предварительно запущен на удалённом
хосте, и netperf, который запускается в момент измерения.
При запуске теста между netperf и netserver устанавливается управляющее соединение
(по умолчанию - 12865/tcp), тестовые данные пересылаются по другому каналу
(первый попавшийся "пользовательский" порт).
Брал готовые пакеты версии 2.4.2-1 с репозитария
dag.
Исходные тексты можно получить здесь.
Утилита netperf имеет 2 типа параметров: глобальные и специфические для типа теста.
Глобальные параметры указываются первыми и отделяются от специфических параметров
двумя знаками "минус" ("--"). Некоторые параметры (например, размер) задаются парами.
Чтобы установить одинаковое значение элементам пары необходимо указать одно значение,
чтобы установить разные - значения через запятую, только первому элементу - "значение,",
только второму - ",значение".
Глобальные параметры (основные):
-h (выдаёт перечень параметров)
-c [число] (вычисление использования ЦП, указание "числа" из предыдущего прогона
может съэкономить 40 секунд на калибровку)
-C [число] (вычисление использования ЦП на удалённом хосте)
-F имя-файла (буфер передачи предварительно заполняется из этого файла,
полезно для изучения эффекта сжатия данных)
-H имя-удалённого-хоста
-L имя-этого-хоста
-I вероятность,интервал-доверительности (в процентах)
-i макс-число-итераций,мин-число-итераций (10,3; для вычисления интервала доверительности)
-l число (положительное число задаёт продолжительность одной итерации теста в секундах;
отрицательное число задаёт количество байт для тестов типа _STREAM
и транзакций для тестов типа _RR)
-t тип-теста (в пакете тесты SCTP_*, DLCO_* и DLCL_* отсутствуют)
TCP_STREAM (тест пропускной способности в режиме TCP), специфические параметры
(см. также общие специфические параметры):
-C (TCP_CORK)
-D (TCP_NODELAY)
TCP_MAERTS (тест пропускной способности TCP в обратную сторону,
глобальный ключ -F не действует)
TCP_SENDFILE (тест пропускной способности TCP с использованием sendfile(),
требуется глобальный ключ -F)
UDP_STREAM (тест пропускной способности в режиме UDP; передатчик "лупит", не ожидая ответа,
и достигает фантастических величин пропускной способности; реальную скорость надо
смотреть во второй строке, относящейся к приёмнику)
XTI_TCP_STREAM, XTI_TCP_RR, XTI_TCP_CRR, XTI_TCP_CC, XTI_UDP_STREAM, XTI_UDP_RR
(аналог TCP_STREAM и прочих с использованием интерфейса XTI)
SCTP_STREAM (тест пропускной способности в режиме STCP)
DLCO_STREAM (тест пропускной способности в режиме DLPI Connection Oriented)
DLCL_STREAM (тест пропускной способности в режиме DLPI ConnectionLess
STREAM_STREAM (тест пропускной способности для Unix Domain сокетов)
DG_STREAM (тест пропускной способности для Unix Domain Datagram сокетов)
TCP_RR (тестирование времени ответа TCP; выдаёт количество транзакций в секунду)
TCP_CC (тестирование скорости создания и удаления TCP соединений; специфический ключ -p
позволяет задавать допустимый интервал исходящих портов)
TCP_CRR (тестирование скорости создания TCP соединения, обмена одной парой сообщений
и удаления соединения)
UDP_RR (тестирование времени ответа UDP; выдаёт количество транзакций в секунду)
SCTP_RR
DLCO_RR
DLCL_RR
LOC_CPU (калибровка скорости этого ЦП)
REM_CPU (калибровка скорости ЦП на удалённом хосте)
netserver может быть запущен как самостоятельный процесс
(параметр -p задаёт номер порта управляющего соединения) или под inetd (xinetd).
Параметры для inetd.conf: netserver stream tcp nowait nobody.
Настройка для xinetd:
service netserver
{
socket_type = stream
wait = no
user = nobody
server = адрес-программы
}
Параметры netserver:
-h (выдаёт перечень параметров)
-d (увеличить уровень отладки)
-L адрес-прослушивания,семейство
-p номер-порта
-4 (использовать IPv4)
-6 (использовать IPv6)
-v
Использование ЦП выводится в процентах от полной загрузки
и в микросекундах, требуемых для передачи килобайта или транзакции.
В Linux версии используется механизм /proc/stat (S).
Можно запускать с правами обычного пользователя.
Методика измерения пропускной способности
на приёмном хосте запустить netserver
проделать дырки в сетевом экране на удалённом сервере и по дороге к нему
(12865/tcp, 12866/tcp, 12866/udp)
запустить на передающем хосте тест TCP с достаточной точностью
netperf -H адрес-приёмного-хоста -t TCP_STREAM -v 2 -c -C -l 50 -I 99,5 -- -P ,12866
если данные в канале сжимаются, то поэкспериментировать с различными тестовыми шаблонами
(-F имя-файла)
повторить тестирование в обратную сторону
повторить тестирование в обе стороны одновремено
Через 1 коммутатор:
TCP_STREAM
Recv Send Send Utilization Service Demand
Socket Socket Message Elapsed Send Recv Send Recv
Size Size Size Time Throughput local remote local remote
bytes bytes bytes secs. 10^6bits/s % S % S us/KB us/KB
87380 16384 16384 50.01 938.70 16.41 42.41 11.457 29.609
Alignment Offset Bytes Bytes Sends Bytes Recvs
Local Remote Local Remote Xfered Per Per
Send Recv Send Recv Send (avg) Recv (avg)
8 8 0 0 5.868e+09 16384.00 358172 8530.56 687914
Maximum
Segment
Size (bytes)
1448
TCP_RR
Local /Remote
Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
Send Recv Size Size Time Rate local remote local remote
bytes bytes bytes bytes secs. per sec % S % S us/Tr us/Tr
16384 87380 1 1 50.00 11154.17 19.80 43.03 142.024 308.618
16384 87380
UDP_RR
Local /Remote
Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
Send Recv Size Size Time Rate local remote local remote
bytes bytes bytes bytes secs. per sec % S % S us/Tr us/Tr
126976 126976 1 1 50.01 11573.89 18.47 43.07 127.660 297.708
135168 135168
Через 5 коммутаторов:
TCP_STREAM
Recv Send Send Utilization Service Demand
Socket Socket Message Elapsed Send Recv Send Recv
Size Size Size Time Throughput local remote local remote
bytes bytes bytes secs. 10^6bits/s % S % S us/KB us/KB
87380 16384 16384 50.01 919.84 8.76 42.04 3.120 29.955
Alignment Offset Bytes Bytes Sends Bytes Recvs
Local Remote Local Remote Xfered Per Per
Send Recv Send Recv Send (avg) Recv (avg)
8 8 0 0 5.75e+09 16384.02 350982 8193.70 701819
Maximum
Segment
Size (bytes)
1448
TCP_RR
Local /Remote
Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
Send Recv Size Size Time Rate local remote local remote
bytes bytes bytes bytes secs. per sec % S % S us/Tr us/Tr
16384 87380 1 1 50.01 8061.24 3.64 43.30 18.074 429.677
16384 87380
UDP_RR
Local /Remote
Socket Size Request Resp. Elapsed Trans. CPU CPU S.dem S.dem
Send Recv Size Size Time Rate local remote local remote
bytes bytes bytes bytes secs. per sec % S % S us/Tr us/Tr
135168 135168 1 1 50.01 8427.60 5.14 42.71 24.388 405.477
135168 135168
Iperf позволяет измерить
производительность сети (TCP и UDP) и поэкспериментировать с настройками приложения и хоста.
Имеется версия под Windows (устанавливается как сервис: -s -D).
Так же как и при использовании netperf предварительно на удалённом
конце запускается iperf в режиме сервера.
В момент измерения с нашей стороны запускается iperf в режиме клиента.
Если сервер запускается в интерактивном режиме, то он также выдаёт результаты измерения.
При запуске теста между клиентом и сервером устанавливается управляющее соединение
(по умолчанию - 5001/tcp), тестовые данные пересылаются по
(первый попавшийся "пользовательский" порт).
Имеется также графическая "морда" Jperf и библиотека для написания своих тестов.
Позволяет определить:
пропускную способность сети в режиме TCP
величину окна TCP по умолчанию и оптимальное значение
пропускную способность сети в режиме UDP при заданной производительности
потери UDP пакетов
отклонения в задержках UDP пакетов (синхронизация времени не требуется)
наличие обработки ToS
обработка групповых рассылок (клиент посылает пакеты по групповому адресу,
несколько серверов могут получать пакеты по этому адресу; только UDP)
Ключи (при указании размеров можно использовать суффиксы K и M):
-B IP-адрес (задаётся на стороне сервера, привязаться к указанному адресу,
обычно используется для тестирования групповых рассылок)
-b ширина-канала (для UDP тестирования, задаётся на клиентской стороне; по умолчанию - 1Mbps)
-c адрес-сервера (режим клиента)
-D (сервер в фоновом режиме, стандартный вывод можно переназначить в файл)
-d (тест в обе стороны одновременно; см. -L)
-F имя-файла (использовать указанный файл для передачи)
-f формат-вывода (b - bps, B - Byte/sec и т.д.)
-I (использовать стандартный ввод для передачи)
-i секунд (интервал между промежуточными результатами, в т.ч. на стороне сервера)
-L номер-порта (входной порт для двухсторонних тестов -d и -r)
-l байт (размер пакетов; по умоляанию используется 8K для TCP и 1470 для UDP)
-M размер-MSS
-m (вывести значение MSS и MTU)
-N (TCP_NODELAY)
-n число-пакетов
-P число-потоков
-p номер-порта (сервер слушает этот порт, клиент подсоединяется к указанному порту)
-r (сначала в одну сторону, затем обратно; см. -L)
Пакет pathrate (Constantine Dovrolis) позволяет определять максимальную пропускную
способность (bandwidth) и также состоит из 2 утилит:
pathrate_snd, которая запускается на удалённом сервере, слушает команды на 48699/tcp,
получив команду тестирования обеспечивает UDP поток на приёмник 48698/udp;
имеется ключ "-v"
pathrate_rcv запускается на другом конце, передаёт команду тестирования на передатчик;
имеются ключи "-s адрес-передатчика" и "-v"
Особенностью пакета является способность определять общую пропускную способность
канала невзирая на его текущую загрузку. Результат является статистическим и ненадёжным
(основывается на задержках пакетов в цепочке пакетов). Нельзя запускать на нагруженном
компьютере.
На этапе инициализации pathrate определяет наличие балансировщиков трафика
(измеряется пропускная способность одного канала) и ограничителей
трафика (измеряется пиковая скорость), вычислияется размер буферов (определяется
максимальной длиной цепочки до потери нескольких пакетов подряд).
Если текущий трафик в канале невелик и постоянен, то пропускную способность канала
можно определить непосредственно. Полный цикл может занять полчаса.
При этом определяется зависимость задержек то размера пакетов и числа пакетов в цепочке.
Имеется адаптация к "свёртыванию прерываний" на гигабитных интерфейсах.
Можно запускать с правами обычного пользователя. Измерять надо в обе стороны.
Установка pathrate (CentOS4.5 и CentOS5 с предупреждениями,
программу собирать в 32-битном режиме):
изменить порты, чтобы не проделывать дополнительных дырок: pathrate.h (12865/tcp, 12866/udp)
./configure
make
скопировать pathrate_rcv и pathrate_snd в /usr/local/sbin
У меня на составном несимметричном канале версия 2.4.1 не смогла выдать результат,
(только если передатчик ставить на медленный конец, и то не всегда).
На канале с VPN (PPP over SSH) версия 2.4.1 зависает.
Версия 2.3.0 нормально работает на составном канале, но для VPN канала показывает
какую-то чушь. Между версиями 2.3 и 2.4 изменился протокол подтверждений,
новый протокол, видимо, недоработан.
Пакет pathload (1.3.2) позволяет определить доступную пропускную
способность сети, не имея
доступа к счётчикам активного сетевого оборудования. Используется метод, аналогичный методу
в pathrate. Также состоит из двух программ (только порты 55001/udp и 55002/tcp).
Ставится таким же способом (но есть адаптация к 64-бит).
На VPN канале (PPP over SSH) также не работает (слишком частое переключение контекста
на приёмнике независимо от направления передачи). На составном шейпированном канале
всегда показывает его полную ёмкость.
pathoad_snd имеет ключ "-i" (не завершать работу после обработки первой заявки).
pathload_rcv имеет дополнительные ключи:
Утилита abget того же автора позволяет оценить доступную
(свободную) пропускную
способность сети в обоих направлениях, не имея доступа к удалённому серверу
Требуется HTTP сервер на удалённом сервере и привилегии суперпользователя.
Для определения доступной пропускной способности сети от сервера к нам
требуется указать URL достаточно большого файла на сервере.
abget эмулирует TCP протокол, чтобы спровоцировать сервер посылать данные
в желаемом темпе (посылаются фальшивые ACK в нужном количестве).
Осторожно с журналом сетевого экрана!
dbs
(Distributed Benchmark System) позволяет одновременно запустить несколько потоков (dbsd),
нагружающих сеть, и управлять ими из одного места (dbsc, tcp/10710).
Требует синхронизации времени между узлами и gnuplot для построения графиков (dbs_view,
пропускная способность каждого потока с течением времени или время задержки).
Не развивается с 1998 года (удачи в компиляции и сборке ;).
dbsc управляется командным файлом, в котором для каждого теста задаются
параметры передатчика (хост, порт, размер буфера передачи, размер буфера приёма, шаблон трафика),
параметры приёмника(хост, порт, размер буфера передачи, размер буфера приёма, шаблон обработки трафика)
и параметры тестирования (файл с результатами, TCP или UDP, учитывать ли время соединения,
кто передаёт, время начала, продолжительность, число повторений).