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

Linux HTB: никогда не достигается более 70% максимальной скорости

Задний план:-

У меня есть система на основе руки, в которой есть настройка HTB на интерфейсе eth и wlan. Вот конфигурация HTB: -

tc class add dev eth1 parent 1:1 classid 1:1 htb rate 1Gbit ceil 1Gbit burst 18000b cburst 18000b
tc class add dev eth1 parent 1:1 classid 1:a100 htb rate 60Mbit ceil 60Mbit burst 18000b cburst 18000b
tc class add dev eth1 parent 1:a100 classid 1:10f htb rate 100Kbit ceil 60Mbit burst 18000b cburst 18000b
tc class add dev eth1 parent 1:10f classid 1:100 htb rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b prio 3
tc class add dev eth1 parent 1:10f classid 1:101 htb rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b prio 2
tc class add dev eth1 parent 1:10f classid 1:102 htb rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b prio 1
tc class add dev eth1 parent 1:10f classid 1:103 htb rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b prio 0

Вот там графическое представление: -

+---(1:1) htb rate 1Gbit ceil 1Gbit burst 18000b cburst 18000b 
     |    Sent 200796370 bytes 152179 pkt (dropped 0, overlimits 0 requeues 0) 
     |    rate 0bit 0pps backlog 0b 0p requeues 0 
     |
     +---(1:54) htb prio 2 rate 50Mbit ceil 1Gbit burst 18000b cburst 18000b 
     |          Sent 2521539 bytes 19693 pkt (dropped 0, overlimits 0 requeues 0) 
     |          rate 0bit 0pps backlog 0b 0p requeues 0 
     |     
     +---(1:a100) htb rate 60Mbit ceil 60Mbit burst 18000b cburst 18000b 
          |       Sent 198274831 bytes 132486 pkt (dropped 0, overlimits 0 requeues 0) 
          |       rate 0bit 0pps backlog 0b 0p requeues 0 
          |
          +---(1:10f) htb rate 100Kbit ceil 60Mbit burst 18000b cburst 18000b 
               |      Sent 198274831 bytes 132486 pkt (dropped 0, overlimits 0 requeues 0) 
               |      rate 0bit 0pps backlog 0b 0p requeues 0 
               |
               +---(1:101) htb prio 2 rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b 
               |           Sent 198208856 bytes 132155 pkt (dropped 82134, overlimits 0 requeues 0) 
               |           rate 0bit 0pps backlog 0b 0p requeues 0 
               |     
               +---(1:100) htb prio 3 rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b 
               |           Sent 64079 bytes 299 pkt (dropped 0, overlimits 0 requeues 0) 
               |           rate 0bit 0pps backlog 0b 0p requeues 0 
               |     
               +---(1:103) htb prio 0 rate 25Kbit ceil 100Kbit burst 18000b cburst 18000b 
               |           Sent 630 bytes 7 pkt (dropped 0, overlimits 0 requeues 0) 
               |           rate 0bit 0pps backlog 0b 0p requeues 0 
               |     
               +---(1:102) htb prio 1 rate 25Kbit ceil 60Mbit burst 18000b cburst 18000b 
                           Sent 1266 bytes 25 pkt (dropped 0, overlimits 0 requeues 0) 
                           rate 0bit 0pps backlog 0b 0p requeues 0

Проблема: я всегда достигаю только 70% (макс.) Скорости потока даже с iperf UDP-трафиком в локальной сети, с 60 Мбит / с в качестве предела восходящего и нисходящего канала, я едва получаю 40 Мбит / с. Из приведенного выше графика вы можете видеть, что classid 1: 101 (класс данных) имеет много сброшенных пакетов, я пытаюсь понять, почему это происходит, поскольку у него не должны закончиться токены при обеспечении пропускной способности ниже потолка. ставка.

Edit-1: вот обрезанный вывод qdisc tc -s -s -d q ls dev eth1

qdisc htb 1: root refcnt 5 r2q 10 default 54 direct_packets_stat 0 ver 3.17 direct_qlen 64000
 Sent 370545050 bytes 354529 pkt (dropped 86336, overlimits 443788 requeues 0) 
 backlog 0b 0p requeues 0
qdisc pfifo 101: parent 1:101 limit 10p
 Sent 356446201 bytes 252349 pkt (dropped 86263, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0

Пожалуйста, дайте мне знать, если для отладки потребуется дополнительная информация.

Вы должны проверить очередь нижнего слоя этого конечного класса.

В выводе статистики вы видите потерянные пакеты, но без превышения лимита. Это означает, что у вас нет превышения пропускной способности в этом классе.

Если вы не настроили листовую очередь явно, вероятно, у вас есть очередь pfifo (очередь по умолчанию) с ограниченной глубиной очереди. По умолчанию глубина очереди pfifo равна длине очереди tx интерфейса нижнего уровня. Похоже, что очередь pfifo иногда переполняется, и превышенные пакеты отбрасываются.

Как отладить и исправить:

  • Проверьте очереди (qdisc-s) интерфейса. К сожалению, я не знаю команды для извлечения информации об отдельном qdisc (нет ничего подобного tc q disc get ...), поэтому проверьте полный вывод tc -s -s -d q ls dev eth1 команда.
  • Проверить статистику дочерней очереди класса 1: 101.
  • Попробуйте увеличить эту глубину очереди с помощью явной конфигурации: tc q add dev eth1 parent 1:101 handle 101: <qdisc_type> limit <queue_depth>.
  • Еще лучше использовать какой-нибудь честный или / или красный qdisc, например sfq чтобы избежать голодания потока.