我对为 TCP 拥塞控制设置 fq_pie 队列规则非常感兴趣。如果我写入 net.core.default_qdisc = fq_pie
,/etc/sysctl.d/90-override.conf
它应该在最新的内核上启用 fq_pie 。
不过它确实可以在我的桌面上运行。但在我的笔记本电脑上:
$ 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
可以看出我有 2 个 wifi 适配器。我的笔记本电脑内置了一个,它是 Qualcomm Atheros (ath10k),fq_pie 无法在此激活。
然而,fq_pie 可以在 TP Link (RTL8188EUS) 适配器上激活。
我还尝试了另外 2 台笔记本电脑(戴尔和惠普),集成 WiFi 适配器实际上并未运行 fq_pie。
有没有办法强制激活 Qualcomm Atheros 和其他 WiFi 适配器的 fq_pie?
系统详细信息:
$ 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
答案1
它似乎net.core.default_qdisc
会在加载时影响接口驱动程序。如果更改之前加载了内核模块net.core.default_qdisc
,则不会影响之后的更改。有些接口有行为改变:多队列接口将保留mq
,但它们的叶子继承此默认值。罗或者韦斯不会获得任何默认队列。
如果您想确保 sysctl 在驱动程序之前更改,您可以:
是否在 initramfs 脚本中进行了更改(可能需要进行一些调整),
从内核命令行加载它。这个问答告诉任何人都有可能随意的仅限系统控制从内核 5.8 开始,您正在使用的。所以理论上你可以在引导参数中添加一些东西(可能在 GRUB 的 GRUB_CMDLINE_LINUX 中)然后忘记它:
sysctl.net.core.default_qdisc=fq_pie
但实际上这仅适用于内置驱动程序。它不太可能是
sch_fq_pie
内置编译的。延迟驱动程序的加载
wlp1s0
(我不知道在哪里执行此操作)rmmod ath10k
因此modprobe ath10k
应用新的默认值。
无论如何,要立即更改接口的 qdisc,只需定义其 qdisc,这将覆盖默认的内核 qdisc,该内核 qdisc 具有保留的句柄0:
。例如:
tc qdisc add dev wlp1s0 handle 1: root fq_pie