Как получаются измерения
Перевод страницы 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, портов и учёта обоих направлений: это не числа того же рода, что полученные здесь |
Где числа
Каждое измерение по устройствам и дням: измерения (на английском).