我正在阅读有关如何在 Linux 中实现 TCP 拥塞变体的内容。每个变体都作为单独的模块实现。
当我读到这个问题时:向 Linux Ubuntu 添加 TCP 拥塞控制变体
我知道可以使用 modprobe 加载该变体。
这是否意味着当 lsmod 运行时,TCPcubic 必须显示为默认加载?当我运行 lsmod 时,我找不到与拥塞控制相关的加载模块。 lsmod 下是否列出了特定类型的内核模块?
答案1
有一个问题需要解决,并对这个特定情况(拥塞)进行一些澄清。
A内核模块是内核的一部分,是可选的,不必在内核初始启动时出现,也不必在以后出现(如果不需要)。这是一种插入。这允许按需提供大多数功能,而无需使用从未使用过的内存。大多数模块可以编译为模块或内置。如果是内置的,则意味着您将找不到.ko
模块文件,因为它已经存在于初始内核中。
您可以检查做了什么:
通过了解配置选项(此处
CONFIG_TCP_CONG_CUBIC
),访问所使用的配置(通常作为 中的文件)/boot/config-$(uname -r)
,并验证使用了什么选项:grep CONFIG_TCP_CONG_CUBIC /boot/config-$(uname -r)
或者通过了解模块名称并检查该模块是否在内置模块列表中:
fgrep tcp_cubic.ko /lib/modules/$(uname -r)/modules.builtin
由于您没有找到该模块,因此您的情况的可能结果示例,但对于立方体可能的默认值,这可能意味着它是内置的:
$ grep _CUBIC /boot/config-$(uname -r)
CONFIG_TCP_CONG_CUBIC=y
CONFIG_DEFAULT_CUBIC=y
$ fgrep tcp_cubic.ko /lib/modules/$(uname -r)/modules.builtin
kernel/net/ipv4/tcp_cubic.ko
因此,这回答了问题:考虑一下您始终加载该模块,因为它是内置的。内置默认值是有意义的(通常是必需的)。
/lib/modules/$(uname -r)
您可能希望在其中某处找到并显示的内置模块文件列表,lsmod
但您不会,可以使用cat /lib/modules/$(uname -r)/modules.builtin
.它们并不特殊,但(由您的 Linux 发行版)经常(但并非总是)选择它们,因为必须在选项列表中选择默认值才能内置,包括所有相关的模块依赖项。
现在需要澄清一点:当然,必须加载(或内置)模块才能使用其功能。但你链接的问答并没有说你仅有的必须加载 TCP 拥塞模块才能激活它。引用:
要尝试其中之一,您需要使用 modprobe -a tcp_westwood 或任何您想要的方式安装它。然后你可以使用这个来测试它
echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control
由于此伪文件是读/写的,因此您只需查询它即可了解正在使用什么拥塞,结果可能如下:
$ cat /proc/sys/net/ipv4/tcp_congestion_control
cubic
现在改变算法:
# lsmod | grep tcp_westwood
# echo westwood > /proc/sys/net/ipv4/tcp_congestion_control
# lsmod | grep tcp_westwood
tcp_westwood 16384 1
该模块已自动加载并且正在使用(某些系统可能不会自动加载)。
无论如何,此特定情况的足够信息位于/proc/sys/net/ipv4/tcp_congestion_control
,而不是lsmod
的输出中。