Шукати в цьому блозі

четвер, 4 червня 2009 р.

Ограничить скорость своего исходящего трафика (рецепт для Linux)

Есть ещё один неприятный момент при работе в Интернете, когда у Вас есть ограничение по скорости. Я не даром приводил задачу для начальных классов школы о втекающей и вытекающей в бассейн воде. Дело в том, что такая-же "петрушка" происходит и с тем трафиком которых является исходящим от Вас.

Предположим, что Вы покупаете канал в Интернет 256Кбит/с, а Ваша сетевая карта настроена в режиме 100Мбит/с (ну или 10Мбит/с - тут это не принципиально). Т.е. Вы будете отдавать на шлюз трафик со скоростью заведомо большей (и во много раз большей!) чем от Вас ожидают. Что при этом произойдёт? Ответ: ванная (стек ip) очень быстро заполнится и вода начнёт выливаться за края (трафик начнёт просто теряться. "лишний" трафик просто перестанет обрабатываться). Безусловно, что в механизме ip существуют механизмы которые контролируют передачу и если что-то где-то потерялось, то потерянный пакет будет отправлен заново - продублируется. Если пакет будет продублирован - это вызовет ненужную нагрузку на Ваш канал, так как этот трафик Вам реально не нужен, он-же был отправлен раньше и т.д. Пока все данные не будут отправлены этот "снежный ком" будет "катиться" и иногда приобретать лавинообразный характер.

Ну не знаю как там в "форточках" (Windows) но в Linux одно из решений этой "проблемы" - ограничить свой исходящий (egress) трафик самостоятельно, в пределах оговорённого Вашим тарифным пакетом, тем согласовав скорость с той, которую ожидает провайдер (оператор услуги):
Код:
# $1 - интерфейс, на котором ограничиваем пропускную способность
# удаляем дисциплины обработки очередей с интерфейса - переводим в состояние pfifo
tc qdisc del dev $1 root
# устанавливаем значение ds
tc qdisc add dev $1 handle 1:0 root dsmark indices 1 default_index 0
# ограничиваем исходящую скорость дисциплиной tbf на 1024Кбит/с (1Мбит/с)
tc qdisc add dev $1 handle 2:0 parent 1:0 tbf burst 3072 limit 20480 mtu 1408 rate 125000bps
Этот код надо вставить куда нибудь, где он будет выполняться после "подъема" интерфейса смотрящего в сторону оператора связи. Безусловно, что вместо $1 необходимо прописать свой реальный интерфейс :)

Кстати оригинальный вариант для tcng выглядит так:
Код:
#define IFACE0  eth3
#define MTU     1408B
#define RATE    1Mbps
#define BURST   3kB
#define LIMIT   20kB

dev IFACE0 {
egress {
tbf (mtu MTU,limit LIMIT,rate RATE,burst BURST);
}
}
Сохраняем в какой нибудь файл. Затем говорим:
Код:
~$ tcng filename.tcng
и получаем результат приведённый выше.

Конечно-же при помощи tcng и tc можно "нарисовать" более сложные политики/решения с дисциплинами htb и т.п., но данный топик для такого рода обсуждений не предназначен ;)

О! Чуть не забыл. Посмотреть какими дисциплинами в данный момент обрабатывается Ваша очередь можно так:
Код:
~$ sudo tc -s qdisc ls dev eth3
qdisc dsmark 1: indices 0x0001 default_index 0x0000
Sent 2040274 bytes 4253 pkt (dropped 10, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc tbf 2: parent 1: rate 1000Kbit burst 3Kb lat 136.0ms
Sent 2039684 bytes 4250 pkt (dropped 10, overlimits 1942 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
~$ sudo tc -s -d qdisc ls dev eth1
qdisc pfifo_fast 0: root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 119707 bytes 1087 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
Обратите внимание на dropped - это тот трафик которого от нас, в общем-то, не ждали и мы его не дали в сеть. Тем самым мы снизили нагрузку на оборудование сети, за что, наверное получили виртуальную "спасибу" от администраторов :)

Немає коментарів: