Я использую tc с ядром 2.6.38.8 для формирования трафика. Ограничение пропускной способности работает, добавление задержки работает, но при формировании обеих пропускных способностей с задержкой достигнутая пропускная способность всегда намного ниже предела, если предел> 1,5 Мбит / с или около того.
Пример:
tc qdisc del dev usb0 root
tc qdisc add dev usb0 root handle 1: tbf rate 2Mbit burst 100kb latency 300ms
tc qdisc add dev usb0 parent 1:1 handle 10: netem limit 2000 delay 200ms
Дает задержку (от ping) 201 мс, но пропускная способность всего 1,66 Мбит / с (от iperf). Если убрать задержку, пропускная способность будет ровно 2 Мбит / с. Если я укажу пропускную способность 1 Мбит / с и RTT 200 мс, все будет работать. Я также пробовал ipfw / dummynet, который дает аналогичные результаты.
Я пробовал использовать пересборку ядра с HZ = 1000 в Kconfig - это не устранило проблему. Другие идеи?
Представьте, что вы пытаетесь проехать ровно 55 миль в час, если бы у вас была задержка в одну секунду между нажатием на педаль акселератора и моментом, когда машина разгоняется. Вам будет довольно сложно это сделать.
И у вас будет хотя бы то преимущество, что вы знать вам нужно ехать 55 миль в час. А теперь представьте, что вы этого не знаете. Итак, что происходит, когда вы едете со скоростью более 55 миль в час, вас останавливают и вам приходится снова ускоряться, не имея представления, на какой скорости вы собираетесь остановиться.
Вы, черт побери, не в среднем 55, не так ли?
То же самое и здесь. Стек TCP не знает, что он ограничен 2 МБ / с, и должен попытаться найти этот предел. А задержка означает, что он не может быстро реагировать на информацию о том, что он достиг своего предела. Поскольку из-за жесткого ограничения скорость никогда не может превышать 2 Мбит / с, его среднее значение будет меньше.
Вы можете улучшить это с помощью burst
и / или minburst
настройки. По сути, они позволяют подключению немного превышать свой предел, если он ниже своего предела. Таким образом, в некоторых случаях скорость передачи данных будет немного выше 2 Мбит / с, и в этом случае средняя скорость будет ближе к 2 Мбит / с.