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

Ограничение входящей и исходящей пропускной способности и задержки в Linux

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

У меня есть виртуальный сервер Linux (под управлением Debian Squeeze), который я использую для тестирования скорости веб-сайтов, чтобы измерить увеличение и уменьшение времени загрузки указанных веб-сайтов. Я пытаюсь ограничить пропускную способность и задержку этого сервера, чтобы иметь возможность приблизиться к реальному времени загрузки на веб-сайтах, но пока это не удалось.

В частности, я хочу следующее:

Я читал о netem и использовал tc команду, но это все еще немного выше моей головы. Мне удалось собрать эту команду для управления задержкой, которая, похоже, работает, но я даже не уверен, обрабатывает ли она только исходящую задержку или и то, и другое:

tc qdisc add dev eth0 root netem delay 50ms

Есть какие-нибудь сетевые гуру, которые могут мне помочь?

Редактировать:

После дальнейшего исследования я прошел половину пути к своей цели, с помощью этой команды весь исходящий трафик ведет себя так, как я хочу:

tc qdisc add dev eth0 root tbf rate 4.0mbit latency 50ms burst 50kb mtu 10000

Однако я до сих пор не смог должным образом ограничить входящий трафик. Я узнал, что я должен использовать «фильтр Ingress Policer». Я пытался сделать это с помощью приведенной ниже команды, экспериментируя с разными значениями, но безуспешно.

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match ip src 0.0.0.0/0 flowid :1 police rate 1.0mbit mtu 10000 burst 10k drop

Пропускная способность зависит от команды, однако значения выше заставляют скорость начинаться с 2 МБ / с и, по мере продвижения передачи, медленно снижаться до примерно 80-90 КБ / с, которые достигаются примерно через 30 секунд передачи.

Есть идеи о том, что я делаю неправильно?

В конце концов я решил просто установить исходящую полосу пропускания / задержку на сервере, а затем проделать то же самое на клиенте, фактически достигнув того же результата.

Вот команды, которые я запускал на сервере и клиенте соответственно для достижения своих целей:

Сервер: 4 Мбит 50 мс

tc qdisc add dev eth0 handle 1: root htb default 11
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev eth0 parent 1:11 handle 10: netem delay 50ms

Клиент: 512 кбит 50 мс

tc qdisc add dev vmnet1 handle 1: root htb default 11
tc class add dev vmnet1 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev vmnet1 parent 1:1 classid 1:11 htb rate 512kbit
tc qdisc add dev vmnet1 parent 1:11 handle 10: netem delay 50ms

Примерно 80-90 кБайт / с - это примерно то, чего ожидать от

    tc filter add ... police rate 1.0mbit ...

Вы просите, чтобы входящие данные отбрасывались, когда они достигают 1 Мбит / с, это около 125 КБайт / с. Затем удаленный сервер упадет до значительно ниже этого значения (возможно, наполовину, не уверен). После этого проходят все пакеты, поэтому удаленный конец медленно набирает скорость, пока снова не будет достигнуто значение 125 кбайт / с. Вы получаете средний пропускная способность значительно ниже 125 кБайт / с, что типично для формирования входящего трафика.

Я немного удивлен, что скорость должна достигнуть 2 МБ / с с уже установленным фильтром входящей политики. Где вы измеряли - на нисходящем клиенте (программе) или на каком-то восходящем маршрутизаторе? Или, может быть, вы сначала установили соединение и только после этого включили фильтр входящей политики?