Назад | Перейти на главную страницу

Правильный способ измерения производительности оверлейной сети

В настоящее время я изучаю производительность (особенно пропускную способность UDP) различных оверлейных сетей Docker. Я делаю это, создавая соединения точка-точка между двумя хостами, которые подключены к оверлейной сети Docker, а затем запускаю iperf внутри контейнеров Docker для проверки пропускной способности. Я заметил, что каждый раз, когда я бегу iperf в качестве клиента для отправки данных в другой контейнер, который запускается iperf в качестве сервера загрузка ЦП клиентского хоста достигает 100%. Я получил этот результат, выполнив следующую команду, которую нашел на Вот:

top -bn1 | grep "Cpu(s)" | \
       sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
       awk '{print 100 - $1"%"}'

Итак, мне кажется, что ограничивающим фактором моих тестов пропускной способности является мощность ЦП моего хоста, поскольку он работает на 100% и не может генерировать дополнительный трафик для насыщения сетевого соединения. Мне интересно, если это iperf конкретная проблема, поэтому я хотел запустить те же тесты с другим инструментом, но не уверен какая альтернатива была бы лучше. Хосты работают под управлением Ubuntu. Например, я нашел qperf, uperf и netpipe.

Кроме того, в более общем плане я начал задаваться вопросом, что обычно является узким местом для производительности. Разве это не всегда ЦПУ емкость или пропускная способность ссылки? Эти факторы не имеют прямого отношения к оверлейным сетям.

Означает ли это, что пропускная способность приложения (или оверлейной сети) просто зависит от того, сколько циклов ЦП ему нужно для передачи определенного объема данных и от того, как он сжимает их, чтобы они поместились в сети (если это будет узким местом).

UDP ограничен как ЦП, так и пропускной способностью. Он отправляет пакеты без гарантии, что они отправлены, переданы или получены.

  • Если ЦП отправителя слишком занят, пакет никогда не отправляется.
  • Если пропускная способность не справляется, пакеты отбрасываются в пути.
  • Если ЦП приемника слишком занят или не готов обрабатывать входящие сетевые данные, он теряется.
  • Если приложение не извлекает пакеты из ОС (и не обрабатывает их) достаточно быстро, они теряются.

Вообще говоря, производительность UDP бессмысленна. Ничто не мешает попробовать отправить 1 миллиард пакетов в секунду. Это загружает ЦП отправителя и сеть, в то время как получатель может ничего не получить.

Если вы действительно хотите протестировать UDP, это довольно длинная тема, достойная книги. Для начала вам необходимо отслеживать количество ошибок и то, какие данные фактически отправляются / принимаются.

Вы должны протестировать TCP, чтобы измерить доступную пропускную способность между хостами. iperf должен уметь это делать нормально.