README
¶
twping-go
Реализация на Go клиента TWAMP (RFC 5357) twping, портированного с
C-реализации perfSONAR owamp. Клиент
говорит на TWAMP-Control по TCP/862 и на тестовом протоколе TWAMP по UDP, а
статистику выдаёт ту же, что и оригинал.
Сведения об авторстве оригинала — в файле NOTICE.
Установка
Скачайте готовый бинарник для Windows, Linux или macOS из последнего релиза или установите через Go:
go install github.com/akprof2000/twping-go/cmd/twping@latest
В каждом архиве релиза лежит бинарник плюс README.md, LICENSE и NOTICE;
загрузку можно проверить по файлу SHA256SUMS, публикуемому рядом.
Сборка из исходников
go build -o twping ./cmd/twping
Проект собирается под Windows, Linux и macOS без внешних зависимостей — только
стандартная библиотека. Скрипт scripts/build-release.sh собирает полный набор
архивов релиза.
Документация
| Документ | Содержание |
|---|---|
| docs/PROTOCOL.md | Форматы на проводе, смещения байтов, выработка ключей, расписание и определения статистик |
| docs/TESTING.md | Набор тестов и стенд на Docker для проверки совместимости и нагрузочных прогонов |
| CHANGELOG.md | История релизов |
Использование
twping [аргументы] тест-адрес [адрес-сервера]
тест-адрес — отражатель, адрес-сервера — управляющий сервер; если он не
указан, используется тест-адрес. Полный список параметров — twping -h.
twping -c 100 -i 0.1 twamp.example.net
Флаги те же, что у оригинала: -c количество пакетов, -i средний интервал
между пакетами, -L порог потери, -s заполнение, -P диапазон локальных
портов, -D DSCP, -z отложенный старт, -A/-u/-k аутентификация, -a
дополнительные процентили, -b ширина корзины гистограммы, -n единицы
измерения, -M машиночитаемая сводка, -R сырые записи, -v[=N] задержки по
каждому пакету, -U метки времени UNIX, -Q без статистики, -Z обнулённые
адреса для прохождения NAT, -4/-6 семейство адресов, -S/-B локальный
адрес или интерфейс.
Режимы
Реализованы все четыре режима TWAMP: открытый, с аутентификацией, шифрованный и смешанный (шифрованное управление при тестовых пакетах в открытом формате). Как и в оригинале, шифрующие режимы предлагаются только при указанном идентификаторе:
twping -u alice -k /etc/twamp/passphrases -A E -c 100 twamp.example.net
Использование как библиотеки
Пакет twping выполняет замер по тем же аргументам, что и утилита, и пишет
результат в переданный writer. Отмена контекста прерывает идущую сессию, не
убивая процесс; своих обработчиков сигналов пакет не ставит.
import (
"context"
"os"
"github.com/akprof2000/twping-go/twping"
)
err := twping.Run(context.Background(),
[]string{"-c", "100", "-i", "0.1", "twamp.example.net"},
os.Stdout, os.Stderr)
Run печатает сводку подписями оригинального twping из perfSONAR — на них
рассчитаны инструменты, которые её разбирают. Русский вариант выбирается через
twping.RunLang(ctx, args, out, errOut, owamp.Russian); именно его использует
сама утилита.
Пакет owamp даёт более низкий уровень — управляющее соединение, тестовую
сессию и накопитель статистики — если нужен свой цикл замера, а не готовый
разбор аргументов.
Флаги, которых нет в оригинале
| Флаг | Значение |
|---|---|
--spin мкс |
Верхняя граница окна активного ожидания перед каждой отправкой по расписанию. Для каждого пакета ограничивается четвертью интервала до предыдущего. По умолчанию 200 мкс (1500 мкс в Windows, где таймеры грубее). Значение 0 отключает активное ожидание и оставляет только таймер ОС. |
--sync |
Считать локальные часы синхронизированными. Без этого флага клиент печатает (без синхронизации), поскольку в Go нет переносимого способа опросить локальный демон NTP. |
--esterror мкс |
Оценка погрешности локальных часов; включает --sync. |
Отличия от оригинала на C
- Синхронизация часов. Клиент на C читает состояние NTP в ядре
(
ntp_adjtime), чтобы заполнить оценку погрешности и бит синхронизации. В Go переносимого аналога нет, поэтому этот клиент сообщает «без синхронизации», если не указано иное через--syncили--esterror. Все остальные поля метки времени на проводе совпадают. - Число хопов обратного пути. Чтение принятого IP TTL требует вспомогательных данных сокета; это реализовано для Linux и macOS. На прочих системах, включая Windows, число хопов обратного пути помечается как «не сообщается». Число хопов до отражателя, которое отражатель кладёт внутрь пакета, работает всегда, а исходящий TTL выставляется в 255, как требует RFC 4656.
- Нет файлов сессий.
twpingна C пишет файлы сессий в формате owamp и использует общий движок статистики сowstatsиowfetch. Этот порт считает статистику в своём процессе;-Fзаписывает поток сырых записей в текстовом формате-R, а не двоичный формат сессий owamp. - Подсводки сессии. Параметр
-Nпринимается, но пока не реализован. - Параллелизм. Отправка и приём работают в отдельных горутинах, поэтому метка времени ответа снимается сразу по его приходу, а не после очередного решения планировщика отправки. На высоких скоростях это заметно улучшает точность и поведение при потерях — см. ниже.
- Язык вывода. Справка и сообщения об ошибках выводятся на русском языке.
Человекочитаемая сводка утилиты тоже русская, а библиотечный вызов
twping.Runпечатает подписи оригинального twping — см. раздел «Использование как библиотеки». Машинный формат-Mи формат сырых записей-Rсохранены без изменений, включая имена полей, чтобы оставалась совместимость с внешними разборщиками и с оригиналом.
Тестирование
go test ./...
В набор входит отражатель TWAMP, работающий внутри процесса, поэтому установление управляющей связи, все четыре режима, форматы тестовых пакетов, учёт потерь и дубликатов, а также оба формата вывода проверяются сквозным образом без внешнего сервера.
Совместимость и нагрузочные прогоны против настоящего сервера
Каталог testing/ собирает образ Docker с оригинальным сервером perfSONAR
twampd и клиентом twping (компилируются из исходников) рядом с этим
клиентом, так что оба работают в одинаковом окружении:
cd testing
GOOS=linux GOARCH=amd64 go build -o twping-go ../cmd/twping
docker build -f Dockerfile.owamp -t twamp-ref .
docker network create twamp-net
docker run -d --name twamp-server --network twamp-net twamp-ref
docker run --rm --network twamp-net twamp-ref loadtest.sh twamp-server 3
Оба клиента работают с одним и тем же twampd, а их вывод в форматах -R и
-M совпадает поле за полем.
Измеренные результаты
Против twampd через сетевой мост Docker, по два прогона на сценарий:
| Сценарий | Клиент | Время, с | CPU, с | RSS, КБ | Отправлено | Потеряно | Медиана RTT |
|---|---|---|---|---|---|---|---|
| 1 kpps, 1 000 пак. | twping (C) | 3.0 | 0.13 | 2 592 | 1 000 | 0 | 0.80 мс |
| twping-go | 3.0 | 0.29 | 9 256 | 1 000 | 0 | 0.25 мс | |
| 1 kpps, 5 000 пак. | twping (C) | 7.0 | 0.70 | 2 528 | 5 000 | 0 | 0.90 мс |
| twping-go | 7.1 | 1.49 | 9 292 | 5 000 | 0 | 0.25 мс | |
| 2 kpps, 10 000 пак. | twping (C) | 7.0 | 0.97 | 2 848 | 10 000 | 0 | 3.7 мс |
| twping-go | 7.1 | 2.26 | 11 736 | 10 000 | 0 | 0.15 мс | |
| 5 kpps, 20 000 пак. | twping (C) | 6.1 | 1.09 | 3 952 | 20 000 | 19 022 | нет данных |
| twping-go | 6.0 | 2.34 | 14 072 | 20 000 | 0 | 0.15 мс | |
| 1 kpps, заполнение 1 000 Б | twping (C) | 7.2 | 0.79 | 2 520 | 5 000 | 0 | 0.90 мс |
| twping-go | 7.1 | 1.83 | 9 296 | 5 000 | 0 | 0.25 мс |
Кратко:
- Пропускная способность. На 5 000 пакетов/с клиент на C теряет около 95 % сессии, поскольку его единственный цикл чередует планирование и приём; этот порт не теряет ничего. До 2 000 пакетов/с оба работают без потерь.
- Точность. Измеренная медиана RTT здесь в 3-20 раз ниже, а максимум — на порядок ниже. Разница объясняется задержкой планирования на стороне клиента, а не сетью: выделенная горутина приёма убирает задержку между приходом ответа и снятием его метки времени.
- Стоимость. Расход процессора примерно вдвое выше, чем у клиента на C, а
резидентная память — примерно вчетверо (большая часть последней приходится на
среду исполнения Go). На таких скоростях процессор занят в основном системными
вызовами на каждый пакет, а не средой исполнения Go или активным ожиданием: на
Linux вариант
--spin 0расходует примерно столько же процессора, сколько режим по умолчанию. - Клиент на C под нагрузкой иногда не выдавал статистику вовсе — в сыром выводе
стенда это видно как строки
nan; этот порт завершил каждый прогон.
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
twping
command
Команда twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).
|
Команда twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357). |
|
Пакет twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).
|
Пакет twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357). |