检查网卡环形缓冲区:
# 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
可以将“RX/TX”设置为“预设最大值”中显示的限制,例如:
# ethtool -G eth0 rx 4096 rx 4096
问题是:默认情况下;为什么这些设置如此之低(在我拥有的每台服务器中,它们都是 256)而不是更高的值,或者它们的硬件最大能力?增加这些值是否有任何缺点(如果是,那么?)?
首先,您设置的数字不像许多人认为的那样以字节为单位,而是以描述符为单位(并且描述符的大小取决于硬件)。因此,当您增加环长度时,您请求在内核中为这些描述符分配更多内存。通常,您希望将此内核内存放在 L1 高速缓存中,以便尽可能快地处理中断。增加戒指尺寸会降低这种可能性,在某些情况下是完全不可能的。
接下来是中断合并 - 通常,当您增加环形缓冲区大小时,NIC 将适当调整其低/高标记,并在缓冲更多数据时触发中断(即不太频繁)。结果,内核在中断处理期间处理这些大量数据所需的时间也会增加。
以上所有导致了一个简单的桶效应——随着较大的环丢包概率降低,网络延迟增加。如果您通过 TCP 流式传输大文件,这可能非常好,如果您是低延迟小数据包应用程序(即游戏等),则可能完全不受欢迎。
您看到的默认数字是两者之间的合理权衡。