跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

16 调整网络 编辑源文件

网络子系统非常复杂,其优化高度依赖于系统使用场景以及外部因素,例如网络中的软件客户端或硬件组件(交换机、路由器或网关)。Linux 内核更侧重于可靠性和低延迟,而不是低开销和高吞吐量。其他设置可能意味着更低的安全级别,但更高的性能。

16.1 可配置的内核套接字缓冲区 编辑源文件

大多数现代网络都基于 TCP/IP 协议和套接字接口进行通信;有关 TCP/IP 的更多信息,请参阅 “参考”手册,第 13 章“基本网络”。Linux 内核通过套接字接口处理接收或发送的数据,这些数据存储在内核套接字缓冲区中。这些内核套接字缓冲区是可调整的。

Important
重要提示:TCP 自动调整

自内核版本 2.6.17 起,已存在最大缓冲区大小为 4 MB 的完全自动调整功能。这意味着手动调整通常不会显着提高网络性能。通常最好不要修改以下变量,或者至少仔细检查调整结果。

如果您从旧内核升级,建议删除手动 TCP 调整,以支持自动调整功能。

/proc 文件系统中的特殊文件可以修改内核套接字缓冲区的大小和行为;有关 /proc 文件系统的常规信息,请参阅 第 2.6 节,“/proc 文件系统”。在以下位置找到与网络相关的文件

/proc/sys/net/core
/proc/sys/net/ipv4
/proc/sys/net/ipv6

常规 net 变量在内核文档 (linux/Documentation/sysctl/net.txt) 中说明。特殊的 ipv4 变量在 linux/Documentation/networking/ip-sysctl.txtlinux/Documentation/networking/ipvs-sysctl.txt 中说明。

/proc 文件系统中,例如,可以为所有协议设置最大套接字接收缓冲区和最大套接字发送缓冲区,或者仅为 TCP 协议设置这两个选项(在 ipv4 中),从而覆盖所有协议的设置(在 core 中)。

/proc/sys/net/ipv4/tcp_moderate_rcvbuf

如果 /proc/sys/net/ipv4/tcp_moderate_rcvbuf 设置为 1,则表示已激活自动调整,并且缓冲区大小会动态调整。

/proc/sys/net/ipv4/tcp_rmem

三个值设置每个连接的内存接收缓冲区的最小值、初始值和最大值。它们定义了实际的内存使用情况,而不仅仅是 TCP 窗口大小。

/proc/sys/net/ipv4/tcp_wmem

tcp_rmem 相同,但用于每个连接的内存发送缓冲区。

/proc/sys/net/core/rmem_max

设置为限制应用程序可以请求的最大接收缓冲区大小。

/proc/sys/net/core/wmem_max

设置为限制应用程序可以请求的最大发送缓冲区大小。

通过 /proc,可以禁用您不需要的 TCP 功能(默认情况下会启用所有 TCP 功能)。例如,检查以下文件

/proc/sys/net/ipv4/tcp_timestamps

TCP 时间戳在 RFC1323 中定义。

/proc/sys/net/ipv4/tcp_window_scaling

TCP 窗口缩放也在 RFC1323 中定义。

/proc/sys/net/ipv4/tcp_sack

选择性确认 (SACKS)。

使用 sysctl 读取或写入 /proc 文件系统的变量。与 cat(用于读取)和 echo(用于写入)相比,sysctl 更可取,因为它还会从 /etc/sysctl.conf 读取设置,因此这些设置可以可靠地在重新启动后保留。使用 sysctl,您可以轻松读取所有变量及其值;作为 root 用户,使用以下命令列出与 TCP 相关的设置

> sudo sysctl -a | grep tcp
Note
注意:调整网络变量的副作用

调整网络变量会影响其他系统资源,例如 CPU 或内存使用情况。

16.2 检测网络瓶颈和分析网络流量 编辑源文件

在开始网络调整之前,重要的是隔离网络瓶颈和网络流量模式。有一些工具可以帮助您检测这些瓶颈。

以下工具可以帮助分析您的网络流量:netstattcpdumpwireshark。Wireshark 是一种网络流量分析器。

16.3 Netfilter 编辑源文件

Linux 防火墙和伪装功能由 Netfilter 内核模块提供。这是一个高度可配置的基于规则的框架。如果规则与数据包匹配,Netfilter 会接受或拒绝该数据包,或者根据规则(例如地址转换)采取特殊操作(“目标”)。

Netfilter 可以考虑许多属性。因此,定义的规则越多,数据包处理可能需要的时间就越长。此外,高级连接跟踪可能相当昂贵,从而降低整体网络性能。

当内核队列已满时,所有新的数据包都会被丢弃,导致现有连接失败。“fail-open”功能允许用户临时禁用数据包检查,并在高网络流量下保持连接。有关参考,请参阅 https://home.regit.org/netfilter-en/using-nfqueue-and-libnetfilter_queue/

有关更多信息,请参阅 Netfilter 和 iptables 项目的主页,https://www.netfilter.org

16.4 使用接收数据包引导 (RPS) 提高网络性能 编辑源文件

现代网络接口设备可以将如此多的数据包移动到主机,以至于主机可能成为实现最大性能的限制因素。为了跟上,系统必须能够将工作分配到多个 CPU 核心。

一些现代网络接口可以通过硬件实现多个传输和多个接收队列来帮助将工作分配到多个 CPU 核心。但是,其他接口仅配备一个队列,并且驱动程序必须以单个序列化流处理所有传入的数据包。为了解决此问题,操作系统必须“并行化”该流,以将工作分配到多个 CPU。在 openSUSE Leap 中,这是通过接收数据包引导 (RPS) 完成的。RPS 也可以在虚拟环境中使用。

RPS 使用 IP 地址和端口号为每个数据流创建一个唯一的哈希值。使用此哈希值可确保相同数据流的数据包发送到相同的 CPU,这有助于提高性能。

RPS 配置每个网络设备接收队列和接口。配置文件名与以下方案匹配

/sys/class/net/<device>/queues/<rx-queue>/rps_cpus

<device> 表示网络设备,例如 eth0eth1<rx-queue> 表示接收队列,例如 rx-0rx-1

如果网络接口硬件仅支持单个接收队列,则仅存在 rx-0。如果它支持多个接收队列,则为每个接收队列存在一个 rx-N 目录。

这些配置文件包含一个逗号分隔的 CPU 位图列表。默认情况下,所有位都设置为 0。使用此设置,RPS 被禁用,因此处理中断的 CPU 也处理数据包队列。

要启用 RPS 并启用特定的 CPU 来处理接口的接收队列的数据包,请将它们的位置在位图中设置为 1。例如,要启用 CPU 0-3 来处理 eth0 的第一个接收队列的数据包,请将二进制格式中位置 0-3 设置为 1:00001111。然后需要将此表示转换为十六进制,在本例中结果为 F。使用以下命令设置此十六进制值

> sudo echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus

如果您想启用 CPU 8-15

1111 1111 0000 0000 (binary)
15     15    0    0 (decimal)
F       F    0    0 (hex)

设置十六进制值 ff00 的命令是

> sudo echo "ff00" > /sys/class/net/eth0/queues/rx-0/rps_cpus

在 NUMA 机器上,可以通过将 RPS 配置为使用与接口接收队列中断位于同一 NUMA 节点上的 CPU 来实现最佳性能。

在非 NUMA 机器上,可以使用所有 CPU。如果中断速率很高,排除处理网络接口的 CPU 可以提高性能。可以通过 /proc/interrupts 确定用于网络接口的 CPU。例如

> sudo cat /proc/interrupts
            CPU0       CPU1       CPU2       CPU3
...
  51:  113915241          0          0          0      Phys-fasteoi   eth0
...

在这种情况下,CPU 0 是处理 eth0 中断的唯一 CPU,因为只有 CPU0 包含非零值。

在 x86 和 AMD64/Intel 64 平台上,可以使用 irqbalance 将硬件中断分配到 CPU。有关更多详细信息,请参阅 man 1 irqbalance

打印此页面