31.3. 忙碌轮询

如果分析揭示了高延迟,则您的系统可能会受益于基于轮询的,而不是中断的数据包接收。

忙碌轮询有助于降低网络接收路径中的延迟,方法是允许套接字层代码轮询网络设备的接收队列,并禁用网络中断。这会删除由中断和结果上下文切换造成的延迟。但是,它还会增加 CPU 利用率。忙碌的轮询也可以防止 CPU 处于睡眠状态,从而造成额外的电源消耗。所有设备驱动程序支持忙碌轮询行为。

其他资源

31.3.1. 启用忙碌轮询

默认情况下,忙碌的轮询被禁用。这个步骤描述了如何启用忙碌的轮询。

流程

  1. 确定启用了 CONFIG_NET_RX_BUSY_POLL 编译选项:

    # cat /boot/config-$(uname -r) | grep CONFIG_NET_RX_BUSY_POLL
    CONFIG_NET_RX_BUSY_POLL=y
  2. 启用忙碌轮询

    1. 要在特定套接字上启用忙碌轮询,将 sysctl.net.core.busy_poll 内核值设置为 0 以外的值:

      # echo "net.core.busy_poll=50" > /etc/sysctl.d/95-enable-busy-polling-for-sockets.conf
      # sysctl -p /etc/sysctl.d/95-enable-busy-polling-for-sockets.conf

      此参数控制在套接字轮询上等待数据包的微秒数,然后选择 syscalls。红帽建议值为 50

    2. SO_BUSY_POLL 套接字选项添加到套接字。
    3. 要在全局范围内启用忙碌轮询,将 sysctl.net.core.busy_read 设置为 0 以外的值:

      # echo "net.core.busy_read=50" > /etc/sysctl.d/95-enable-busy-polling-globally.conf
      # sysctl -p /etc/sysctl.d/95-enable-busy-polling-globally.conf

      net.core.busy_read 参数控制设备队列中等待套接字读取的数据包的微秒数。它还设置 SO_BUSY_POLL 选项的默认值。对于少量插槽,红帽建议使用值 50,对于大量插槽,红帽推荐值 100。对于大量插槽(例如超过几百个),请改为使用 epoll 系统调用。

其他资源