Статьи

Тесты производительности для медленных сетей с тк

tl; dr: вы можете легко реплицировать медленные сетевые условия, что облегчает их тестирование производительности.

Смартфоны сделали мобильные сайты и приложения, которые должны подключаться в мобильных ситуациях, гораздо более распространенными. Также большое значение имеет обслуживание таких клиентов, и в последние годы мы достигли стадии, когда почти каждая компания должна иметь мобильную стратегию. Сейчас в этом пространстве предстоит преодолеть множество проблем, но я кратко расскажу о тестировании производительности.

Методология исполнения

Многие люди используют разные методологии для определения проблем с производительностью, но почти все используют некоторую концепцию итеративного улучшения. Сначала вы устанавливаете целевой показатель производительности, такой как обработка нескольких одновременных соединений или ограничение задержки при загрузке страницы. Затем вы реализуете тест, который сообщает вам, выполняете ли вы такое требование. Возможно , для загрузки системы используется что-то вроде apache bench или jmeter . Затем вы можете оптимизировать и настроить свои настройки и код, пока не достигнете своей цели.

Конечно, некоторые сетевые подключения могут быть невероятно плохими — насколько реалистично тестирование времени загрузки страницы веб-сайта при подключении 1 Гбит, когда ваш бедный пользователь застрял в сельской Уэльсе на 2G? В то же время копирование медленных соединений на вашем телефоне может занять довольно много времени. Что вам действительно нужно, так это команда замедления обычного сетевого соединения, чтобы вы могли воспроизвести проблему, но без особых хлопот.

Репликация медленной сети с помощью tc

Хотя, несомненно, есть и другие способы, которыми я успешно пользовался ранее, это программа командной строки linux tc, которая обозначает управление трафиком . Это позволяет использовать обычный сетевой интерфейс и вводить дополнительную задержку или уменьшать доступную пропускную способность. Я не буду вдаваться в подробности о том, как настроить tc, но его справочная страница поможет, если вам нужны подробности. Моя цель здесь не состоит в том, чтобы написать полное руководство по использованию tc, но я рассмотрю основы того, как добавить пару правил к вашей машине, чтобы смоделировать простые проблемы. В tc каждое из этих отдельных правил называется дисциплиной массового обслуживания или qdisc .

Правила списка

Если в какой-то момент вы хотите увидеть все qdiscs, вы можете использовать команду ls. Вот пример для интерфейса lo:

 tc -s qdisc ls dev lo 

Я допускаю, что это довольно загадочно, но вы можете прочитать аргументы tc как «перечислить все qdiscs на устройстве lo». Общим компонентом каждого из этих примеров является указание устройства. Первоначально он пуст, но вы увидите записи, как только добавите некоторые правила, которые мы сделаем дальше. Я использую lo — устройство для просмотра всех этих примеров, но вы можете использовать eth0, wlan0 или любое другое подходящее устройство, с которым вы тестируете.

Ограничение пропускной способности

Прежде всего, мы заменили новую дисциплину очередей для петлевого устройства.

 tc qdisc add dev lo handle 1: root htb 

Если я хочу добавить qdisc, который ограничивает lo только 100 кбит / с, тогда я могу использовать команду rate :

 tc class add dev lo parent 1: classid 1:11 htb rate 100kbps 

Мы можем разбить эту команду на несколько частей, которые, как мы надеемся, сделают ее немного менее тупой. class add сообщает tc, что мы добавляем новый класс , это дерево дисциплин очередей. dev lo указывает, что мы используем петлевое устройство. Теперь, поскольку tc предназначен для создания сложных фильтров, эти классы могут фактически образовывать дерево и идентифицироваться, это то, к чему относится родительский 1: 1 classid 1:11 . HTB является иерархическим Token Bucket который представляет собой простой способ управления исходящего трафика на сетевом устройстве. Наконец оцените 100kbpsустанавливает максимальную скорость, с которой мы хотим, чтобы трафик шел. Здесь вы должны позаботиться, потому что tc принимает 100 кбит / с и 100 кбит / с, в зависимости от того, хотите ли вы килобайт или килобит.

Представляем латентность

Если я хочу добавить qdisc, который вводит 300 мс лага, то я могу использовать команду задержки :

 tc qdisc add dev lo parent 1:11 netem delay 300ms 

Разбивая эту команду, мы видим, что на этот раз мы добавляем qdisc вместо класса, поэтому мы используем qdisc add . Мы снова используем loopback в качестве устройства, поэтому мы используем dev lo . Мы указываем предыдущий класс как нашего родителя в дереве, используя родителя 1:11 . Если вы вернетесь к предыдущей команде, то увидите, что мы использовали classid 1:11 для установки ее идентификатора, и именно на это ссылается 1:11 . Затем задержка 300 мс говорит tc добавить 300 мс лага.

Ограничение портов

Конечно, у вас могут быть другие соединения, говорящие через одно и то же сетевое устройство, и ограничение их всех до 3G не даст надежного теста скорости. Поэтому мы собираемся добавить фильтр, чтобы убедиться, что эти правила применяются только к порту 8080. Фильтр — это ограничение, которое позволяет применять qdisc только в определенных условиях.

 tc filter add dev lo protocol ip prio 1 u32 match ip dport 8080 0xffff flowid 1:11 

Как вы уже знаете, мы используем filter add, чтобы добавить фильтр, и dev lo, чтобы указать устройство, к которому он применяется. Протокол ip делает то, что говорит на жестяной коробке: указывает протокол ip. Прио 1 определяет приоритет этого фильтра. Prorities позволяет вам определить, какой класс получает дополнительную полосу пропускания, если он доступен и соответствует ли он указанным вами правилам.

u32 относится к типу правила фильтрации, которое мы используем. match ip dport 8080 указывает tc смотреть порт 8080 как пункт назначения входящего запроса. 0xffff — это битовая маска, которая заставляет фильтр u32 просматривать весь заголовок. если у вас несколько qdiscs, то tc нужно знать, какие правила использовать, поэтому в flowid 1:11 указывается идентификатор, который мы использовали ранее в качестве родительского класса в разделе «Ограничение пропускной способности».

Я знаю, что это немного странно, но возможность ограничения по порту может быть довольно удобной.

Возвращаясь к нормальной жизни

Как только вы закончите бенчмаркинг, вы, очевидно, захотите вернуть все в нормальное русло. Чтобы удалить ограничения, которые вы только что наложили на интерфейс lo, вы можете использовать команду del .

 tc qdisc del dev lo root 

Заключительные замечания

Этот подход может быть очень полезен при проверке того, действительно ли внесенные вами изменения действительно работают без длительных шагов или репликации на реальных устройствах. Если вы уверены, что ваши оптимизации сработали, вам все равно следует проверить это на реальном оборудовании, чтобы убедиться в этом. Существует множество различий между очень медленной сетью и изменениями, которые вы только что внесли в свое сетевое устройство, и вы должны убедиться, что вы проверяете свои изменения в реальных условиях, а не только в лаборатории.

дц также имеет множество других полезных функций , которые задокументированы все более в Интернете.

Спасибо Джону Оливеру за то, что он указал на эту технику и вместе с Перри Лорье рассмотрел ранние черновики этого поста.