Mocno włącz fq_pie

Oct 18 2020

Jestem bardzo zainteresowany ustawieniem dyscypliny kolejki fq_pie do kontroli przeciążenia TCP. Jeśli napiszę net.core.default_qdisc = fq_piedo /etc/sysctl.d/90-override.conf, powinno to włączyć fq_pie na najnowszych jądrach.

Jednak działa na moim komputerze. Ale na moim laptopie:

$ tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2 
qdisc noqueue 0: dev wlp1s0 root refcnt 2 
qdisc mq 0: dev wlp0s20f0u3 root 
qdisc fq_pie 0: dev wlp0s20f0u3 parent :4 limit 10240p flows 1024 target 15ms tupdate 16ms alpha 2 beta 20 quantum 1514b memory_limit 32Mb ecn_prob 10 
qdisc fq_pie 0: dev wlp0s20f0u3 parent :3 limit 10240p flows 1024 target 15ms tupdate 16ms alpha 2 beta 20 quantum 1514b memory_limit 32Mb ecn_prob 10 
qdisc fq_pie 0: dev wlp0s20f0u3 parent :2 limit 10240p flows 1024 target 15ms tupdate 16ms alpha 2 beta 20 quantum 1514b memory_limit 32Mb ecn_prob 10 
qdisc fq_pie 0: dev wlp0s20f0u3 parent :1 limit 10240p flows 1024 target 15ms tupdate 16ms alpha 2 beta 20 quantum 1514b memory_limit 32Mb ecn_prob 10

Jak widać, posiadam 2 adaptery wifi. Jeden jest wbudowany w mój laptop, którym jest Qualcomm Atheros (ath10k), fq_pie nie może być aktywowany na tym.

Jednak fq_pie można aktywować na adapterze TP Link (RTL8188EUS).

Wypróbowałem także 2 więcej laptopów (Dell i HP), zintegrowany adapter Wi-Fi w rzeczywistości nie działa fq_pie.

Czy istnieje sposób na wymuszenie aktywacji fq_pie w Qualcomm Atheros i innych adapterach Wi-Fi?

Szczegóły systemu:

$ cat /proc/version
Linux version 5.8.12-xanmod1-1 (makepkg@archlinux) (gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35) #1 SMP PREEMPT Wed, 30 Sep 2020 14:19:49 +0000

$ ip -V ip utility, iproute2-v5.7.0-77-gb687d1067169 $ tc -V
tc utility, iproute2-v5.7.0-77-gb687d1067169

Odpowiedzi

1 A.B Oct 19 2020 at 02:01

Wygląda net.core.default_qdiscna to, że wpływa na sterownik interfejsu po załadowaniu. Jeśli moduł jądra został załadowany wcześniej, net.core.default_qdisczostał zmieniony, później nie będzie to miało na niego wpływu. Niektóre interfejsy mają zmienione zachowanie : interfejsy wielokolejkowe zachowają, mqale ich liście dziedziczą to ustawienie domyślne. lo lub veth nie otrzyma żadnej domyślnej kolejki.

Jeśli chcesz mieć pewność, że sysctl zostanie zmieniony przed sterownikiem, możesz:

  • czy zmieniono to w skryptach initramfs (prawdopodobnie potrzebne są pewne poprawki),

  • załaduj go z jądra cmdline. To pytanie / odpowiedź mówi, że jest to możliwe dla dowolnego sysctl tylko od jądra 5.8 , którego używasz. Więc teoretycznie mógłbyś dodać coś takiego do parametrów bootowania (prawdopodobnie w GRUB_CMDLINE_LINUX) i zapomnieć o tym:

    sysctl.net.core.default_qdisc=fq_pie
    

    ale w rzeczywistości jest to możliwe tylko dla wbudowanych sterowników. Jest bardzo mało prawdopodobne, że sch_fq_piezostał skompilowany jako wbudowany.

  • opóźnij ładowanie sterownika o wlp1s0(nie wiedziałbym, gdzie to zrobić)

  • rmmod ath10ka modprobe ath10kwięc nowy domyślny dotyczy.

W każdym razie, aby natychmiast zmienić kolejkę interfejsu, po prostu zdefiniuj jej kolejkę, która zastąpi domyślną kolejkę jądra, która ma zarezerwowane dojście 0:. Na przykład:

tc qdisc add dev wlp1s0 handle 1: root fq_pie