Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

9.3. 配置工具

Red Hat Enterprise Linux 提供了很多工具来协助管理员配置系统。本节概述了可用的工具,并提供了有关如何使用它们来解决 Red Hat Enterprise Linux 7 中网络相关性能问题的示例。
但是,务必要记住,网络性能问题有时是硬件故障或基础架构故障造成的。红帽强烈建议您在使用这些工具调优网络堆栈之前验证您的硬件和基础架构是否按预期工作。
此外,与重新配置网络子系统相比,更改应用可以更好地解决一些网络性能问题。通常最好将应用配置为执行频繁的 posix 调用,即使这意味着在应用空间中排队数据,因为这允许根据需要灵活存储数据并交换出内存。

9.3.1. 网络性能调优配置集

Tuned 服务提供多个不同配置集,以便在多个特定用例中提高性能。以下配置文件对于提高网络性能非常有用:
  • latency-performance
  • network-latency
  • network-throughput
有关这些配置集的详情请参考 第 A.5 节 “tuned-adm”

9.3.2. 配置硬件缓冲器

如果硬件缓冲区丢弃了大量数据包,则存在许多潜在的解决方案。
减慢输入流量
过滤传入流量,减少加入的多播组数量,或减少广播流量以降低队列填充的速度。有关如何过滤传入流量的详情,请查看 Red Hat Enterprise Linux 7 安全指南。有关多播组的详情,请查看 Red Hat Enterprise Linux 7 集群文档。有关广播流量的详情,请查看 Red Hat Enterprise Linux 7 系统管理员指南,或与您要配置的设备相关的文档。
调整硬件缓冲区队列的大小
通过增大队列的大小来减少丢弃的数据包数量,使其不会像轻松地溢出。您可以使用 ethtool 命令修改网络设备的 rx/tx 参数:
# ethtool --set-ring devname value
更改队列的排空率
设备权重指的是设备一次可以接收的数据包数(在一个计划的处理器访问中)。您可以通过增加设备权重来增加排空队列的速度,这由 dev_weight 参数控制。可以通过更改 /proc/sys/net/core/dev_weight 文件的内容暂时更改此参数,也可以使用 sysctl (由 procps-ng 软件包提供)永久更改。
更改队列的排空率通常是降低网络性能的最简单方法。但是,增加设备一次接收的数据包数量会使用额外的处理器时间,在此期间无法调度其他进程,因此可能会导致其他性能问题。

9.3.3. 配置中断队列

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

9.3.3.1. 配置总线轮询

繁忙的轮询允许套接字层代码轮询网络设备的接收队列,并禁用网络中断,从而降低网络接收路径的延迟。这删除了中断和结果上下文切换造成的延迟。不过,它也会增加 CPU 利用率。忙碌轮询也会阻止 CPU 休眠,这可能会产生额外的功耗。
默认情况下禁用忙碌轮询。要在特定套接字上启用繁忙的轮询,请执行以下操作:
  • sysctl.net.core.busy_poll 设置为 0 以外的值。此参数控制在设备队列中等待数据包以进行套接字轮询并选择的微秒数。红帽建议值为 50
  • SO_BUSY_POLL 套接字选项添加到套接字。
要在全局范围内启用忙碌轮询,还必须将 sysctl.net.core.busy_read 设置为 0 以外的值。此参数控制等待设备队列中套接字读取的数据包的微秒数。它还设置 SO_BUSY_POLL 选项的默认值。对于少量插槽,红帽建议为 50,对于大量插槽,红帽建议值为 100。对于非常大的插槽(超过数百个),请使用 epoll
以下驱动程序支持忙碌轮询行为:Red Hat Enterprise Linux 7 也支持这些驱动程序。
  • bnx2x
  • be2net
  • ixgbe
  • mlx4
  • myri10ge
从红帽企业 Linux 7.1 开始,您还可以运行以下命令来检查特定的设备是否支持繁忙的轮询:
# ethtool -k device | grep "busy-poll"
如果此操作返回 busy-poll: on [fixed],则设备上提供忙碌轮询。

9.3.4. 配置套接字接收队列

如果分析表明数据包因为套接字队列的排空率太慢而被丢弃,则可以通过几种方法来缓解结果的性能问题。
降低传入流量的速度
通过在到达队列前过滤或丢弃数据包,或通过降低设备的权重来降低队列填充的速度。
增加应用的套接字队列的深度
如果套接字队列接收的突发流量有限,增加套接字队列的深度以匹配突发流量的大小可能会阻止数据包被丢弃。

9.3.4.1. 减少即将到来的交通量

过滤传入流量或降低网络接口卡的设备权重,以减慢传入的流量速度。有关如何过滤传入流量的详情,请查看 Red Hat Enterprise Linux 7 安全指南
设备权重指的是设备一次可以接收的数据包数(在一个计划的处理器访问中)。设备权重由 dev_weight 参数控制。可以通过更改 /proc/sys/net/core/dev_weight 文件的内容暂时更改此参数,也可以使用 sysctl (由 procps-ng 软件包提供)永久更改。

9.3.4.2. 增加队列拒绝

提高应用程序套接字队列的深度通常是提高套接字队列排空率的最简单方法,但不太可能是长期解决方案。
要增大队列的深度,请通过以下更改之一增加套接字接收缓冲的大小:
增加 /proc/sys/net/core/rmem_default 的值
此参数控制套接字使用的接收缓冲区的默认大小。这个值必须小于或等于 /proc/sys/net/core/rmem_max 的值。
使用 setsockopt 配置更大的 SO_RCVBUF 值
此参数控制套接字接收缓冲区的最大字节大小。使用 getsockopt 系统调用来确定缓冲区的当前值。如需更多信息,请参阅 socket(7) 手册页。

9.3.5. 配置接收扩展(RSS)

接收扩展(RSS)(也称为多队列接收)可在多个基于硬件的接收队列之间分发网络接收处理,允许多个 CPU 处理入站网络流量。RSS 可用于减轻因单个 CPU 过载导致的接收中断处理方面的瓶颈,并降低网络延迟。
要确定您的网络接口卡是否支持 RSS,请检查多个中断请求队列是否与 /proc/interrupts 中的接口关联。例如,如果您对 p1p1 接口感兴趣:
# egrep 'CPU|p1p1' /proc/interrupts
   CPU0    CPU1    CPU2    CPU3    CPU4    CPU5
89:   40187       0       0       0       0       0   IR-PCI-MSI-edge   p1p1-0
90:       0     790       0       0       0       0   IR-PCI-MSI-edge   p1p1-1
91:       0       0     959       0       0       0   IR-PCI-MSI-edge   p1p1-2
92:       0       0       0    3310       0       0   IR-PCI-MSI-edge   p1p1-3
93:       0       0       0       0     622       0   IR-PCI-MSI-edge   p1p1-4
94:       0       0       0       0       0    2475   IR-PCI-MSI-edge   p1p1-5
前面的输出显示 NIC 驱动程序为 p1p1 接口创建了 6 个接收队列(p1p1-0p1p1-5)。它还显示每个队列处理了多少个中断,以及服务中断的 CPU。在这种情况下,有 6 个队列,因为默认情况下,这个特定 NIC 驱动程序会为每个 CPU 创建一个队列,此系统具有 6 个 CPU。在 NIC 驱动程序中,这是相当常见的模式。
另外,您可以在载入网络驱动程序后检查 ls -1 /sys/devicesAttr/device_pci_address/msi_irqs 的输出。例如,如果您对带有 PCI 地址 0000:01:00.0 的设备感兴趣,您可以使用以下命令列出该设备的中断请求队列:
# ls -1 /sys/devices/*/*/0000:01:00.0/msi_irqs
101
102
103
104
105
106
107
108
109
默认启用 RSS。RSS 的队列(或应处理网络活动的 CPU)数量在适当的网络设备驱动程序中配置。对于 bnx2x 驱动程序,它在 num_queues 中配置。对于 sfc 驱动程序,它在 rss_cpus 参数中配置。无论如何,它通常都在 /sys/class/net/设备/queues/queues/rx-queue 中配置,其中 device 是网络设备的名称(如 eth1), rx-queue 是适当的接收队列的名称。
在配置 RSS 时,红帽建议将队列数量限制为每个物理 CPU 内核一个队列。超线程通常在分析工具中作为单独的核心来表示,但为所有核心(如超线程)配置队列并不对网络性能有用。
启用后,RSS 根据每个 CPU 的处理量在可用 CPU 之间均匀分配网络处理。但是,您可以使用 ethtool --show-rxfh-indir--set-rxfh-indir 参数修改网络活动的分布方式,并将某些类型的网络活动视为比其他更重要。
irqbalance 守护进程可以与 RSS 结合使用,以减少跨节点内存传输和缓存行退回的可能性。这降低了处理网络数据包的延迟。

9.3.6. 配置接收数据包控制(RPS)

接收数据包声明(RPS)与 RSS 类似,因为它用于将数据包定向到特定的 CPU 以进行处理。但是,RPS 在软件级别上实施,有助于防止单个网络接口卡的硬件队列成为网络流量的瓶颈。
与基于硬件的 RSS 相比,RPS 具有几个优点:
  • RPS 可以和任何网络接口卡一起使用。
  • 可以在 RPS 中添加软件过滤器,以处理新协议。
  • RPS 不会增加网络设备的硬件中断率。然而,它确实引入了处理器间中断。
RPS 会针对每个网络设备和接收队列进行配置,在 /sys/class/net/设备/queues/rx-queue/rps_cpus 文件中,其中 device 是网络设备的名称(如 eth0),rx-queue 是适当的接收队列的名称(如 rx-0)。
rps_cpus 文件的默认值为 0。这会禁用 RPS,因此处理网络中断的 CPU 也处理数据包。
要启用 RPS,请使用应处理指定网络设备的数据包和接收队列的 CPU 配置适当的 rps_cpus 文件。
rps_cpus 文件使用以逗号分隔的 CPU 位映射。因此,要允许 CPU 处理接口上接收队列的中断,请将它们在位图中的位置值设置为 1。例如,要处理 CPU 0、1、2 和 3 的中断,请将 rps_cpus 的值设置为 f,这是 15 的十六进制值。在二进制表示中,15 为 00001111 (1+2+4+8)。
对于具有单传输队列的网络设备,可以通过将 RPS 配置为使用同一内存域中的 CPU 来实现最佳性能。在非 NUMA 系统上,这意味着可以使用所有可用的 CPU。如果网络中断率非常高,除处理网络中断的 CPU 外,也可以提高性能。
对于具有多个队列的网络设备,配置 RPS 和 RSS 时通常没有好处,因为 RSS 被配置为默认将 CPU 映射到每个接收队列。但是,如果硬件队列比 CPU 少,并且 RPS 配置为在同一内存域中使用 CPU,则 RPS 可能仍然很有用。

9.3.7. 配置接收流(RFS)

接收流速(RFS)扩展 RPS 行为,以提高 CPU 缓存命中率,从而减少网络延迟。当 RPS 仅根据队列长度转发数据包时,RFS 使用 RPS 后端来计算最合适的 CPU,然后根据使用数据包的应用程序的位置转发数据包。这提高了 CPU 缓存效率。
默认情况下禁用 RFS。要启用 RFS,您必须编辑两个文件:
/proc/sys/net/core/rps_sock_flow_entries
将此文件的值设置为预期的并发活跃连接的最大数量。我们推荐在服务器负载中取 32768。输入的所有值在实践中均被舍入到 2 最接近的指数。
/sys/class/net/device/queues/rx-queue/rps_flow_cnt
使用您要配置的 网络设备 的名称替换 device (例如 eth0)和 rx-queue 替换为您要配置的接收队列(例如 rx-0)。
将此文件的值设置为 rps_sock_flow_entries 的值,其中 N 是设备上接收队列的数量。例如,如果 rps_flow_entries 设为 32768,并且有 16 个配置的接收队列,则 rps_flow_cnt 应设置为 2048。对于单队列设备,rps_flow_cnt 的值与 rps_sock_flow_entries 的值相同。
从单个发送器接收的数据不会发送到多个 CPU。如果单个发送方收到的数据量大于单个 CPU 可处理的数据量,请配置更大的帧大小以减少中断数量,从而减少 CPU 处理工作的数量。或者,考虑 NIC 卸载选项 或更快速的 CPU。
考虑将 numactltaskset 与 RFS 结合使用,以将应用固定到特定的内核、插槽或 NUMA 节点。这有助于防止数据包被不按顺序处理。

9.3.8. 配置加速的 RFS

加快 RFS 通过添加硬件辅助来提升 RFS 速度。与 RFS 一样,数据包根据使用数据包的应用程序的位置进行转发。但与传统的 RFS 不同,数据包直接发送到使用数据的线程本地的 CPU:执行应用的 CPU 或缓存层次结构中该 CPU 本地的 CPU。
只有满足以下条件时,加速的 RFS 才可用:
  • 加速的 RFS 必须由网络接口卡支持。导出 ndo_rx_flow_steer() netdevice 功能的卡支持加速 RFS。
  • 必须启用 ntuple 过滤。
满足这些条件后,根据传统的 RFS 配置自动停用 CPU 到队列映射。也就是说,CPU 到队列映射将根据驱动程序为每个接收队列配置的 IRQ 影响而降低。有关配置传统 RFS 的详情,请参阅 第 9.3.7 节 “配置接收流(RFS)”
红帽建议使用 RFS 最多使用加速的 RFS,且网络接口卡支持硬件加速。