暂停帧是适配器和交换机端口之间的以太网级流量控制。当RX或TX缓冲器变满时,适配器将发送“暂停帧”。开关将以毫秒级或更小的时间间隔停止数据流动。这通常足以允许内核排出接口缓冲区,从而防止缓冲区溢出和随后的数据包丢弃或超限。理想地,交换机将在暂停时间期间缓冲输入数据。然而,重要的是认识到这种级别的流控制仅在开关和适配器之间。如果丢弃分组,则较高层(例如TCP)或者在UDP和/或多播的情况下的应用应当启动恢复。需要在NIC和交换机端口上启用暂停帧和流控制,以使此功能生效。有关如何在端口上启用流量控制的说明,请参阅您的网络设备手册或供应商。
在此示例中,禁用流量控制:
# ethtool -a eth3 Pause parameters for eth3:
Autonegotiate:off
RX: off
TX: off
开启流量控制:
# ethtool -A eth3 rx on
# ethtool -A eth3 tx on
要确认流量控制已启用:
# ethtool -a eth3 Pause parameters for eth3:
Autonegotiate:off
RX: on
TX: on
Interrupt Coalescence (IC)
中断聚合是指在发出硬中断之前,网络接口将接收的流量或接收流量后经过的时间。中断太快或太频繁会导致系统性能不佳,因为内核停止(或“中断”)正在运行的任务以处理来自硬件的中断请求。中断太晚可能导致流量没有足够快地从NIC中取出。更多的流量可能到达,覆盖以前的流量仍然等待被接收到内核中,导致流量丢失。大多数现代的NIC和驱动程序支持IC,许多驱动程序允许驱动程序自动调节硬件产生的中断数。 IC设置通常包括2个主要组件,时间和数据包数量。时间是在中断内核之前NIC将等待的微秒数(u-sec),并且数字是在中断内核之前允许在接收缓冲器中等待的最大数据包数。 NIC的中断聚合可以使用ethtool -c ethX命令查看,并使用ethtool -C ethX命令进行调整。自适应模式使卡能够自动调节IC。在自适应模式下,驱动程序将检查流量模式和内核接收模式,并在运行中估计合并设置,以防止数据包丢失。当接收到许多小数据包时,这是有用的。更高的中断聚结有利于带宽超过延迟。 VOIP应用(等待时间敏感)可能需要比文件传输协议(吞吐量敏感)少的聚结。不同品牌和型号的网络接口卡具有不同的功能和默认设置,因此请参阅适配器和驱动程序的制造商文档。
在此系统上,默认启用自适应RX:
# ethtool -c eth3 Coalesce parameters for eth3:
Adaptive RX: on TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 400000
pkt-rate-high: 450000
rx-usecs: 16
rx-frames:44
rx-usecs-irq: 0
rx-frames-irq: 0
以下命令关闭自适应IC,并通知适配器在接收到任何流量后立即中断内核:
# ethtool -C eth3 adaptive-rx off rx-usecs 0 rx-frames 0
比较理想的设置是允许至少一些分组在NIC中缓冲,并且在中断内核之前至少有一些时间通过。 有效范围可以从1到数百,取决于系统能力和接收的流量
The Adapter Queue
netdev_max_backlog是Linux内核中的队列,其中流量在从NIC接收之后但在由协议栈(IP,TCP等)处理之前存储。 每个CPU核心有一个积压队列。 给定核心的队列可以自动增长,包含的数据包数量可达netdev_max_backlog设置指定的最大值。 netif_receive_skb()内核函数将为数据包找到相应的CPU,并将数据包排入该CPU的队列。 如果该处理器的队列已满并且已达到最大大小,则将丢弃数据包。 要调整此设置,首先确定积压是否需要增加。 / proc / net / softnet_stat文件在第2列中包含一个计数器,该值在netdev backlog队列溢出时递增。 如果此值随时间增加,则需要增加netdev_max_backlog。
softnet_stat文件的每一行代表一个从CPU0开始的CPU内核:
第一列是中断处理程序接收的帧数。 第2列是由于超过netdev_max_backlog而丢弃的帧数。 第三列是ksoftirqd跑出netdev_budget或CPU时间的次数。
其他列可能会根据版本Red Hat Enterprise Linux而有所不同。 使用以下示例,CPU0和CPU1的以下计数器是前两行:
# cat softnet_stat