Я много раз читал о Token Bucket фильтра в Linux (TBF) и до сих пор я не совсем понимаю , как я должен вычислить burst
и latency
параметры, позор мне :(
Я полагаю, что разумная задержка составляет около 50 мс. Хорошо, но какое значение должен принять взрыв?
На странице написано:
Последний расчет учитывает размер корзины, скорость и, возможно, максимальную скорость (если она установлена). Эти два параметра являются взаимоисключающими.
Итак, как задержка связана с ведром и фильтром? Есть ли формула для его расчета? Или это просто вопрос: «Хорошо, X байтов пакета и Y секунд задержки - это хорошо для меня»?
tbf
является частью системы управления трафиком Linux.man tbf
илиman tc-tbf
должен поднять документацию.Ответы:
На странице руководства единственным ограничением
burst
является то, что он должен быть достаточно высоким, чтобы разрешить настроенную вами скорость: она должна быть не ниже скорости / Гц. HZ - это параметр конфигурации ядра; Вы можете выяснить, что находится в вашей системе, проверив конфигурацию вашего ядра. Например, в Debian вы можете:таким образом, HZ в моей системе составляет 250. Чтобы достичь скорости
burst
10 Мбит / с , мне, таким образом, потребуется не менее 10 000 000 бит / с ÷ 250 Гц = 40000 бит = 5000 байтов. (Обратите внимание, что более высокое значение в man-странице относится к тому, когда HZ = 100 было значением по умолчанию).Но помимо этого,
burst
это также инструмент политики. Он настраивает степень, в которой вы можете использовать меньшую пропускную способность сейчас, чтобы «сохранить» ее для будущего использования. Здесь часто встречается то, что вы можете позволить небольшим загрузкам (скажем, веб-странице) идти очень быстро, при этом ограничивая большие загрузки. Вы делаете это, увеличиваяburst
размер, который вы считаете небольшой загрузкой. (Хотя вы часто переключаетесь на классный qdisc, такой как htb, поэтому вы можете сегментировать различные типы трафика.)Итак: вы настраиваете пакет, чтобы он был как минимум достаточно большим, чтобы достичь желаемого
rate
. Помимо этого, вы можете увеличить его в зависимости от того, чего вы пытаетесь достичь.Концептуальная модель Token Bucket Filter
«Ведро» - это метафорический объект. Его ключевые свойства заключаются в том, что он может содержать токены, и что количество токенов, которые он может содержать, ограничено - если вы попытаетесь добавить больше, он «переполнится» и лишние токены будут потеряны (так же, как попытка положить слишком много воды в актуальное ведро). Размер ведра называется
burst
.Чтобы фактически передать пакет в сеть, этот пакет должен получить токены, равные его размеру в байтах или
mpu
(в зависимости от того, что больше).Существует (или может быть) строка (очередь) пакетов, ожидающих токены. Это происходит, когда корзина пуста или, наоборот, содержит меньше токенов, чем размер пакета. На тротуаре перед ковшом имеется очень много места, и количество места (в байтах) устанавливается непосредственно
limit
. Альтернативно, это может быть установлено косвенно сlatency
(в идеальном мире, вычисление было быrate
×latency
).Когда ядро хочет отправить пакет из отфильтрованного интерфейса, оно пытается поместить пакет в конец строки. Если на тротуаре нет места, это плохо для пакета, потому что в конце тротуара находится бездонная яма, и ядро отбрасывает пакет.
Последняя часть - это машина для изготовления токенов, которая добавляет
rate
/HZ
жетоны в ведро каждый тик. (Вот почему ваше ведро должно быть как минимум таким большим, в противном случае некоторые из недавно выпущенных жетонов будут немедленно сброшены).источник
rate
. Или нет, как вы могли бы просто сказать, что ведро начинаетЕще один ответ, чтобы дополнить Дероберт.
Во-первых, для современных процессоров 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 говорит, сколько байтов может накопиться до того, как ядро начнет отбрасывать пакеты.
источник