Перейти к содержанию

Как получаются измерения

Перевод страницы How the measurements are taken. При расхождении верен английский текст.

Каждая страница измерений говорит, как получены её числа и чего они не означают. Эта страница собирает то, что у них общее: стенд, где снимается цифра, инструменты, расчёт за каждым видом цифр и правила, которые соблюдает каждая страница, - каждое с причиной, почему так делается. Цифра без метода ничего не доказывает, а те, что выглядят лучше всего, обычно измеряют не то, что заявляют.

Стенд

Два XGS 3300 и XGS 136, маршрутизируемые друг к другу, и ПК на среднем на 10 Гбит/с - как на странице стенда (на английском), где фотографируется окно каждого прогона:

соединение откуда куда среда
ПК сетевая карта 10GBASE-T ПК F1 второго XGS 3300 медь, 10 Гбит/с
оптика порт модуля A1 второго XGS 3300 F1 первого XGS 3300 оптика, 10 Гбит/с
гигабитное соединение Port8 второго XGS 3300 Port8 XGS 136 медь, 1 Гбит/с
что почему
Аппаратный узел на обоих концах каждого туннеля. До 17.10.2026 дальним концом измеряемого туннеля был межсетевой экран, выполнявший ESP программно, так что цифра могла быть его, а не устройства.
Каждое соединение - в своей /30, вне моста LAN, с разрешающим правилом и статическим маршрутом. Трафик маршрутизируется через устройство, а не коммутируется мимо него, и больше ничто в сети не делит этот путь.
Никогда не публичный тестовый сервер в качестве дальнего конца. Это чужие серверы, и они отвергают то, что похоже на флуд; отвергнутая строка однажды оставила в таблице три «загрузки», которых никогда не было. Всё параллельное или повторяющееся идёт на дальний конец на стенде.

Где снимается цифра

На приёмнике, на дальнем конце, - никогда по собственным счётчикам устройства. Соединение в аппаратуре идёт от порта к порту внутри сопроцессора и никогда не доходит до хоста: состояние pf, счётчики интерфейсов и все графики на их основе перестают расти. Индикатор, показывающий ноль, когда всё работает, - не индикатор: однажды прогон остановило правило, принявшее такой ноль за крах, которого не было.

Цифра приёмника, а не отправителя. iperf3 выводит обе: отправитель считает то, что записал в сокет, приёмник - то, что пришло. Пропускная способность - только второе.

Строка читается только тогда, когда известно, что прогон состоялся, - полученные байты, а не просто сдвинувшиеся счётчики.

Инструменты

инструмент что он здесь измеряет почему именно он
iperf3 - 3.20 под WSL на ПК для отправки, iperf3 для Windows для приёма, 3.22 (пакет OPNsense) как сервер на хосте устройства пропускная способность, один поток TCP или четыре, десять секунд на прогон один и тот же инструмент на обоих концах каждого прогона, с указанием версии. Два клиента на ПК, потому что зеркальная сеть WSL выпускает кадр больше 1500 байт наружу, но не впускает внутрь: каждый прогон, в котором ПК принимал больше 1500, показывал 0,00 бит/с, пока его не перемерили версией для Windows
curl по HTTPS и SHA-256 длительные проверки целостности: файл в 1 ГиБ из случайных байтов, скачиваемый по кругу часами TLS отвергает любую запись, не прошедшую проверку подлинности, а хеш файла, сверенный с хешем сервера, ловит всё, что прошло целиком; одна пропускная способность ничего не говорит о том, верны ли байты
ping с битом запрета фрагментации, заданных размеров проходит ли кадр данного размера по пути, и время кругового пути самая простая проверка MTU пути и того, принимает ли порт вообще
sysctl процессоры (kern.cp_time), собственные счётчики драйверов (dev.octep.0.*, dev.npuep.0.*) и очищенный кеш хостов TCP (net.inet.tcp.hostcache.purgenow) собственные числа ядра, читаемые одинаково при каждом прогоне
pfctl состояния pf и их счётчики пакетов и байтов то, что видел межсетевой экран хоста, чтобы поставить рядом с тем, что видела аппаратура
собственная статистика сопроцессора, читаемая через драйвер что переслала аппаратура: кадры с линии, кадры, которые она сама отправила обратно на линию, её подсчёт каждого соединения единственный свидетель трафика, которого хост больше не видит
mvsw регистры микросхемы коммутатора: предел кадра порта, его счётчики ошибок ошибки и пределы, которые видит только коммутатор, прочитанные из его собственных регистров
shot-run.ps1 запускает каждую команду измерения в собственном окне консоли и фотографирует это окно по завершении, его собственными пикселями доказательство - экран таким, каким он был, а не перепечатанный потом текст, и больше ничего с рабочего стола в снимок не попадает
tools/mark-images.py ставит владельца и лицензию (CC BY 4.0) в полосу под каждой фотографией; неразмеченный оригинал хранится отдельно снимок, покинувший страницу, по-прежнему говорит, чей он
tools/readme-art.py вычисляет готовность каждого устройства по таблице на странице его семейства см. расчёт ниже; проверки не проходят, если страница указывает иное

Скрипты, управляющие каждым прогоном, названы на странице этого прогона.

Расчёт

цифра как вычисляется почему
пропускная способность, один прогон биты в секунду приёмника за прогон, как их выводит iperf3 счёт приёмника - это то, что пришло
пропускная способность, длительная проверка байты, полученные в успешных проходах, × 8, делённые на секунды от начала первого прохода до конца последнего среднее за часы, неудачи не засчитываются как доставленные
загрузка процессоров kern.cp_time, прочитанный до и после прогона; загрузка = (всего − простой) ÷ всего, по разностям сколько стоил прогон за всё время, тогда как взгляд на top выхватывает один миг
доля кадров в аппаратуре из кадров, принятых сопроцессором с линии за прогон (RX_WIRE), доля, которую он сам отправил обратно на линию (FROM_WIRE_TO_WIRE): 6 630 528 из 6 657 897 - это 99,6 % подсчитано аппаратурой, которая их переслала, а не выведено из молчания хоста
счётчик, которому доверяют сверяется с заранее известным количеством: ПК отправляет ровно 4 000 000 000 байт, и счёт сопроцессора вместе со счётом pf должен дать то, что прошло по линии, - они дали это с точностью до 14 пакетов из 2,74 миллиона счётчику доверяют только после того, как он совпал с чем-то, подсчитанным независимо; так были найдены два неверных
результат проверки целостности неудачные проходы (код выхода curl), проходы с отличающимся файлом (хеш) и байты проверка пройдена, только если оба равны нулю
готовность устройства у каждой строки таблицы на странице его семейства есть процент выполнения и вес; готовность = Σ(выполнение × вес) ÷ N, где веса в сумме дают N, а зачёркнутое значение не считается процент, который не может разойтись с тем, что он взвешивает: его вычисляет tools/readme-art.py, и проверки не проходят, если страница или README указывают другой

Правила, которые соблюдает каждая страница

правило почему
Как получено и чего не означает - на каждой странице пределы цифры - её часть: поток, заканчивающийся на собственном хосте устройства, измеряет наименьшее из ПК, пересылки, соединения и приёмного пути этого хоста, - а не потолок пересылки, для которого нужна машина за дальним устройством
Указывается сборка - коммит драйвера или его контрольная сумма число принадлежит коду, который его получил
Каждое окно фотографируется по окончании прогона любой может увидеть сам прогон, а не копию его чисел; адреса лаборатории остаются на снимках, серийные номера и аппаратные адреса размываются
Всё, что хост выучил, забывается перед каждым прогоном - его кеш хостов TCP и кеш MTU пути на ПК MTU пути, выученный в одном прогоне, перенёсся в следующий: целый проход шёл сегментами по 500 байт и был отброшен
Что пошло не так при измерении, записывается ошибки - выученный MTU, потерянные кадры WSL - объясняют, почему страница измеряла именно так, и следующее измерение их избегает
Отозванная цифра зачёркивается, а не удаляется, исправление рядом читатель видит, что изменилось и почему
Данные производителя помечаются как данные производителя, рядом с нашими они получены с Keysight-Ixia BreakingPoint в идеальных условиях, без указания MTU, портов и учёта обоих направлений: это не числа того же рода, что полученные здесь

Где числа

Каждое измерение по устройствам и дням: измерения (на английском).