网络故障排除和性能调优
大约 67 分钟
网络故障排除和性能调优
来源:官方文档 原始多页入口:网络故障排除和性能调优 内容规模:约 58,981 字符,65 个章节标题,177 个命令/代码块,28 条提示框
阅读提要
- 副标题:调试和解决网络问题
- 摘要:调优网络设置是一个复杂的进程,有很多因素需要考虑。例如,这包括 CPU 到内存架构、CPU 核数等。Red Hat Enterprise Linux 使用针对大多数场景优化的默认设置。然而,在某些情况下,有必要调优网络设置,以提高吞吐量或延迟或解决问题,如数据包丢弃。
- 主要章节:调试和解决网络问题;对红帽文档提供反馈;第 1 章 调优网络适配器设置;第 2 章 调优 IRQ 平衡;第 3 章 调整设备驱动程序和 NIC;第 4 章 配置网络适配器卸载设置;第 5 章 以太网网络的流控制;第 6 章 在 NetworkManager 连接配置文件中配置 ethtool 设置;第 7 章 改善网络延迟;第 8 章 调优中断合并设置;第 9 章 提高大量连续数据流的吞吐量;第 10 章 为高吞吐量调优 TCP 连接
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
调试和解决网络问题
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 调优网络适配器设置
- 要点:在 40 Gbps 及更快的高速网络中,一些与网络适配器相关的内核设置的默认值可能是数据包丢弃和性能降低的原因。调优这些设置可能会阻止此类问题发生。
1.1. 使用 nmcli 增加环缓冲区的大小,以减少该数据包丢弃率
- 要点:如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。
- 要点:接收环缓冲在设备驱动程序和网络接口控制器(NIC)之间共享。该卡分配一个传输(TX)和接收(RX)环缓冲。名称意味着,环缓冲是循环缓冲区,溢出会覆盖现有数据。可以通过两种方法将数据从 NIC 移至内核,硬件中断和软件中断也称为 SoftIRQ。
- 列表:显示接口的数据包丢包统计信息: # ethtool -S enp1s0 ... rx_queue_0_drops: 97326 rx_queue_1_drops: 63783 ... 请注意,命令的输出取决于网卡和驱动程序。 discard 或 drop 计数器中的高值表示可用缓冲区的填满速度快于内核可以处理数据包的速度。增加环缓冲有助于避免此类丢失。
- 列表:显示最大环缓冲大小: # ethtool -g enp1s0 Ring parameters for enp1s0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 16320 TX: 4096 Current hardware settings: RX: 255 RX Mini: 0 RX Jumbo: 0 TX: 255 如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分的值,您可以在下一步中更改设置。
- 列表:确定使用接口的 NetworkManager 连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
- 列表:更新连接配置文件,并增加环缓冲: 要增加 RX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-rx 4096 要增加 TX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-tx 4096
- 列表:要增加 RX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-rx 4096
- 列表:要增加 TX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-tx 4096
- 命令/配置摘录:
# ethtool -S enp1s0 ... rx_queue_0_drops: 97326 rx_queue_1_drops: 63783 ...
# ethtool -g enp1s0 Ring parameters for enp1s0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 16320 TX: 4096 Current hardware settings: RX: 255 RX Mini: 0 RX Jumbo: 0 TX: 255- 注意:重要 根据 NIC 使用的驱动程序,环缓冲中的更改可能会短暂中断网络连接。
1.2. 增加环缓冲区大小,以使用 network RHEL 系统角色降低高数据包丢弃率
- 要点:如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。
- 要点:环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(TX)和接收(RX)环缓冲区。接收环缓冲区在设备驱动程序和网络接口控制器(NIC)之间共享。数据可以通过硬件中断或软件中断(也称为 SoftIRQ)从 NIC 移到内核。
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:您知道设备支持的最大环缓冲区大小。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connection…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 命令/配置摘录:
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: ring: rx: 4096 tx: 4096 state: up
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:警告 您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
1.3. 调优网络设备积压队列以避免数据包丢弃
- 要点:当网卡接收数据包并在内核协议堆栈处理它们之前,内核会将这些数据包存储在积压队列中。内核为每个 CPU 核维护一个单独的队列。
- 要点:如果核的积压队列满了,则内核会丢弃将来 netif_receive_skb() 内核函数分配给此队列的所有传入的数据包。如果服务器包含 10 Gbps 或更快的网络适配器或多个 1 Gbps 适配器,请调优积压队列大小,以避免此问题发生。
- 列表:一个 10 Gbps 或更快或多个 1 Gbps 网络适配器
- 列表:确定是否需要调整积压队列,显示 /proc/net/softnet_stat 文件中的计数器: # awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 18862 0 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ... 此 awk 命令将 /proc/net/softnet_stat 中的值从十六进制转换为十进制格式,并以…
- 列表:第一列:收到的总帧数
- 列表:第二列:由于积压队列满了而丢弃的帧数
- 列表:最后一列:CPU 核数
- 列表:如果 /proc/net/softnet_stat 文件的第二列中的值随着时间而递增,请增加积压队列的大小: 显示当前积压队列大小: # sysctl net.core.netdev_max_backlog net.core.netdev_max_backlog = 1000 使用以下内容创建 /etc/sysctl.d/10-netdev_max_backlog.conf 文件: net.core.netdev_max_backlog = 2000 将 net.core.netdev_max_backlog 参数设置为当前值的两倍。 从 /etc/sysctl.d/10-netdev_max_backlog.conf 文件中载入…
- 命令/配置摘录:
# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 18862 0 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...
# sysctl net.core.netdev_max_backlog net.core.netdev_max_backlog = 10001.4. 增加 NIC 的传输队列长度,以减少传输错误数
- 要点:内核在传输数据包前,将它们存储在传输队列中。默认队列长度(1000 数据包)通常足以满足 10 Gbps 网络。但是,在更快的网络中,或者遇到适配器上传输错误数增加,请增加队列长度。
- 要点:流程
- 列表:显示当前传输队列长度: # ip -s link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 ... 在本例中,enp1s0 接口的传输队列长度(qlen)是 1000。
- 列表:监控网络接口的软件传输队列丢弃的数据包计数: # tc -s qdisc show dev enp1s0 qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 Sent 16889923 bytes 426862765 pkt (dropped 191980, overlimits 0 requeues 2) ...
- 列表:如果您遇到较高或不断增加的传输错误计数,请设置更高的传输队列长度: 识别使用此接口的 NetworkManager 连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0 更新连接配置文件,并增加传输队列长度: # nmcli connection modify Example-Connection link.tx-queue-length 2000 将队列长度设置为当前值的两倍。 应用更改: # nmcli connection up …
- 列表:识别使用此接口的 NetworkManager 连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
- 列表:更新连接配置文件,并增加传输队列长度: # nmcli connection modify Example-Connection link.tx-queue-length 2000 将队列长度设置为当前值的两倍。
- 列表:应用更改: # nmcli connection up Example-Connection
- 命令/配置摘录:
# ip -s link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 ...
# tc -s qdisc show dev enp1s0 qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 Sent 16889923 bytes 426862765 pkt (dropped 191980, overlimits 0 requeues 2) ...第 2 章 调优 IRQ 平衡
- 要点:在多核主机上,您可以通过确保 Red Hat Enterprise Linux 平衡中断队列(IRQ)来在 CPU 核之间分发中断来提高性能。
2.1. 中断和中断处理程序
- 要点:要排除性能问题,了解计算机如何管理任务并响应事件。这个过程依赖于中断,向 CPU 发送信号来处理紧急任务,并中断处理程序,它们是处理这些请求的特定例程。
- 要点:当网络接口控制器(NIC)接收传入数据时,它会使用直接内存访问(DMA)将数据复制到内核缓冲区中。然后,NIC 通过触发一个硬中断来向内核通知此数据。这些中断是由中断处理程序处理的,这些处理程序只做最少的工作,因为它们已中断了另一个任务,处理程序不能中断自己。硬中断在 CPU 使用率方面可能代价高昂,特别是在使用内核锁时。
- 命令/配置摘录:
# grep -E "CPU|enp1s0" /proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 105: 141606 0 0 0 0 0 IR-PCI-MSI-edge enp1s0-rx-0 106: 0 141091 0 0 0 0 IR-PCI-MSI-edge enp1s0-rx-1 107: 2 0 163785 0 0 0 IR-PCI-MSI-edge enp1s0-rx-2 108: 3 0 0 194370 0 0 IR-PCI-MSI-edge enp1s0-rx-3 109: 0 0 0 0 0 0 IR-PCI-MSI-edge enp1s0-tx2.2. 软件中断请求
- 要点:软件中断请求(SoftIRQ)清除网络适配器的接收环缓冲。当其他任务没有中断时,内核会调度 SoftIRQ 例行程序运行。在 RHEL 中,名为 ksoftirqd/cpu-number 的进程运行这些例程并调用特定于驱动程序的代码功能。
- 要点:要监控每个 CPU 内核的 SoftIRQ 计数,请输入:
- 命令/配置摘录:
# watch -n1 'grep -E "CPU|NET_RX|NET_TX" /proc/softirqs' CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 NET_TX: 49672 52610 28175 97288 12633 19843 18746 220689 NET_RX: 96 1615 789 46 31 1735 1315 4707982.3. NAPI 轮询
- 要点:新的 API (NAPI)扩展设备驱动程序数据包处理框架。它提高了传入网络数据包的效率。
- 要点:硬中断非常昂贵。它们会导致上下文从内核空间切换到用户空间,然后再切换。它们无法中断自身。即使具有中断合并,中断处理程序也使用整个 CPU 内核。使用 NAPI 时,驱动程序可以使用轮询模式。对于每个数据包,内核不会难以中断。
2.4. irqbalance 服务
- 要点:在具有和不具有非统一内存访问(NUMA)架构的系统上,irqbalance 服务根据系统状况有效地平衡跨 CPU 核的中断。
- 要点:irqbalance 服务在后台运行,每 10 秒监控一次 CPU 负载。当 CPU 的负载过高时,服务会将中断移到其他 CPU 核。因此,该系统表现良好,并更有效地处理负载。
- 列表:我们是否需要 irqbalance?(红帽知识库)
- 列表:如何配置网络接口 IRQ 通道?(红帽知识库)
- 命令/配置摘录:
# systemctl enable --now irqbalance- 注意:重要 禁用 irqbalance 可能会对网络吞吐量造成负面影响。
2.5. 增加 SoftIRQ 可在 CPU 上运行的时间
- 要点:如果 SoftIRQ 没有运行足够长时间,则传入数据的速度可能会超过内核快速排空缓冲区的能力。因此,网络接口控制器(NIC)缓冲区溢出,数据包丢失。
- 要点:如果 softirqd 进程无法在一个 NAPI 轮询周期中检索来自接口的所有数据包,则表示 SoftIRQ 没有足够的 CPU 时间。这种情况可能出现在具有快速 NIC 的主机上,如 10 Gbps 和更快。如果您增加了 net.core.netdev_budget 和 net.core.netdev_budget_usecs 内核参数的值,则您可以控制 softirqd 在一个轮询周期内处理数据包的时间和数量。
- 列表:要确定是否需要调整 net.core.netdev_budget 参数,请显示 /proc/net/softnet_stat 文件中的计数: # awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 0 20380 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ... 此 awk 命令将 /proc/net/softnet_s…
- 列表:第一列:收到的总帧数。
- 列表:第三列: softirqd 进程无法从一个 NAPI 轮询周期中检索所有数据包的次数。
- 列表:最后一列:CPU 核号。
- 列表:如果 /proc/net/softnet_stat 文件的第三列中的计数随着时间而递增,请调优系统: 显示 net.core.netdev_budget_usecs 和 net.core.netdev_budget 参数的当前值: # sysctl net.core.netdev_budget_usecs net.core.netdev_budget net.core.netdev_budget_usecs = 2000 net.core.netdev_budget = 300 使用这些设置,softirqd 进程在一个轮询周期内最多有 2000 微秒来处理最多 300 个来自 NIC 的消息。轮询根据首先满足哪个条件而结束。 使…
- 列表:显示 net.core.netdev_budget_usecs 和 net.core.netdev_budget 参数的当前值: # sysctl net.core.netdev_budget_usecs net.core.netdev_budget net.core.netdev_budget_usecs = 2000 net.core.netdev_budget = 300 使用这些设置,softirqd 进程在一个轮询周期内最多有 2000 微秒来处理最多 300 个来自 NIC 的消息。轮询根据首先满足哪个条件而结束。
- 命令/配置摘录:
# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 0 20380 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...
# sysctl net.core.netdev_budget_usecs net.core.netdev_budget net.core.netdev_budget_usecs = 2000 net.core.netdev_budget = 300第 3 章 调整设备驱动程序和 NIC
- 要点:在 RHEL 中,内核模块为网络接口控制器(NIC)提供驱动程序。这些模块支持调优和优化设备驱动程序及 NIC 的参数。
- 要点:例如,如果驱动程序支持延迟接收中断的生成,您可以降低相应参数的值,以避免耗尽接收描述符。
- 注意:注意 并非所有模块都支持自定义参数,功能依赖于硬件,以及驱动程序和固件版本。
3.1. 配置自定义 NIC 驱动程序参数
- 要点:许多内核模块支持调优驱动程序和网络接口控制器(NIC)的设置参数。您可以根据硬件和驱动程序自定义设置。
- 要点:先决条件
- 列表:已在主机上安装了 NIC 。
- 列表:为 NIC 提供驱动程序的内核模块支持所需的调优功能。
- 列表:您在本地登录或使用与您要更改参数所使用的驱动程序不同的网络接口。
- 列表:确定驱动程序: # ethtool -i enp0s31f6 driver: e1000e version: ... firmware-version: ... ... 请注意,某些功能可能需要特定的驱动程序和固件版本。
- 列表:显示内核模块的可用参数: # modinfo -p e1000e ... SmartPowerDownEnable:Enable PHY smart power down (array of int) parm:RxIntDelay:Receive Interrupt Delay (array of int) 有关参数的详情,请查看内核模块的文档。有关 RHEL 中的模块,请参阅 kernel-doc 软件包提供的 /usr/share/doc/kernel-doc-<version>/Documentation/networking/device_drivers/ 目录中的文档。
- 列表:创建 /etc/modprobe.d/nic-parameters.conf 文件,并为模块指定参数: options <module_name> <parameter1>=<value> <parameter2>=<value> 例如,要启用端口节能机制,并将接收中断的产生设置为 4 个单元,请输入: options e1000e SmartPowerDownEnable=1 RxIntDelay=4
- 命令/配置摘录:
# ethtool -i enp0s31f6 driver: e1000e version: ... firmware-version: ... ...
# modinfo -p e1000e ... SmartPowerDownEnable:Enable PHY smart power down (array of int) parm:RxIntDelay:Receive Interrupt Delay (array of int)- 注意:重要 如果您在内核模块上设置了参数,RHEL 会将这些设置应用到所有使用这个驱动程序的设备。
- 注意:警告 卸载活跃网络接口使用的模块会立即终止连接,您可以将自己锁定在服务器之外。
第 4 章 配置网络适配器卸载设置
- 要点:要减少 CPU 负载,某些网络适配器使用卸载功能,其将网络绑定负载移到网络接口控制器(NIC)。
- 要点:例如,使用 Encapsulating Security Payload(ESP)卸载时,NIC 执行 ESP 操作来加快 IPsec 连接,并减少 CPU 负载。
- 列表:临时禁用卸载功能以进行故障排除。
- 列表:当特定功能对您的主机造成负面影响时,永久禁用卸载功能。
4.1. 临时设置卸载功能
- 要点:如果您预计卸载功能会导致问题或降低主机的性能,您可以通过临时启用或禁用它来尝试缩小原因范围,具体取决于其当前状态。
- 要点:如果您临时启用或禁用了卸载功能,它会在下次重启时返回之前的值。
- 列表:网卡支持卸载功能。
- 列表:显示接口的可用卸载功能及其当前状态: # ethtool -k enp1s0 ... esp-hw-offload: on ntuple-filters: off rx-vlan-filter: off [fixed] ... 输出取决于硬件及其驱动程序的能力。请注意,您无法更改标记为 [fixed] 的功能状态。
- 列表:临时禁用卸载功能: # ethtool -K <interface> <feature> <on|off> 例如,要在 enp10s0u1 接口上临时禁用 IPsec Encapsulating Security Payload (ESP)卸载,请输入: # ethtool -K enp10s0u1 esp-hw-offload off 例如,要在 enp10s0u1 接口上临时启用加速的 Receive Flow Steering (aRFS)过滤,请输入: # ethtool -K enp10s0u1 ntuple-filters on
- 列表:例如,要在 enp10s0u1 接口上临时禁用 IPsec Encapsulating Security Payload (ESP)卸载,请输入: # ethtool -K enp10s0u1 esp-hw-offload off
- 列表:例如,要在 enp10s0u1 接口上临时启用加速的 Receive Flow Steering (aRFS)过滤,请输入: # ethtool -K enp10s0u1 ntuple-filters on
- 列表:显示卸载功能的状态: # ethtool -k enp1s0 ... esp-hw-offload: off ntuple-filters: on ...
- 命令/配置摘录:
# ethtool -k enp1s0 ... esp-hw-offload: on ntuple-filters: off rx-vlan-filter: off [fixed] ...
# ethtool -K <interface> <feature> <on|off>4.2. 永久设置卸载功能
- 要点:如果您已确定了在主机上限制性能的特定卸载功能,您可以永久启用或禁用它,具体取决于其当前状态。
- 要点:如果您永久启用或禁用了卸载功能,则 NetworkManager 确保在重启后该功能仍然具有此状态。
- 列表:您确定了特定的卸载功能来在主机上限制性能。
- 列表:识别使用您要更改卸载功能状态的网络接口上的连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0 ...
- 列表:永久更改卸载功能的状态: # nmcli connection modify <connection_name> <feature> <on|off> 例如,要在 Example 连接配置文件中永久禁用 IPsec Encapsulating Security Payload (ESP)卸载,请输入: # nmcli connection modify Example ethtool.feature-esp-hw-offload off 例如,要在 Example 连接配置文件中永久启用 accelerated Receive Flow Steering (aRFS)过滤,请输入: # nmcli connection modif…
- 列表:例如,要在 Example 连接配置文件中永久禁用 IPsec Encapsulating Security Payload (ESP)卸载,请输入: # nmcli connection modify Example ethtool.feature-esp-hw-offload off
- 列表:例如,要在 Example 连接配置文件中永久启用 accelerated Receive Flow Steering (aRFS)过滤,请输入: # nmcli connection modify Example ethtool.feature-ntuple on
- 列表:重新激活连接配置文件: # nmcli connection up Example
- 命令/配置摘录:
# nmcli connection show NAME UUID TYPE DEVICE Example a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0 ...
# nmcli connection modify <connection_name> <feature> <on|off>第 5 章 以太网网络的流控制
- 要点:在以太网链路上,持续数据传输可能会填充缓冲区,并导致网络拥塞。如果发送者的速率超过接收方的处理容量,则可能会因为交换机端口较低的数据处理容量而发生数据包丢失。
- 要点:流控制机制管理以太网链路之间的数据传输,其中每个发送方和接收方都有不同的发送和接收能力。为避免数据包丢失,以太网流控制机制会临时暂停数据包传输,以便管理交换机端口的高传输率。请注意,交换机不会转发交换机端口之外的暂停帧。
- 列表:什么是网络链接流控制,以及它是如何在 Red Hat Enterprise Linux 中工作的?(红帽知识库)
- 命令/配置摘录:
# ethtool --show-pause enp1s0 Pause parameters for enp1s0: ... RX: on TX: on ...- 注意:注意 以太网链接的任一端都可以向另一个端发送暂停帧。如果网络接口的接收缓冲区已满,则网络接口会将暂停帧发送到交换机端口。类似,当交换机端口的接收缓冲区已满时,交换机端口会向网络接口发送暂停帧。
第 6 章 在 NetworkManager 连接配置文件中配置 ethtool 设置
- 要点:NetworkManager 可以永久配置某些网络驱动程序和硬件设置。与使用 ethtool 工具管理这些设置相比,这有重启后不会丢失设置的好处。
- 要点:您可以在 NetworkManager 连接配置文件中设置以下 ethtool 设置:
- 列表:用于接收队列的 rx
- 列表:用于传输队列的 tx
- 列表:用于链路中断或单个根输入/输出虚拟化(SR-IOV)协调的 other
- 列表:用于基于硬件容量的多用途渠道的 combined
6.1. 使用 nmcli 配置 ethtool 卸载功能
- 要点:您可以使用 NetworkManager 来在连接配置文件中启用和禁用 ethtool 卸载功能。
- 要点:流程
- 列表:例如:要启用 RX 卸载特性,并在 enp1s0 连接配置文件中禁用 TX 卸载,请输入: # nmcli con modify enp1s0 ethtool.feature-rx on ethtool.feature-tx off 这个命令明确启用 RX 卸载并禁用 TX 卸载功能。 有关您可以配置的设置的列表,请查看您系统上 nm-settings-nmcli (5) 手册页中的 ethtool 设置 部分。
- 列表:要删除之前启用或禁用的卸载功能的设置,请将功能的参数设置为 null 值。例如,要删除 TX 卸载的配置,请输入: # nmcli con modify enp1s0 ethtool.feature-tx ""
- 列表:重新激活网络配置集: # nmcli connection up enp1s0
- 列表:使用 ethtool -k 命令显示网络设备的当前卸载特性: # ethtool -k network_device
- 命令/配置摘录:
# nmcli con modify enp1s0 ethtool.feature-rx on ethtool.feature-tx off
# nmcli con modify enp1s0 ethtool.feature-tx ""6.2. 使用 network RHEL 系统角色配置 ethtool 卸载功能
- 要点:您可以使用 network RHEL 系统角色自动配置 TCP 卸载引擎(TOE),来将某些操作卸载到网络接口控制器。TOE 提高了网络吞吐量。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and offload features ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and offload features ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: features: gro: no gso: yes tx_sctp_segmentation: no state: up
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:警告 您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
6.3. 使用 nmcli 配置 ethtool 合并设置
- 要点:您可以使用 NetworkManager 来在连接配置文件中设置 ethtool 合并设置。
- 要点:流程
- 列表:例如,要在 enp1s0 连接配置文件中将接收的数据包的最大数量设置为延迟到 128,请输入: # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames 128 有关您可以配置的设置的列表,请查看您系统上 nm-settings-nmcli (5) 手册页中的 ethtool 设置 部分。
- 列表:要删除 coalesce 设置,请将其设置为 null 值。例如,要删除 ethtool.coalesce-rx-frames 设置,请输入: # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames ""
- 列表:重新激活网络配置集: # nmcli connection up enp1s0
- 列表:使用 ethtool -c 命令显示网络设备的当前卸载特性: # ethtool -c <network_device>
- 命令/配置摘录:
# nmcli connection modify enp1s0 ethtool.coalesce-rx-frames 128
# nmcli connection modify enp1s0 ethtool.coalesce-rx-frames ""6.4. 使用 network RHEL 系统角色配置 ethtool 合并设置
- 要点:中断合并收集网络数据包,并为多个数据包生成一个中断。这可减少中断负载并最大化吞吐量。您可以使用 network RHEL 系统角色在 NetworkManager 连接配置文件中自动配置这些设置。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and coalesce settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - nam…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings and coalesce settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: coalesce: rx_frames: 128 tx_frames: 128 state: up
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:警告 您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
6.5. 使用 nmcli 增加环缓冲区的大小,以减少该数据包丢弃率
- 要点:如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。
- 要点:接收环缓冲在设备驱动程序和网络接口控制器(NIC)之间共享。该卡分配一个传输(TX)和接收(RX)环缓冲。名称意味着,环缓冲是循环缓冲区,溢出会覆盖现有数据。可以通过两种方法将数据从 NIC 移至内核,硬件中断和软件中断也称为 SoftIRQ。
- 列表:显示接口的数据包丢包统计信息: # ethtool -S enp1s0 ... rx_queue_0_drops: 97326 rx_queue_1_drops: 63783 ... 请注意,命令的输出取决于网卡和驱动程序。 discard 或 drop 计数器中的高值表示可用缓冲区的填满速度快于内核可以处理数据包的速度。增加环缓冲有助于避免此类丢失。
- 列表:显示最大环缓冲大小: # ethtool -g enp1s0 Ring parameters for enp1s0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 16320 TX: 4096 Current hardware settings: RX: 255 RX Mini: 0 RX Jumbo: 0 TX: 255 如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分的值,您可以在下一步中更改设置。
- 列表:确定使用接口的 NetworkManager 连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
- 列表:更新连接配置文件,并增加环缓冲: 要增加 RX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-rx 4096 要增加 TX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-tx 4096
- 列表:要增加 RX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-rx 4096
- 列表:要增加 TX 环缓冲区,请输入: # nmcli connection modify Example-Connection ethtool.ring-tx 4096
- 命令/配置摘录:
# ethtool -S enp1s0 ... rx_queue_0_drops: 97326 rx_queue_1_drops: 63783 ...
# ethtool -g enp1s0 Ring parameters for enp1s0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 16320 TX: 4096 Current hardware settings: RX: 255 RX Mini: 0 RX Jumbo: 0 TX: 255- 注意:重要 根据 NIC 使用的驱动程序,环缓冲中的更改可能会短暂中断网络连接。
6.6. 增加环缓冲区大小,以使用 network RHEL 系统角色降低高数据包丢弃率
- 要点:如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。
- 要点:环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(TX)和接收(RX)环缓冲区。接收环缓冲区在设备驱动程序和网络接口控制器(NIC)之间共享。数据可以通过硬件中断或软件中断(也称为 SoftIRQ)从 NIC 移到内核。
- 列表:您已准备好控制节点和受管节点。
- 列表:以可在受管主机上运行 playbook 的用户登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:您知道设备支持的最大环缓冲区大小。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connection…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 命令/配置摘录:
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes ethtool: ring: rx: 4096 tx: 4096 state: up
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:警告 您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
6.7. 使用 nmcli配置 ethtool 频道设置
- 要点:ethtool 工具处理与设备的 IRQ 通信。它管理频道设置。使用 nmcli 在 NetworkManager 中配置 ethtool 设置。
- 要点:流程
- 列表:显示与网络设备关联的渠道: # ethtool --show-channels enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 4 TX: 3 Other: 10 Combined: 63 Current hardware settings: RX: 1 TX: 1 Other: 1 Combined: 1
- 列表:更新网络接口的渠道设置: # nmcli connection modify enp1s0 ethtool.channels-rx 4 ethtool.channels-tx 3 ethtool.channels-other 9 ethtool.channels-combined 50
- 列表:重新激活网络配置集: # nmcli connection up enp1s0
- 列表:检查与网络设备关联的更新的渠道设置: # ethtool --show-channels enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 4 TX: 3 Other: 10 Combined: 63 Current hardware settings: RX: 4 TX: 3 Other: 9 Combined: 50
- 命令/配置摘录:
# ethtool --show-channels enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 4 TX: 3 Other: 10 Combined: 63 Current hardware settings: RX: 1 TX: 1 Other: 1 Combined: 1
# nmcli connection modify enp1s0 ethtool.channels-rx 4 ethtool.channels-tx 3 ethtool.channels-other 9 ethtool.channels-combined 50第 7 章 改善网络延迟
- 要点:CPU 电源管理功能可能会在时间敏感的应用程序中导致不必要的延迟。您可以禁用一些或所有这些电源管理功能,以改善网络延迟。
- 要点:例如,如果延迟在服务器空闲时比负载过重时高,则 CPU 电源管理设置可能会影响延迟。
- 注意:重要 禁用 CPU 电源管理功能可能会导致更高的功耗和热损失。
7.1. CPU 电源状态如何影响网络延迟
- 要点:CPU 的消耗状态(C-states)优化并减少计算机的功耗。
- 要点:C-states 从 C0 开始编号。在 C0 中,处理器完全开机且处于活动状态。在 C1 中,处理器完全开机,但是空闲的。C-state 的值越大,CPU 关闭的组件越多。
- 命令/配置摘录:
Pkg(HW) | Core(HW) | CPU(OS) 0 CPU(OS) 4 | | C0 active 2.5% 2.2% | | POLL 0.0% 0.0 ms 0.0% 0.1 ms | | C1 0.1% 0.2 ms 0.0% 0.1 ms C2 (pc2) 63.7% | | C3 (pc3) 0.0% | C3 (cc3) 0.1% | C3 0.1% 0.1 ms 0.1% 0.1 ms C6 (pc6) 0.0% | C6 (cc6) 8.3% | C6 5.2% 0.6 ms 6.0% 0.6 ms C7 (pc7) 0.0% | C7 (cc7) 76.6% | C7s 0.0% 0.0 ms 0.0% 0.0 ms C8 (pc8) 0.0% | | C8 6.3% 0.9 ms 5.8% 0.8 ms C9 (pc9) 0.0% | | C9 0.4% 3.7 ms 2.2% 2.2 ms C10 (pc10) 0.0% | | | | C10 80.8% 3.7 ms 79.4% 4.4 ms | | C1E 0.1% 0.1 ms 0.1% 0.1 ms ...7.2. EFI 固件中的 C-state 设置
- 要点:在大多数带有 EFI 固件的系统中,您可以启用和禁用单个消耗状态(C-states)。但是,在 RHEL 中,空闲驱动程序决定内核是否使用固件中的设置。
- 要点:这些驱动程序可用:
- 列表:intel_idle :这是具有 Intel CPU 的主机上的默认驱动程序,并忽略 EFI 固件中的 C-state 设置。
- 列表:acpi_idle :如果 intel_idle 被禁用了,RHEL 在具有来自 Intel 以外的厂商的 CPU 的主机上使用此驱动程序。默认情况下,acpi_idle 驱动程序使用 EFI 固件中的 C-state 设置。
7.3. 使用自定义 TuneD 配置文件禁用 C-states
- 要点:使用 TuneD 服务可防止管理员使用内核命令行参数硬编码最大 C-state 值。
- 要点:TuneD 服务使用内核的电源管理服务质量(PMQOS)接口来设置消耗状态(C-states)锁定。内核空闲驱动程序可以与此接口进行通信,以动态限制 C-states。
- 列表:tuned 软件包已安装。
- 列表:tuned 服务已启用并运行。
- 列表:显示活跃的配置文件: # tuned-adm active Current active profile: network-latency
- 列表:为自定义 TuneD 配置文件创建一个目录: # mkdir /etc/tuned/profiles/network-latency-custom
- 列表:使用以下内容创建 /etc/tuned/profiles/network-latency-custom/tuned.conf 文件: [main] include=network-latency [cpu] force_latency=cstate.id:1|2 此自定义配置文件从 network-latency 配置文件继承所有设置。force_latency TuneD 参数指定以微秒(µs)为单位的延迟。如果 C-state 延迟大于指定的值,则 Red Hat Enterprise Linux 中的空闲驱动程序会阻止 CPU 移到更高的 C-state。使用 force_latency=cstate.id:1|2,Tune…
- 列表:激活 network-latency-custom 配置集: # tuned-adm profile network-latency-custom
- 命令/配置摘录:
# tuned-adm active Current active profile: network-latency
# mkdir /etc/tuned/profiles/network-latency-custom7.4. 使用内核命令行选项禁用 C-states
- 要点:要测试主机上的应用程序延迟是否受 C-states 的影响,请在内核命令行选项中临时禁用消耗状态(C-state)。
- 要点:processor.max_cstate 和 intel_idle.max_cstate 内核命令行参数配置的最大 C-state CPU 内核可以使用。例如,将参数设置为 1 可确保 CPU 从请求 C-state 低于 C1。
- 列表:tuned 服务没有运行或配置为不更新 C-state 设置。
- 列表:显示系统使用的空闲驱动程序: # cat /sys/devices/system/cpu/cpuidle/current_driver intel_idle 有关驱动程序的详情,请查看 kernel-doc 软件包提供的 /usr/share/doc/kernel-doc-<version>/Documentation/admin-guide/pm/cpuidle.rst 文件。
- 列表:如果主机使用 intel_idle 驱动程序,请设置 intel_idle.max_cstate 内核参数来定义 CPU 内核可用的最高 C-state : # grubby --update-kernel=ALL --args="intel_idle.max_cstate=0" 设置 intel_idle.max_cstate=0 禁用 intel_idle 驱动程序。因此,内核使用 acpi_idle 驱动程序,该驱动程序使用 EFI 固件中设置的 C-state 值。因此,还要设置 processor.max_cstate 来覆盖这些 C-state 设置。
- 列表:在每个主机上,独立于 CPU 供应商,设置可用于 CPU 内核的最高 C-state: # grubby --update-kernel=ALL --args="processor.max_cstate=0" 重要 如果您除了设置 intel_idle.max_cstate=0 之外还设置了 processor.max_cstate=0,acpi_idle 驱动程序会覆盖 processor.max_cstate 的值,并将其设置为 1。因此,对于 processor.max_cstate=0 intel_idle.max_cstate=0,内核使用的最高 C-state 为 C1,而不是 C0。
- 列表:重启主机以使更改生效: # reboot
- 列表:显示最大 C-state : # cat /sys/module/processor/parameters/max_cstate 1
- 命令/配置摘录:
# cat /sys/devices/system/cpu/cpuidle/current_driver intel_idle
# grubby --update-kernel=ALL --args="intel_idle.max_cstate=0"- 注意:重要 如果您除了设置 intel_idle.max_cstate=0 之外还设置了 processor.max_cstate=0,acpi_idle 驱动程序会覆盖 processor.max_cstate 的值,并将其设置为 1。因此,对于 processor.max_cstate=0 intel_idle.max_cstate=0,内核使用的最高 C-state 为 C1,而不是 C0。
7.5. 使用线程 NAPI 忙碌轮询来提高接收性延迟一致性
- 要点:启用线程新 API (NAPI)忙碌轮询,通过使用专用内核线程持续轮询数据包来减少网络延迟。对于高性能工作负载,使用线程 NAPI 忙碌轮询,如 AF_XDP,其中可预测的子微秒响应时间至关重要。
- 要点:在标准 Linux 网络中,内核使用 interrupt 和软件中断请求(softirqs)来处理传入的数据包。这会引入非确定的延迟,因为 CPU 必须切换上下文才能处理这些中断。threaded NAPI 将此处理移到专用的内核线程中。通过启用忙碌轮询,这些线程在 CPU 上保持活动状态,并持续检查数据而不是休眠。这会删除 CPU 唤醒并稳定延迟的等待时间,因为运行 NAPI 线程的内核 100% 使用率高。
- 列表:主机运行 RHEL 10.2 或更高版本。
- 列表:主机有一个支持 NAPI 的网络接口控制器(NIC)。
- 列表:已安装 sysstat 和 kernel-tools 软件包。
- 列表:检查软件中断是否饱和性是主机上的瓶颈: 监控所有 CPU 内核的 softirqs,例如: # mpstat -P ALL 1 10:16:05 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:16:06 all 5,25 0,00 3,50 0,50 0,25 21,50 0,00 0,00 0,00 69,00 10:16:06 0 2,00 0,00 12,00 0,00 1,00 85,00 0,00 0,00 0,00 0,00 10:16:06 1 15,00 0,00 1,00 0,00 0,00 1,00 0,00 0,00 …
- 列表:监控所有 CPU 内核的 softirqs,例如: # mpstat -P ALL 1 10:16:05 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:16:06 all 5,25 0,00 3,50 0,50 0,25 21,50 0,00 0,00 0,00 69,00 10:16:06 0 2,00 0,00 12,00 0,00 1,00 85,00 0,00 0,00 0,00 0,00 10:16:06 1 15,00 0,00 1,00 0,00 0,00 1,00 0,00 0,00 0,00 83,00 ... 在本例中,…
- 列表:%soft (85%):指示内核在内核网络堆栈中的 softirq 数据包几乎耗尽了内核。
- 命令/配置摘录:
# mpstat -P ALL 1
10:16:05 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 10:16:06 all 5,25 0,00 3,50 0,50 0,25 21,50 0,00 0,00 0,00 69,00 10:16:06 0 2,00 0,00 12,00 0,00 1,00 85,00 0,00 0,00 0,00 0,00 10:16:06 1 15,00 0,00 1,00 0,00 0,00 1,00 0,00 0,00 0,00 83,00 ...第 8 章 调优中断合并设置
- 要点:中断合并是一种减少网卡产生的中断数的机制。通常,较少的中断可能会提高网络的延迟和整体性能。
- 要点:调优中断合并设置涉及调整其控制的参数:
- 列表:合并到单个中断的数据包数量。
- 列表:产生中断前的延迟。
- 注意:重要 最佳合并设置取决于特定的网络条件和在使用的硬件。因此,可能需要多次尝试查找最适合您的环境和需求的设置。
8.1. 为延迟或吞吐量敏感的服务优化 RHEL
- 要点:coalesce 调优旨在最小化给定工作负载的中断。在高吞吐量情形中,目的是在维护高数据率的同时尽可能使用几个中断。在低延迟情况下,可以使用更多中断来快速处理流量。
- 要点:您可以调整网卡上的设置,以增加或减少组合到单个中断的数据包数。因此,您可以提高流量的吞吐量或延迟。
- 列表:识别遇到瓶颈的网络接口: # ethtool -S enp1s0 NIC statistics: rx_packets: 1234 tx_packets: 5678 rx_bytes: 12345678 tx_bytes: 87654321 rx_errors: 0 tx_errors: 0 rx_missed: 0 tx_dropped: 0 coalesced_pkts: 0 coalesced_events: 0 coalesced_aborts: 0 识别在其名称中包含 drop、discard 或 error 数据包计数器。这些特定统计信息测量网络接口控制器(NIC)数据包缓冲区的实际数据包丢失,这…
- 列表:监控您在上一步中标识的数据包计数器的值。 将它们与网络的期望值进行比较,以确定任何特定接口是否遇到了瓶颈。网络瓶颈的一些常见迹象包括但不限于: 网络接口上的许多错误 高数据包丢失 网络接口的大量使用 注意 在识别网络瓶颈时,其他重要因素包括 CPU 使用率、内存使用率和磁盘 I/O。
- 列表:网络接口上的许多错误
- 列表:高数据包丢失
- 列表:网络接口的大量使用 注意 在识别网络瓶颈时,其他重要因素包括 CPU 使用率、内存使用率和磁盘 I/O。
- 列表:检查当前的中断合并设置: # ethtool -c enp1s0 Coalesce parameters for enp1s0: Adaptive RX: off Adaptive TX: off RX usecs: 100 RX frames: 8 RX usecs irq: 100 RX frames irq: 8 TX usecs: 100 TX frames: 8 TX usecs irq: 100 TX frames irq: 8 usecs 值指的是接收方或传送方在产生中断前等待的微秒数。 frames 值指的是接收方或传送方在产生中断前等待的帧数。 irq 值用于在网络接口已经处理中断时配置中断调…
- 命令/配置摘录:
# ethtool -S enp1s0 NIC statistics: rx_packets: 1234 tx_packets: 5678 rx_bytes: 12345678 tx_bytes: 87654321 rx_errors: 0 tx_errors: 0 rx_missed: 0 tx_dropped: 0 coalesced_pkts: 0 coalesced_events: 0 coalesced_aborts: 0
# ethtool -c enp1s0 Coalesce parameters for enp1s0: Adaptive RX: off Adaptive TX: off RX usecs: 100 RX frames: 8 RX usecs irq: 100 RX frames irq: 8 TX usecs: 100 TX frames: 8 TX usecs irq: 100 TX frames irq: 8- 注意:注意 在识别网络瓶颈时,其他重要因素包括 CPU 使用率、内存使用率和磁盘 I/O。
- 注意:注意 不是所有网络接口卡都支持报告和更改示例输出中的所有值。
第 9 章 提高大量连续数据流的吞吐量
- 要点:提高大型连续数据流吞吐量非常有益,因为它通过传输每个数据包的数据来减少开销。
- 要点:根据 IEEE 802.3 标准,没有 Virtual Local Area Network (VLAN)标签的默认以太网帧有1518 字节的最大大小。这些帧的每一个都包含一个 18 字节标头,给有效负载保留 1500 字节。因此,对于服务器通过网络传输的每个 1500 字节数据,18 字节(1.2%)以太网帧标头是开销,且也会被传输。第 3 层和 4 协议中的标头进一步增加了每个数据包的开销。
9.1. 配置巨型帧前的注意事项
- 要点:根据您网络中的硬件、应用程序和服务,巨型帧可能有不同的影响。仔细决定启用巨型帧是否能在您的场景中提供好处。
- 要点:巨型帧的先决条件:
- 列表:丢弃的数据包。
- 列表:由于碎片数据包,导致更高的延迟。
- 列表:增加了碎片导致的数据包丢失的风险。例如,如果路由器将一个 9000 字节帧划分为六个 1500 字节帧,且任何一个 1500 字节帧丢失了,则整个帧都丢失了,因为它无法重新组装。
- 列表:较高的吞吐量:每个帧包含更多的用户数据,而协议开销是固定的。
- 列表:较低的 CPU 使用率:巨型帧导致较少的中断,因此节省了 CPU 周期。
- 列表:较高的延迟:大型帧延迟后面的数据包。
9.2. 在现有 NetworkManager 连接配置文件中配置 MTU
- 要点:如果您的网络需要不同于默认的最大传输单元(MTU),您可以在相应的 NetworkManager 连接配置文件中配置此设置。
- 要点:巨型帧是有效负载在 1500 核 9000 字节之间的网络数据包。同一广播域中的所有设备都必须支持这些帧。
- 列表:广播域中的所有设备都使用相同的 MTU。
- 列表:您知道网络的 MTU。
- 列表:您已为具有发散 MTU 的网络配置了连接配置文件。
- 列表:可选:显示当前的 MTU: # ip link show ... 3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff ...
- 列表:可选:显示 NetworkManager 连接配置文件: # nmcli connection show NAME UUID TYPE DEVICE Example f2f33f29-bb5c-3a07-9069-be72eaec3ecf ethernet enp1s0 ...
- 列表:在管理到具有分散 MTU 的网络的连接的配置文件中设置 MTU : # nmcli connection modify Example mtu 9000
- 命令/配置摘录:
# ip link show ... 3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff ...
# nmcli connection show NAME UUID TYPE DEVICE Example f2f33f29-bb5c-3a07-9069-be72eaec3ecf ethernet enp1s0 ...第 10 章 为高吞吐量调优 TCP 连接
- 要点:在 Red Hat Enterprise Linux 上调优与 TCP 相关的设置以提高吞吐量、缩短延迟或防止诸如数据包丢失等问题。
10.1. 使用 iperf3 测试 TCP 吞吐量
- 要点:iperf3 工具提供了服务器和客户端模式,来在两个主机之间执行网络吞吐量测试。
- 要点:先决条件
- 列表:iperf3 软件包已安装在客户端和服务器上。
- 列表:任何一个主机上都没有其他服务导致对测试结果产生严重影响的网络流量。
- 列表:对于 40 Gbps 和更快的连接,网卡支持 Accelerated Receive Flow Steering(ARFS),且该功能在接口上已启用。
- 列表:可选:显示服务器和客户端上网络接口控制器(NIC)的最大网络速度: # ethtool enp1s0 | grep "Speed" Speed: 100000Mb/s
- 列表:在服务器上: 临时在 firewalld 服务中打开默认的 iperf3 TCP 端口 5201 : # firewall-cmd --add-port=5201/tcp 在服务器模式下启动 iperf3 : # iperf3 --server 服务现在等待传入的客户端连接。
- 列表:临时在 firewalld 服务中打开默认的 iperf3 TCP 端口 5201 : # firewall-cmd --add-port=5201/tcp
- 命令/配置摘录:
# ethtool enp1s0 | grep "Speed" Speed: 100000Mb/s
# firewall-cmd --add-port=5201/tcp- 注意:注意 应用程序的吞吐量取决于许多因素,如应用程序使用的缓冲区大小。因此,测试工具(如 iperf 3)测量的结果可能与生产工作负载下服务器上应用程序的测量结果有很大不同。
10.2. 系统范围的 TCP 套接字缓冲区设置
- 要点:套接字缓冲区临时存储内核收到或排队要发送的数据。
- 要点:存在以下缓冲:
- 列表:读套接字缓冲区保留内核已收到的,但应用程序尚未读取的数据包。
- 列表:写套接字缓冲区保留应用程序已写到缓冲区,但内核尚未传给 IP 堆栈和网络驱动程序的数据包。
- 列表:第一个值是最小缓冲区大小。新套接字不能有更小的大小。
- 列表:第二个值是默认的缓冲区大小。如果应用程序没有设置缓冲区大小,则这是默认值。
- 列表:第三个值是自动调优的缓冲区的最大大小。在应用程序中使用带有 SO_SNDBUF 套接字选项的 setsockopt() 函数可禁用这个最大缓冲区大小。
- 命令/配置摘录:
net.ipv4.tcp_rmem = 4096 131072 6291456 net.ipv4.tcp_wmem = 4096 16384 419430410.3. 增加系统范围的 TCP 套接字缓冲区
- 要点:系统范围的 TCP 套接字缓冲会临时存储内核已接收或排队的数据。net.ipv4.tcp_rmem (读取)和 net.ipv4.tcp_wmem (写入)套接字缓冲内核设置都包含三个设置:最小、默认和最大值。
- 要点:先决条件
- 列表:您遇到了大量的 TCP 数据包丢包率。
- 列表:确定连接的延迟。例如,从客户端 ping 服务器来测量平均 Round Trip Time (RTT): # ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 ms 在本例中,延迟为 17 ms。
- 列表:使用以下公式为您要调优的流量计算 Bandwidth Delay Product(BDP): connection speed in bytes * latency in seconds = BDP in bytes 例如,要计算有 17 ms 延迟的 10 Gbps 连接的 BDP : (10 * 1000 * 1000 * 1000 / 8) * 0.017 = 21,250,000 bytes
- 列表:根据您的要求,创建 /etc/sysctl.d/10-tcp-socket-buffers.conf 文件,并设置最大读或写缓冲区大小,或者两者: net.ipv4.tcp_rmem = 4096 262144 42500000 net.ipv4.tcp_wmem = 4096 262144 42500000 指定以字节为单位的值。当您尝试识别为您的环境优化的值时,请使用以下经验法则: 默认缓冲区大小(第二个值):仅稍微增加此值或将其最多设为 524288 (512 KiB)。太高的默认缓冲区大小可能会导致缓冲区崩溃,因此延迟激增。 最大缓冲区大小(第三个值):两到三倍 BDP 的值通常就足够了。
- 列表:默认缓冲区大小(第二个值):仅稍微增加此值或将其最多设为 524288 (512 KiB)。太高的默认缓冲区大小可能会导致缓冲区崩溃,因此延迟激增。
- 列表:最大缓冲区大小(第三个值):两到三倍 BDP 的值通常就足够了。
- 命令/配置摘录:
# ping -c 10 server.example.com ... --- server.example.com ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9014ms rtt min/avg/max/mdev = 17.208/17.056/19.333/0.616 ms
connection speed in bytes * latency in seconds = BDP in bytes- 注意:重要 设置太大的缓冲区大小浪费内存。每个套接字可以设置为应用程序请求的大小,内核会加倍这个值。例如,如果应用程序请求 256 KiB 套接字缓冲区大小,并打开 100 万个套接字,则系统只能将最多 512 GB RAM (512 KiB x 100万)用于潜在的套接字缓冲空间。 另外,最大缓冲区大小的值太大可能会增加延迟。
10.4. TCP 窗口扩展
- 要点:在 Red Hat Enterprise Linux 中默认启用的 TCP 窗口扩展功能是 TCP 协议的扩展,它显著提高了吞吐量。
- 要点:例如,在具有 1.5 ms Round Trip Time (RTT)的 1 Gbps 连接上:
- 列表:启用 TCP 窗口扩展后,大约 630 Mbps 是可行的。
- 列表:禁用 TCP 窗口扩展后,吞吐量会下降到 380 Mbps。
- 列表:在运行时配置内核参数
- 命令/配置摘录:
# sysctl net.ipv4.tcp_window_scaling net.ipv4.tcp_window_scaling = 110.5. TCP SACK 如何降低数据包丢弃率
- 要点:TCP 选择确认(TCP SACK)功能(在 RHEL 中默认启用)是 TCP 协议的增强,提高了 TCP 连接的效率。
- 要点:在 TCP 传输中,对于其接收的每个数据包,接收方都向发送方发送一个 ACK 数据包。例如,客户端向服务器发送 TCP 数据包 1-10,但数据包号 5 和 6 丢失了。如果没有 TCP SACK,服务器会丢弃数据包 7-10,客户端必须从丢失点重传所有数据包,这效率较低。如果两个主机上都启用了 TCP SACK,则客户端必须只重传丢失的数据包 5 和 6。
- 列表:我是否应该关注 0.05% 的数据包丢弃率?(红帽知识库)
- 列表:在运行时配置内核参数
- 命令/配置摘录:
# sysctl net.ipv4.tcp_sack 1- 注意:重要 禁用 TCP SACK 会降低性能,并在 TCP 连接中,在接收端造成很高的数据包丢弃率。
第 11 章 调优 UDP 连接
- 要点:为 UDP 吞吐量调优 RHEL 需要实际预期。与 TCP 不同,UDP 缺少功能,如流控制和拥塞控制。这使得实现与网络接口控制器(NIC)的最大速度接近的可靠通信和吞吐量变得困难。
11.1. 检测数据包丢弃
- 要点:网络堆栈中有多个级别,内核可以丢弃数据包。RHEL 提供了不同的工具来显示这些级别的统计信息。使用它们来识别潜在的问题。
- 要点:请注意,您可以忽略非常小的丢弃的数据包速率。但是,如果您遇到很高的速率,请考虑调优措施。
- 列表:识别特定于 UDP 协议的数据包丢弃,因为套接字缓冲区太小,或者应用程序处理速度太慢: # nstat -az UdpSndbufErrors UdpRcvbufErrors #kernel UdpSndbufErrors 4 0.0 UdpRcvbufErrors 45716659 0.0 输出中的第二列列出了计数。
- 列表:RHEL 网络接口丢弃数据包(红帽知识库)
- 列表:我是否应该关注 0.05% 的数据包丢弃率?(红帽知识库)
- 命令/配置摘录:
# nstat -az UdpSndbufErrors UdpRcvbufErrors #kernel UdpSndbufErrors 4 0.0 UdpRcvbufErrors 45716659 0.0- 注意:注意 如果网络堆栈无法处理传入的流量,则内核丢弃网络数据包。
11.2. 使用 iperf3 测试 UDP 吞吐量
- 要点:iperf3 工具提供了服务器和客户端模式,来在两个主机之间执行网络吞吐量测试。
- 要点:先决条件
- 列表:iperf3 软件包已安装在客户端和服务器上。
- 列表:两个主机上没有其他服务导致严重影响测试结果的网络流量。
- 列表:可选:您在服务器和客户端上增加了最大 UDP 套接字大小。详情请查看 增加系统范围的 UDP 套接字缓冲区。
- 列表:可选:显示服务器和客户端上网络接口控制器(NIC)的最大网络速度: # ethtool enp1s0 | grep "Speed" Speed: 10000Mb/s
- 列表:在服务器上: 显示最大 UDP 套接字读缓冲区大小,并记录此值: # sysctl net.core.rmem_max net.core.rmem_max = 16777216 显示的值以字节为单位。 在 firewalld 服务中临时打开默认的 iperf3 端口 5201 : # firewall-cmd --add-port=5201/tcp --add-port=5201/udp 请注意,iperf3 只在服务器上打开一个 TCP 套接字。如果客户端希望使用 UDP,它首先连接到此 TCP 端口,然后服务器在同一端口号上打开一个 UDP 套接字,以执行 UDP 流量吞吐量测试。因此,您必须在本地防火墙中为 TCP 和 UD…
- 列表:显示最大 UDP 套接字读缓冲区大小,并记录此值: # sysctl net.core.rmem_max net.core.rmem_max = 16777216 显示的值以字节为单位。
- 命令/配置摘录:
# ethtool enp1s0 | grep "Speed" Speed: 10000Mb/s
# sysctl net.core.rmem_max net.core.rmem_max = 16777216- 注意:注意 应用程序的吞吐量取决于许多因素,如应用程序使用的缓冲区大小。因此,使用测试工具(如 iperf 3)测量的结果可能与生产工作负载下服务器上应用程序测量的结果有很大不同。
11.3. MTU 大小对 UDP 流量吞吐量的影响
- 要点:如果您的应用程序使用大型 UDP 消息大小,则使用巨型帧可以提高吞吐量。
- 要点:根据 IEEE 802.3 标准,没有 Virtual Local Area Network (VLAN)标签的默认以太网帧有1518 字节的最大大小。这些帧的每一个都包含一个 18 字节标头,给有效负载保留 1500 字节。因此,对于服务器通过网络传输的每 1500 字节数据,18 字节(1.2%)是开销。
- 列表:以太网 :MTU 限制为 9000 字节。
- 列表:数据报模式下的 IP over InfiniBand (IPoIB):MTU 限制为比 InfiniBand MTU 少 4 个字节。
- 列表:内存网络通常支持大型 MTU。详情请查看相应的文档。
- 注意:重要 传输路径上的所有网络设备和所涉及的广播域都必须支持巨型帧,并使用相同的 MTU。由于传输路径上的 MTU 设置不一致,数据包碎片和组装减少了网络吞吐量。
11.4. CPU 速度对 UDP 流量吞吐量的影响
- 要点:由于缺少数据包聚合,UDP 比 TCP 用于批量传输效率较低。CPU 频率可以限制高速链路的吞吐量,因为默认禁用了 Generic Receive Offload (GRO)和 UDP 分段卸载(USO)。
- 要点:例如,在具有较高最大传输单元(MTU)和大型套接字缓冲区的调优后主机上,3 GHz CPU 可以处理全速发送或接收 UDP 流量的 10 GBit NIC 的流量。但是,当您传输 UDP 流量时,您可以预计,在 3 GHz 下,每 100 MHz CPU 速度损失大约 1-2 Gbps 速度。另外,如果 3 GHz 的 CPU 速度可以取得接近 10 Gbps,则相同的 CPU 将 40 GBit NIC 上的 UDP 流量限制在大约 20-25 Gbps。
11.5. 增加系统范围的 UDP 套接字缓冲区
- 要点:套接字缓冲区临时存储内核收到或排队要发送的数据。
- 要点:存在以下缓冲:
- 列表:读套接字缓冲区保留内核已收到的,但应用程序尚未读取的数据包。
- 列表:写套接字缓冲区保留应用程序已写到缓冲区,但内核尚未传给 IP 堆栈和网络驱动程序的数据包。
- 列表:您遇到了明显的 UDP 数据包丢弃率。
- 列表:创建 /etc/sysctl.d/10-udp-socket-buffers.conf 文件,并根据您的要求设置最大读或写缓冲区大小,或者两者: net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 指定以字节为单位的值。本例中的值将缓冲区的最大大小设置为 16 MiB。这两个参数的默认值都为 212992 字节(208 KiB)。
- 列表:从 /etc/sysctl.d/10-udp-socket-buffers.conf 文件中载入设置: # sysctl -p /etc/sysctl.d/10-udp-socket-buffers.conf
- 列表:将应用程序配置为使用大型套接字缓冲大小。 net.core.rmem_max 和 net.core.wmem_max 参数定义应用程序中 setsockopt() 函数可以请求的最大缓冲区大小。请注意,如果您将应用程序配置为不使用 setsockopt() 函数,则内核使用 rmem_default 和 wmem_default 参数的值。 详情请查看应用程序的编程语言的文档。如果您不是应用的开发人员,请联系开发人员。
- 命令/配置摘录:
net.core.rmem_max = 16777216 net.core.wmem_max = 16777216
# sysctl -p /etc/sysctl.d/10-udp-socket-buffers.conf- 注意:重要 设置太大的缓冲区大小浪费内存。每个套接字可以设置为应用程序请求的大小,内核会加倍这个值。例如,如果应用程序请求一个 256 KiB 套接字缓冲区大小,并打开 100 万个套接字,则系统只需要 512 GB RAM (512 KiB x 100万)用于潜在的套接字缓冲区空间。
第 12 章 识别应用程序读套接字缓冲区瓶颈
- 要点:如果 TCP 应用程序无法频繁清除读套接字缓冲区,则性能可能会受到影响,数据包可能会丢失。RHEL 提供了不同的工具来识别此类问题。
12.1. 识别接收缓冲区折叠和修剪
- 要点:当接收队列中的数据超过接收缓冲区大小时,TCP 堆栈尝试从套接字缓冲区中删除不必要的元数据来释放一些空间。此步骤被称为折叠。
- 要点:如果折叠无法为额外的流量释放足够的空间,则内核修剪到达的新数据。这意味着内核从内存中删除数据,数据包丢失。
- 列表:使用 nstat 工具查询 TcpExtTCPRcvCollapsed 和 TcpExtRcvPruned 计数器: # nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
- 列表:等待一些时间,重新运行 nstat 命令: # nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0
- 列表:如果与第一次运行时相比计数器的值增加了,则需要调优: 如果应用程序使用 setsockopt (SO_RCVBUF) 调用,请考虑将其删除。使用这个调用,应用仅使用调用中指定的接收缓冲区大小,并关闭套接字自动调优其大小的能力。 如果应用程序没有使用 setsockopt (SO_RCVBUF) 调用,请调优 TCP 读套接字缓冲区的默认值和最大值。
- 列表:如果应用程序使用 setsockopt (SO_RCVBUF) 调用,请考虑将其删除。使用这个调用,应用仅使用调用中指定的接收缓冲区大小,并关闭套接字自动调优其大小的能力。
- 列表:如果应用程序没有使用 setsockopt (SO_RCVBUF) 调用,请调优 TCP 读套接字缓冲区的默认值和最大值。
- 列表:显示接收积压队列(Recv-Q): # ss -nti State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.0.2.1:443 192.0.2.125:41574 :7,7 ... lastrcv:543 ... ESTAB 78 0 192.0.2.1:443 192.0.2.56:42612 :7,7 ... lastrcv:658 ... ESTAB 88 0 192.0.2.1:443 192.0.2.97:40313 :7,7 ... lastrcv:5764 ... ...
- 命令/配置摘录:
# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0第 13 章 TCP 时间戳的好处
- 要点:TCP Timestamps 是一个可选的 TCP 标头扩展。默认情况下,RHEL 启用它们,内核使用 TCP Timestamps 更好地估算 TCP 连接中的往返时间(RTT)。这导致更准确的 TCP 窗口和缓冲区计算。
- 要点:另外,TCP 时间戳提供了一种替代方法来确定片段的寿命和顺序,并防止包裹的序列号。TCP 数据包标头在 32 位字段中记录序列号。在 10 Gbps 连接中,此字段的值可以在 1.7 秒后包裹。没有 TCP 时间戳,接收方无法决定带有包裹的序列号的片段是否是一个新的片段或旧的重复片段。但是,使用 TCP 时间戳,接收方可以做出正确的选择来接收或丢弃片段。因此,在带有快速网络接口的系统上启用 TCP 时间戳非常重要。
- 列表:0 :TCP 时间戳被禁用。
- 列表:1:TCP 时间戳被启用(默认)。
- 列表:2:TCP 时间戳被启用,但没有随机偏移。 重要 如果每个连接没有随机偏移,则可以大概确定主机的运行时间和指纹,并在攻击中使用此信息。
- 命令/配置摘录:
# sysctl net.ipv4.tcp_timestamps net.ipv4.tcp_timestamps = 1- 注意:重要 如果每个连接没有随机偏移,则可以大概确定主机的运行时间和指纹,并在攻击中使用此信息。
第 14 章 调优具有大量传入请求的应用程序
- 要点:如果您运行一个处理大量传入请求的应用程序,如 Web 服务器,则有必要调整 Red Hat Enterprise Linux 来优化性能。
14.1. 调优 TCP 侦听积压日志,来处理大量 TCP 连接尝试
- 要点:当应用程序打开 LISTEN 状态的 TCP 套接字时,内核会限制此套接字可以处理的接受的客户端连接的数量。如果客户端尝试建立比应用程序可以处理的连接数更多的连接,新的客户端将被丢弃,或者内核发送 SYN cookie。
- 要点:如果系统处于正常工作负载下,且来自合法客户端的连接导致内核发送 SYN cookie,请调优 Red Hat Enterprise Linux (RHEL)以避免它们。
- 列表:RHEL 在 Systemd 日志中记录 possible SYN flooding on port <ip_address>:<port_number> 错误消息。
- 列表:大量连接尝试来自有效源,不是攻击造成的。
- 列表:要验证是否需要调优,请显示受影响的端口的统计信息: # ss -ntl '( sport = :443 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 650 500 192.0.2.1:443 0.0.0.0:* 如果积压中的当前连接数(Recv-Q)大于套接字积压(Send-Q),则侦听积压仍不够大,需要调优。
- 列表:可选:显示当前 TCP 侦听积压限制: # sysctl net.core.somaxconn net.core.somaxconn = 4096
- 列表:创建 /etc/sysctl.d/10-socket-backlog-limit.conf 文件,并设置更大的监听积压限制: net.core.somaxconn = 8192 请注意,应用程序可以请求比 net.core.somaxconn 内核参数中指定的大的侦听积压,但内核将应用程序限制为您在此参数中设置的数值。
- 列表:从 /etc/sysctl.d/10-socket-backlog-limit.conf 文件中载入设置: # sysctl -p /etc/sysctl.d/10-socket-backlog-limit.conf
- 命令/配置摘录:
# ss -ntl '( sport = :443 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 650 500 192.0.2.1:443 0.0.0.0:*
# sysctl net.core.somaxconn net.core.somaxconn = 4096- 注意:重要 您必须始终更新 net.core.somaxconn 内核设置和应用程序的设置。
第 15 章 避免侦听队列锁争用
- 要点:队列锁争用可能导致数据包丢弃和更高的 CPU 使用率,因此导致更高的延迟。您可以通过调优应用程序并使用传输数据包控制,来避免接收(RX)和传输(TX)队列上的队列锁争用。
15.1. 避免 RX 队列锁争用:SO_REUSEPORT 和 SO_REUSEPORT_BPF 套接字选项
- 要点:默认情况下,多线程网络应用程序必须共享一个用于未连接的 UDP 或 TCP 侦听器线程的套接字来接收传入流量。在多核系统中,使用 SO_REUSEPORT 或 SO_REUSEPORT_BPF 套接字选项共享负载,这会提高应用程序的性能。
- 要点:使用单个套接字会导致:
- 列表:对接收缓冲区的显著竞争,这可能会导致数据包丢弃和更高的 CPU 使用率。
- 列表:CPU 使用率的显著增加
- 列表:可能的数据包丢弃
- 列表:启用 rhel-10-for-x86_64-baseos-debug-rpms 存储库: # subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpms
- 列表:安装 kernel-debuginfo-common-x86_64 软件包: # dnf install kernel-debuginfo-common-x86_64
- 列表:代码示例现在在 /usr/src/debug/kernel-<version>/linux-<version>/tools/testing/selftests/net/reuseport_bpf_cpu.c 文件中提供。
- 命令/配置摘录:
# subscription-manager repos --enable rhel-10-for-x86_64-baseos-debug-rpms
# dnf install kernel-debuginfo-common-x86_6415.2. 避免 TX 队列锁争用:传输数据包控制
- 要点:对于具有多队列网络接口控制器(NIC)的主机,Transmit Packet Steering (XPS)在多个队列之间分发传出数据包处理。这可让多个 CPU 处理流量,防止传输队列锁定竞争和数据包丢弃。
- 要点:某些驱动程序,如 ixgbe、i40e 和 mlx5 会自动配置 XPS。要识别驱动程序是否支持此功能,请咨询 NIC 驱动程序文档。如果驱动程序不支持 XPS 自动调优,您可以手动将 CPU 核分配给传输队列。
- 列表:NIC 支持多个队列。
- 列表:numactl 软件包已安装。
- 列表:显示可用队列的数量: # ethtool -l enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 1 Pre-set maximums 部分显示队列的总数,Current hardware settings 显示当前分配给接收、传输、其他或组合队列的队列数。
- 列表:可选:如果您需要特定通道上的队列,请相应地分配它们。例如,要将 4 个队列分配给 Combined 通道,请输入: # ethtool -L enp1s0 combined 4
- 列表:显示 NIC 被分配给了哪个 Non-Uniform Memory Access (NUMA)节点: # cat /sys/class/net/enp1s0/device/numa_node 0 如果文件未找到,或者命令返回 -1, 则主机不是 NUMA 系统。
- 列表:如果主机是 NUMA 系统,显示哪些 CPU 被分配给了哪个 NUMA 节点: # lscpu | grep NUMA NUMA node(s): 2 NUMA node0 CPU(s): 0-3 NUMA node1 CPU(s): 4-7
- 命令/配置摘录:
# ethtool -l enp1s0 Channel parameters for enp1s0: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 1
# ethtool -L enp1s0 combined 4- 注意:注意 {ProductName} 不提供将传输队列永久分配给 CPU 内核的选项。反之,您可以使用在接口激活时运行的 NetworkManager 分配程序脚本来自动化这些命令。详情请查看红帽知识库解决方案 如何编写 NetworkManager 分配程序脚本,以便在接口启动时应用命令。
15.3. 在具有高 UDP 流量的服务器上禁用 Generic Receive Offload 功能
- 要点:使用高速 UDP 批量传输的应用程序受益于在 UDP 套接字上启用和使用 UDP Generic Receive Offload (GRO)。但是,您可以禁用 GRO 来提高吞吐量。
- 要点:如果满足以下条件,请禁用 GRO:
- 列表:应用程序不支持 GRO,且无法添加该功能。
- 列表:TCP 吞吐量不相关。 警告 禁用 GRO 可显著降低 TCP 流量的接收吞吐量。因此,不要在与 TCP 性能相关的主机上禁用 GRO。
- 列表:主机主要处理 UDP 流量。
- 列表:应用程序不使用 GRO。
- 列表:主机不使用 UDP 隧道协议,如 VXLAN。
- 列表:主机不运行虚拟机(VM)或容器。
- 命令/配置摘录:
# nmcli connection show NAME UUID TYPE DEVICE example f2f33f29-bb5c-3a07-9069-be72eaec3ecf ethernet enp1s0
# nmcli connection modify example ethtool.feature-gro off- 注意:警告 禁用 GRO 可显著降低 TCP 流量的接收吞吐量。因此,不要在与 TCP 性能相关的主机上禁用 GRO。
第 16 章 网络管理器调试介绍
- 要点:对所有或某些域增加日志级别有助于记录 NetworkManager 所执行的操作的更多详情。您可以使用这些信息排查问题。
- 要点:NetworkManager 提供不同的级别和域来生成日志信息。/etc/NetworkManager/NetworkManager.conf 文件是 NetworkManager 的主配置文件。日志存储在日志中。
16.1. NetworkManager reapply() 方法简介
- 要点:NetworkManager 使用配置文件来管理设备连接设置,可以通过 D-Bus API 创建、修改或删除它们。当更改配置文件时,D-Bus 会克隆设置。要应用这些更改,您必须重新激活连接的设置,或使用 reapply() 方法。
- 要点:reapply() 方法具有以下特性:
- 列表:在不停用或重启网络接口的情况下更新修改后的连接设置。
- 列表:从修改后的连接设置中删除待处理的更改。因为 NetworkManager 不会恢复手动更改,因此您可以重新配置设备,并恢复外部或手动参数。
- 列表:创建与现有连接设置不同的修改后的连接设置。
- 列表:bridge.ageing-time
- 列表:bridge.forward-delay
- 列表:bridge.group-address
16.2. 设置 NetworkManager 日志级别
- 要点:默认情况下,所有日志域都设为记录 INFO 日志级别。在收集调试日志前禁用速率限制。通过速率限制,如果短时间内有太多信息,systemd-journald 会丢弃它们。当日志级别为 TRACE 时,可能会发生这种情况。
- 要点:此流程禁用速率限制,并为所有(ALL)域启用记录调试日志。
- 列表:要禁用速率限制,请编辑 /etc/systemd/journald.conf 文件,取消 [Journal] 部分中的 RateLimitBurst 参数的注释,并将其值设为 0 : RateLimitBurst=0
- 列表:重启 systemd-journald 服务。 # systemctl restart systemd-journald
- 列表:使用以下内容创建 /etc/NetworkManager/conf.d/95-nm-debug.conf 文件: [logging] domains=ALL:TRACE domains 参数可以包含多个用逗号分隔的 domain:level 对。
- 列表:重启 NetworkManager 服务。 # systemctl restart NetworkManager
- 列表:查询 systemd 日志以显示 NetworkManager 单元的日志条目: # journalctl -u NetworkManager ... Jun 30 15:24:32 server NetworkManager[164187]: <debug> [1656595472.4939] active-connection[0x5565143c80a0]: update activation type from assume to managed Jun 30 15:24:32 server NetworkManager[164187]: <trace> [1656595472.4939] device[55b33c3bd…
- 命令/配置摘录:
RateLimitBurst=0
# systemctl restart systemd-journald16.3. 使用 nmcli 临时在运行时设置日志级别
- 要点:您可以使用 nmcli 在运行时更改日志级别。
- 要点:流程
- 列表:可选:显示当前的日志设置: # nmcli general logging LEVEL DOMAINS INFO PLATFORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP,WIFI_SCAN,IP4,IP6,A UTOIP4,DNS,VPN,SHARING,SUPPLICANT,AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC, WIMAX,INFINIBAND,FIREWALL,ADSL,BOND,VLAN,BRIDGE,DBUS_PROPS,TEAM,CONCHECK,DC B,DISPATCH
- 列表:要修改日志级别和域,请使用以下选项: 要将所有域的日志级别都设为同样的 LEVEL,请输入: # nmcli general logging level LEVEL domains ALL 要更改特定域的级别,请输入: # nmcli general logging level LEVEL domains DOMAINS 请注意,使用这个命令更新日志级别会禁用所有其他域的日志功能。 要更改特定域的级别并保持其它域的级别,请输入: # nmcli general logging level KEEP domains DOMAIN:LEVEL,DOMAIN:LEVEL
- 列表:要将所有域的日志级别都设为同样的 LEVEL,请输入: # nmcli general logging level LEVEL domains ALL
- 列表:要更改特定域的级别,请输入: # nmcli general logging level LEVEL domains DOMAINS 请注意,使用这个命令更新日志级别会禁用所有其他域的日志功能。
- 列表:要更改特定域的级别并保持其它域的级别,请输入: # nmcli general logging level KEEP domains DOMAIN:LEVEL,DOMAIN:LEVEL
- 命令/配置摘录:
# nmcli general logging LEVEL DOMAINS INFO PLATFORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP,WIFI_SCAN,IP4,IP6,A UTOIP4,DNS,VPN,SHARING,SUPPLICANT,AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC, WIMAX,INFINIBAND,FIREWALL,ADSL,BOND,VLAN,BRIDGE,DBUS_PROPS,TEAM,CONCHECK,DC B,DISPATCH
# nmcli general logging level LEVEL domains ALL16.4. 查看 NetworkManager 日志
- 要点:您可以查看 NetworkManager 日志进行故障排除。
- 要点:流程
- 列表:要查看日志,请输入: # journalctl -u NetworkManager -b
- 命令/配置摘录:
# journalctl -u NetworkManager -b16.5. 调试级别和域
- 要点:您可以使用 levels 和 domains 参数来管理 NetworkManager 的调试。levels 定义了详细程度,而 domains 定义了消息的类别,以记录给定的严重程度(级别)的日志。
- 要点:请注意,后续的级别记录来自以前级别的所有信息。例如,将日志级别设为 INFO 也会记录包含在 ERR 和 WARN 日志级别中的消息。
- 表格样本(共 7 行):
- 日志级别 | 描述
- OFF | 不记录任何有关 NetworkManager 的信息
- ERR | 仅记录严重错误
- WARN | 记录可以反映操作的警告信息
完整目录
- 调试和解决网络问题
- 对红帽文档提供反馈
- 第 1 章 调优网络适配器设置
- 1.1. 使用 nmcli 增加环缓冲区的大小,以减少该数据包丢弃率
- 1.2. 增加环缓冲区大小,以使用 network RHEL 系统角色降低高数据包丢弃率
- 1.3. 调优网络设备积压队列以避免数据包丢弃
- 1.4. 增加 NIC 的传输队列长度,以减少传输错误数
- 第 2 章 调优 IRQ 平衡
- 2.1. 中断和中断处理程序
- 2.2. 软件中断请求
- 2.3. NAPI 轮询
- 2.4. irqbalance 服务
- 2.5. 增加 SoftIRQ 可在 CPU 上运行的时间
- 第 3 章 调整设备驱动程序和 NIC
- 3.1. 配置自定义 NIC 驱动程序参数
- 第 4 章 配置网络适配器卸载设置
- 4.1. 临时设置卸载功能
- 4.2. 永久设置卸载功能
- 第 5 章 以太网网络的流控制
- 第 6 章 在 NetworkManager 连接配置文件中配置 ethtool 设置
- 6.1. 使用 nmcli 配置 ethtool 卸载功能
- 6.2. 使用 network RHEL 系统角色配置 ethtool 卸载功能
- 6.3. 使用 nmcli 配置 ethtool 合并设置
- 6.4. 使用 network RHEL 系统角色配置 ethtool 合并设置
- 6.5. 使用 nmcli 增加环缓冲区的大小,以减少该数据包丢弃率
- 6.6. 增加环缓冲区大小,以使用 network RHEL 系统角色降低高数据包丢弃率
- 6.7. 使用 nmcli配置 ethtool 频道设置
- 第 7 章 改善网络延迟
- 7.1. CPU 电源状态如何影响网络延迟
- 7.2. EFI 固件中的 C-state 设置
- 7.3. 使用自定义 TuneD 配置文件禁用 C-states
- 7.4. 使用内核命令行选项禁用 C-states
- 7.5. 使用线程 NAPI 忙碌轮询来提高接收性延迟一致性
- 第 8 章 调优中断合并设置
- 8.1. 为延迟或吞吐量敏感的服务优化 RHEL
- 第 9 章 提高大量连续数据流的吞吐量
- 9.1. 配置巨型帧前的注意事项
- 9.2. 在现有 NetworkManager 连接配置文件中配置 MTU
- 第 10 章 为高吞吐量调优 TCP 连接
- 10.1. 使用 iperf3 测试 TCP 吞吐量
- 10.2. 系统范围的 TCP 套接字缓冲区设置
- 10.3. 增加系统范围的 TCP 套接字缓冲区
- 10.4. TCP 窗口扩展
- 10.5. TCP SACK 如何降低数据包丢弃率
- 第 11 章 调优 UDP 连接
- 11.1. 检测数据包丢弃
- 11.2. 使用 iperf3 测试 UDP 吞吐量
- 11.3. MTU 大小对 UDP 流量吞吐量的影响
- 11.4. CPU 速度对 UDP 流量吞吐量的影响
- 11.5. 增加系统范围的 UDP 套接字缓冲区
- 第 12 章 识别应用程序读套接字缓冲区瓶颈
- 12.1. 识别接收缓冲区折叠和修剪
- 第 13 章 TCP 时间戳的好处
- 第 14 章 调优具有大量传入请求的应用程序
- 14.1. 调优 TCP 侦听积压日志,来处理大量 TCP 连接尝试
- 第 15 章 避免侦听队列锁争用
- 15.1. 避免 RX 队列锁争用:SO_REUSEPORT 和 SO_REUSEPORT_BPF 套接字选项
- 15.2. 避免 TX 队列锁争用:传输数据包控制
- 15.3. 在具有高 UDP 流量的服务器上禁用 Generic Receive Offload 功能
- 第 16 章 网络管理器调试介绍
- 16.1. NetworkManager reapply() 方法简介
- 16.2. 设置 NetworkManager 日志级别
- 16.3. 使用 nmcli 临时在运行时设置日志级别
- 16.4. 查看 NetworkManager 日志
- 16.5. 调试级别和域
