为什么 NIC 环参数未按其硬件最大能力预设?

Cra*_*bit 7 networking nic ethtool

检查网卡环形缓冲区:

# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX:        4096
RX Mini:      0
RX Jumbo:     0
TX:        4096
Current hardware settings:
RX:         256
RX Mini:      0
RX Jumbo:     0
TX:         256
Run Code Online (Sandbox Code Playgroud)

人们可以将“RX/TX”设置为“预设最大值”中显示的限制,例如:

# ethtool -G eth0 rx 4096 rx 4096
Run Code Online (Sandbox Code Playgroud)

问题是:默认情况下;为什么这些设置如此低(在我拥有的每台服务器中,它们都为 256)而不是更高的值或其硬件最大功能?增加这些值是否有任何缺点(如果有的话?)?

Pet*_*bin 8

首先,您设置的数字并不像许多人想象的那样以字节为单位,而是以描述符为单位(并且描述符大小取决于硬件)。因此,当您增加环长度时,您会请求在内核中为这些描述符分配更多内存。一般来说,您希望该内核内存位于 L1 缓存中,以便中断处理尽可能快。增加戒指尺寸会降低这种可能性,在某些情况下甚至完全不可能。

接下来是中断合并 - 一般来说,当您增加环形缓冲区大小时,NIC 将适当调整其低/高标记,并在缓冲更多数据时(频率较低)触发中断。因此,内核在中断处理期间处理这些大量数据所需的时间也会增加。

所有上述结果都会产生简单的桶效应 - 环越大,丢包概率就会降低,网络延迟就会增加。如果您通过 TCP 传输大文件,这可能完全没问题,但如果您是低延迟小数据包应用程序(即游戏等),则可能完全不受欢迎。

您看到的默认数字是两者之间的合理权衡。