Размер ковша в тбф

11

Я много раз читал о Token Bucket фильтра в Linux (TBF) и до сих пор я не совсем понимаю , как я должен вычислить burstи latencyпараметры, позор мне :(

Я полагаю, что разумная задержка составляет около 50 мс. Хорошо, но какое значение должен принять взрыв?

На странице написано:

Последний расчет учитывает размер корзины, скорость и, возможно, максимальную скорость (если она установлена). Эти два параметра являются взаимоисключающими.

Итак, как задержка связана с ведром и фильтром? Есть ли формула для его расчета? Или это просто вопрос: «Хорошо, X байтов пакета и Y секунд задержки - это хорошо для меня»?

sebelk
источник
1
Для всех, кто считает это неясным, tbfявляется частью системы управления трафиком Linux. man tbfили man tc-tbfдолжен поднять документацию.
Дероберт
1
Исходя из ваших правок, кажется, что вам необходимо объяснить концептуально, что такое фильтр сегментов памяти. Я добавлю один к моему ответу, как только я вернусь перед компьютером (пишу это на моем телефоне.)
Дероберт
Наконец добавлено в концептуальном объяснении
Дероберт

Ответы:

16

На странице руководства единственным ограничением burstявляется то, что он должен быть достаточно высоким, чтобы разрешить настроенную вами скорость: она должна быть не ниже скорости / Гц. HZ - это параметр конфигурации ядра; Вы можете выяснить, что находится в вашей системе, проверив конфигурацию вашего ядра. Например, в Debian вы можете:

$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y

таким образом, HZ в моей системе составляет 250. Чтобы достичь скорости burst10 Мбит / с , мне, таким образом, потребуется не менее 10 000 000 бит / с ÷ 250 Гц = 40000 бит = 5000 байтов. (Обратите внимание, что более высокое значение в man-странице относится к тому, когда HZ = 100 было значением по умолчанию).

Но помимо этого, burstэто также инструмент политики. Он настраивает степень, в которой вы можете использовать меньшую пропускную способность сейчас, чтобы «сохранить» ее для будущего использования. Здесь часто встречается то, что вы можете позволить небольшим загрузкам (скажем, веб-странице) идти очень быстро, при этом ограничивая большие загрузки. Вы делаете это, увеличивая burstразмер, который вы считаете небольшой загрузкой. (Хотя вы часто переключаетесь на классный qdisc, такой как htb, поэтому вы можете сегментировать различные типы трафика.)

Итак: вы настраиваете пакет, чтобы он был как минимум достаточно большим, чтобы достичь желаемого rate. Помимо этого, вы можете увеличить его в зависимости от того, чего вы пытаетесь достичь.

Концептуальная модель Token Bucket Filter

Фильтр Token Bucket

«Ведро» - это метафорический объект. Его ключевые свойства заключаются в том, что он может содержать токены, и что количество токенов, которые он может содержать, ограничено - если вы попытаетесь добавить больше, он «переполнится» и лишние токены будут потеряны (так же, как попытка положить слишком много воды в актуальное ведро). Размер ведра называется burst.

Чтобы фактически передать пакет в сеть, этот пакет должен получить токены, равные его размеру в байтах или mpu(в зависимости от того, что больше).

Существует (или может быть) строка (очередь) пакетов, ожидающих токены. Это происходит, когда корзина пуста или, наоборот, содержит меньше токенов, чем размер пакета. На тротуаре перед ковшом имеется очень много места, и количество места (в байтах) устанавливается непосредственно limit. Альтернативно, это может быть установлено косвенно с latency(в идеальном мире, вычисление было бы rate× latency).

Когда ядро ​​хочет отправить пакет из отфильтрованного интерфейса, оно пытается поместить пакет в конец строки. Если на тротуаре нет места, это плохо для пакета, потому что в конце тротуара находится бездонная яма, и ядро ​​отбрасывает пакет.

Последняя часть - это машина для изготовления токенов, которая добавляет rate/ HZжетоны в ведро каждый тик. (Вот почему ваше ведро должно быть как минимум таким большим, в противном случае некоторые из недавно выпущенных жетонов будут немедленно сброшены).

derobert
источник
Я думал, что это наоборот, что вы позволяете на мгновение превысить скорость, которая позже была компенсирована более низкой скоростью, чтобы достичь средней скорости ...
Себельк
@sebelk Я не уверен без RTFS, но это сработало бы с тем же результатом, за исключением случая, когда tbf добавляется к интерфейсу, который в настоящее время работает над rate. Или нет, как вы могли бы просто сказать, что ведро начинает
заполняться
@sebelk: Это тоже правда. Допустим, у нас есть сегмент 1000 байтов (размер пакета), а скорость токена равна 10 байтов. второй. Таким образом, если в течение 100 секунд не поступило ни одного пакета, ведро будет заполнено. Тогда следующие 1000 байтов пакетов, которые поступят, будут переданы немедленно, без очереди, иначе всплеск скорости передачи данных, который может быть выше скорости создания токена.
Бьярке Фрейнд-Хансен,
5

Еще один ответ, чтобы дополнить Дероберт.

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

Для TBF параметр пакета - это количество байтов, которое может быть отправлено с неограниченной скоростью до того, как сработает ограничение скорости (определяемое скоростью ). После того, как ограничение скорости сработало, единственный способ повторить это ограничить отправку ниже этой скорости ,

Например, предположим, что ваш параметр пакета tbf составляет 10 Кбайт, а ваш параметр скорости передачи tbf равен 2 Кбайт / с, и в настоящее время вы ограничены скоростью (т. Е. Пакет исчерпан, поэтому вы ограничены отправкой со скоростью 2 Кбит / с). Если вы добровольно снизили скорость передачи до 1 Кбит / с в течение 10 секунд, вы снова накапливаете свой всплеск 10 Кбайт (= (2000 [байтов / сек] - 1000 [байтов / сек]) * 10 сек). Поддержание этого значения ниже 1 кбит / с в течение более 10 секунд не будет иметь никакого эффекта, поскольку tbf не позволяет вам накапливать больше, чем параметр пакета .

Если вы полностью прекратили тратить деньги, вы вернете всплеск в течение 5 секунд (= 100000 [байт] / 2000 [байт / сек]).

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

Еще один способ взглянуть на это: вам разрешено посылать пакетные байты с неограниченной скоростью, после чего ваша долгосрочная средняя скорость никогда не может превышать скорость . Тем не менее, поскольку это долгосрочная средняя величина, если вы упадете ниже уровня, вам будет разрешено наверстать упущенное при отправке на полной скорости, но даже тогда вам разрешено отправлять только по полной не более, чем пакетные байты (и если это не так разрешить наверстать нельзя)

Другая проблема заключается в том, что TBF имеет два из этих ограничителей скорости, и ваш трафик должен проходить через оба. Во втором параметре пакета называют mtu и, и скорость называют пиковой скоростью . Предполагается, что вы используете этот второй, чтобы ограничить скорость, с которой первый может послать свои очереди Использование этого второго варианта не является обязательным, и если вы не используете его, пакеты отправляются со скоростью устройства.

Наконец, у tbf есть параметр limit . Если программа постоянно отправляет быстрее, чем скорость , то пакеты будут накапливаться в очереди. Не существует бесконечной памяти ядра, поэтому limit говорит, сколько байтов может накопиться до того, как ядро ​​начнет отбрасывать пакеты.

Рассел Стюарт
источник