Я пытаюсь уменьшить пропускную способность интерфейса для отладки моего приложения на более медленной скорости сети.
Я вспомнил tc
заявление, чтобы сделать это на интерфейсе, который работал в прошлом. Я использовал его на выделенной (удаленной) машине для разработки.
Это заявление
tc qdisc add dev wlan0 root tbf rate 250kbit latency 300ms burst 125kbit
Оно работает хорошо при попытке доступа к локальному сокету от другого хозяина, но при доступе к сокету на этом интерфейсе из моего локальная машина, фильтр не применяется.
# ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet XXX.XXX.XXX:XXX netmask 255.255.255.0 broadcast XXX.XXX.0.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether XX:XX:XX:XX:XX:XX txqueuelen 1000 (Ethernet)
RX packets 31438 bytes 28025182 (26.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27035 bytes 7482740 (7.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# netstat -lntp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 5990/nginx: master
# netstat -lntp | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 7432/nginx: master
tcp 0 0 XXX.XXX.XXX.XXX:8080 0.0.0.0:* LISTEN 7432/nginx: master
В браузере пытаюсь зайти http://XXX.XXX.XXX.XXX:8080/path
и страница (> 1 МБ содержимого + сборки) отображается сразу (кеш очищен ранее).
На другом хосте, который имеет доступ к моей системе, весь контент загружается (заметно) медленно.
Я, конечно, искал другие ресурсы, но ни один из них у меня не работает:
Я также попытался создать класс, используя tc
и искажение пакетов с помощью iptables
(как показано в третьей ссылке) не было возможно в Fedora 19. Правило игнорируется (нет ошибки при добавлении правила, но оно не появляется при выдаче iptabls -n -L
).
Итак, я подозреваю, что фильтрация применяется только к пакетам, поступающим на интерфейс, или локальные запросы не проходят уровень фильтрации.
(Также приветствуются советы по альтернативным решениям. Далее я опробую squid в качестве обратного прокси с классами задержки.)
Пакеты, предназначенные для локальной машины, не проходят через сетевой интерфейс. Например, вы можете заполнить IP-адрес вашего интерфейса eth0 (скажем, 100-мегабитная ссылка) 1 ГБ трафика, не передавая через него никаких данных. Следовательно, планировщик не будет использоваться.
FWIW, гораздо проще использовать планировщик netem для того, что вы тестируете, вместо tbf. netem предназначен для того, чтобы делать именно то, что вы пытаетесь сделать. Но в вашем случае это все равно не сработает.
Есть очень грязный прием, который я использовал для тестов с двумя интерфейсами. Допустим, у вас есть eth0 и eth1:
Затем вы можете пропинговать 10.0.0.2, и это приведет к выходу из eth0 и повторному входу в eth1. После этого вы можете добавить желаемый qdisc в соответствующий интерфейс и запустить тесты.