精读笔记(RHCA 英文教材)· RH442 Chapter 11 Tuning Network Utilization
精读笔记(RHCA 英文教材)· RH442 Chapter 11 Tuning Network Utilization
教材原文:RHCA 官方英文教材(PDF 第 398~433 页)(OCR 整书版已从本站移除,本页为章节精读) 关联中文笔记:
02-09-性能调优RH442(RHCA).md(网络:网卡多队列、ethtool、TCP 内核参数 /proc/sys/net/ipv4);本章=网络两大部分:延迟/吞吐配置(内核缓冲、BDP、巨帧)→ 链路层配置(ethtool、qperf、teaming)。 结构:2 个 Section(11.1 为网络延迟与吞吐配置+GE network-latency;11.2 配置网络链路层+GE network-driver)+ Lab(lab: network-review)。
Chapter Goal / Objectives(原文+译)
- GOAL: Manage application efficiency for network utilization.(管理应用的网络使用效率。)
- OBJECTIVES: ① 描述延迟与吞吐定义,讨论不同网络负载的差异化需求;② 用 ethtool 配置网络设备参数。
11.1 Configuring for Network Latency and Throughput(延迟与吞吐配置)
- 报文发送路径:写 socket(类似文件对象)→ 进发送缓冲 → 内核封装成 PDU → 到每设备发送队列 → 驱动从队首拷给 NIC → NIC 发出并中断。
- 报文接收路径:NIC 收帧用 DMA 拷入接收缓冲 → 发硬中断 → 内核处理硬中断并调度软中断处理包 → 软中断把包送上 IP 层 → 本地投递则解封装放进 socket 接收缓冲 → 等待的进程取走。
- 潜在瓶颈点:
- Livelock(活锁):硬中断抢占一切(含其它中断处理),重收负载下缓冲来不及清空会打满。内核管理硬中断可防活锁。
- NIC 硬件环形缓冲(ring buffer):NIC 丢包多时查
ethtool;解决=降输入速率或加大硬件缓冲队列。 - 中断与进程不在同一 CPU/核:产生中断的进程与中断处理若不同核,会出现延迟与处理器争用。
- 应用接收队列:大量包没被进程取走或 UDP 输入错误增多→降低输入速率或加大应用 socket 队列深度。
- 网络内核可调参数(boot 时按可用内存算默认,x86_64 上 max 接近物理内存量,x86 常需调大):
net.ipv4.tcp_mem/net.ipv4.udp_mem:TCP/UDP 全系统内存上限(单位是页,getconf PAGESIZE查页大小,常 4096),三字段 min / pressure / max:低于 min 内核不关心;超过 pressure 开始收敛用量直到回 min 以下;max=所有 socket 排队允许的最大内存。net.core.rmem_max/net.core.wmem_max:核心网络最大收/发缓冲(字节)。net.ipv4.tcp_rmem/net.ipv4.tcp_wmem(字节,min default max 三值):socket 缓冲从 default 起步,按需在 min~max 间自动调整。⚠️ tcp_rmem/tcp_wmem 的 max 不能超过 net.core.rmem_max/wmem_max,调大 TCP 上限时务必同步调大 core 值。
- BDP(带宽延迟积)计算:缓冲区容量 = 管道容量(字节/秒)× 管道长度(RTT 秒)。先
ping取平均 RTT。例:1 Gb/s × 0.341 ms → 10⁹×0.000341 bits = 341000 bits ÷8 = 42625 B ≈ 41.63 KiB。 - 窗口缩放:BDP 超过 64 KiB 时可协商 window scaling(双方支持才生效;sysctl
net.ipv4.tcp_window_scaling=0 禁用),让未确认窗口长大,避免发送方停等 ACK。 - buffer bloat:多连接并存时单 socket 缓冲只需够单连接的 BDP;调太大反而出现 buffer bloat——缓冲处理速率低于灌入速率,让 HTTP/SSH 这类小数据连接延迟与速度严重受损。
- 巨帧(jumbo frames):TCP 带时间戳时协议头 52 字节,MTU 1500 下≈3.5% 开销;换 UDP 头 28 字节(<1.9%)未必可行;把 MTU 提到 1500 以上即巨帧——既提升每包有效载荷占比又减少 NIC 处理量。所有链路环节(NIC/交换机/路由器)都必须支持;官方上限 9000 字节(有些设备更大)。典型场景=SAN(网络隔离易全线开启)、服务器集群、备份设施、高性能私有网。MTU 9000 时 52/9000≈0.58%。用
nmcli connection modify <连接> 802-3-ethernet.mtu 9000后重激活生效。参考:RH KB How to enable jumbo frames;KB How do I tune RHEL for better TCP performance over a specific network connection。
11.1 GE(lab: network-latency)
servera(实验装 Apache、造了高延迟假网络设备):ping 192.168.0.254 RTT≈2 s → 按 100 Mbps 算 BDP=100×10⁶/8×2=25,000,000 字节(≈25 MB) → time wget http://192.168.0.254/bigfile(5.0M)实测 real≈32.0 s(约 183KB/s)→ 临时调 sysctl -w net.core.rmem_max=25000000 且 net.ipv4.tcp_rmem=4096 12500000 25000000 → 重跑 real≈20.0 s(320KB/s,明显下降)→ lab network-latency finish(清资源)。
11.2 Configuring the Network Link Layer(配置网络链路层)
- ethtool 查网卡:
ethtool ens3显示 Supported/Advertised link modes、Speed、Duplex、Auto-negotiation、Link detected 等。自动协商通常可信,偶尔失效——可限制通告速度或用 autoneg off 固定速度。 - 手动改链路参数:
ethtool -s ens3 advertise 0x28(0x28=100baseT Full 0x008 + 1000baseT Full 0x020 位掩码,来自 ethtool(8) man);ethtool -s ens3 autoneg off speed 1000 duplex full。⚠️ 虚拟机里这些通常无效(虚机链路速度取决于宿主物理网卡)。ethtool 改动不持久:RHEL6 用 ifcfg 的ETHTOOL_OPTS;RHEL7+ NetworkManager 用连接属性802-3-ethernet.auto-negotiate/speed/duplex。 - offload 特性:
ethtool -k(--show-offload)列内核可下放给网卡的操作(校验和、分片/分段等),ethtool -K(--offload)修改。如tcp-segmentation-offload(TSO)开启时大包性能好。NetworkManager 持久化用 ethtool.feature-* 连接属性(例ethtool.feature-tx-tcp-segmentation off)。 - 虚拟网卡:ethtool 也能查虚拟设备(内存中的模拟桥/交换机/NIC);virtio 这类模拟驱动往往报假 100M/1000M 速度——那不是限速,虚拟网段除非配了 QoS 否则跑内存速度。
- qperf 测吞吐:双机运行——监听端
qperf(无参数,默认监听 TCP 19765,--listen_port可改);客户端qperf host2 tcp_bw udp_bw。可测 TCP/UDP/RDS/SCTP/SDP 吞吐与延迟,还支持 RDMA/InfiniBand。示例结果 tcp_bw=118 MB/s、udp 收发≈120 MB/s。 - teaming vs bonding:teaming=把多网卡逻辑合并做故障切换或更高吞吐;比老 bonding 驱动性能更好、模块化更可扩展(RHEL8 为向后兼容仍支持 channel bonding)。实现=小内核驱动+用户态 teamd 守护;内核高效转发包、teamd 管逻辑;runner 实现负载均衡与主备逻辑:
broadcast:每包从所有端口发出(简单)。roundrobin:轮询各端口发包(简单)。activebackup:故障切换——监视链路变化,选一个活跃端口承载数据。loadbalance:监视流量+哈希选端口,尽量达到完美均衡。lacp:实现 802.3ad,端口选择思路类似 loadbalance。
- team 接口与 NetworkManager 行为要点(排障必记):启 team 不会自动启端口;启任一端口会带起 team;停 team 同时停端口;无端口的 team 可启静态 IP 连接;DHCP 连接会等端口;带载波端口加入后 DHCP 完成、无载波端口加入则继续等。
- nmcli 建 team 五步: ① 建 team 连接:
nmcli connection add type team con-name team0 ifname team0 team.runner loadbalance(runner/link-watchers 可带;link-watcher 至少给 name,如team.link-watchers "name=ethtool")。 ② 定 IP 属性:默认 DHCP;静态先nmcli connection modify team0 ipv4.addresses 10.42.0.42/24再ipv4.method manual。 ③ 加端口:nmcli connection add type ethernet slave-type team con-name team0-port1 ifname eno1 master team0(每端口一条)。 ④ 激活:nmcli connection up team0+ 逐个nmcli connection up team0-portN(nmcli dev dis <dev>可关)。 ⑤ 查验:teamdctl team0 state(runner、各端口 link watches、active port)。 - 排障工具(只对 up 的 team 有效):
teamnl team0 ports(列端口);teamnl team0 getoption activeport;teamnl team0 setoption activeport 3(手工切活跃口);teamdctl team0 config dump(JSON 配置,含端口 prio/sticky、link_watch)。 - 持久配置:NetworkManager 在 /etc/sysconfig/network-scripts 为 team 与每个端口各生成一个文件——team 文件含
DEVICETYPE=Team+TEAM_CONFIG="{\"runner\":{\"name\":\"broadcast\"}}"(JSON 语法)+ IP 设置;端口文件含DEVICETYPE=TeamPort+TEAM_MASTER=team0。
11.2 GE(lab: network-driver)
serverb 起 qperf 服务端(先 firewall-cmd --add-port=19765/tcp --add-port=19766/tcp --permanent+reload、装 qperf、qperf);servera 端 qperf serverb --ip_port 19766 --use_bits_per_sec 1 --time 20 tcp_bw→5.89 Gb/s;ip address show 找到 ens3 后 ethtool -k ens3 见 tcp-segmentation-offload on → ethtool -K ens3 tx-tcp-segmentation off → 重测仅 1.05 Gb/s(关 TSO 带宽大降)→ nmcli 持久化(连接名 wired connection 1:ethtool.feature-tx-tcp-segmentation off;讲义注明仅演示,生产不要关)→ 建 team0 activebackup 192.168.0.100/24(端口 eno1/eno2)→ teamdctl team0 state 看 active port → ping -I team0 通 → tcpdump -i eno1 看到 ICMP、tcpdump -i eno2 无包(主备只走一卡)→ 改 nmcli connection modify team0 team.runner roundrobin+down/up → 两卡 tcpdump 都有流量 → lab network-driver finish。
Lab 概要(lab: network-review)
serverb:① team0=loadbalance、10.42.0.42/24、端口 eno1+eno2,ping -I team0 10.42.0.254 通(假慢网卡可能要等近一分钟);② ping 10.42.0.254 RTT=1 s,按 100 Mbps 算 BDP=12,500,000 字节;建档 /etc/tuned/enterprise-network/tuned.conf:[main] include=network-throughput + [sysctl] net.core.rmem_max=12500000、net.core.wmem_max=12500000、net.ipv4.tcp_rmem=4096 87380 12500000、net.ipv4.tcp_wmem=4096 16384 12500000 → tuned-adm profile enterprise-network;③ 同事关了 TSO:按主 IP 172.25.250.11 定位 ens3,ethtool -K ens3 tx-tcp-segmentation on,再 nmcli connection modify "wired connection 1" ethtool.feature-tx-tcp-segmentation on 持久化 → lab network-review grade(失败修正后重跑)、finish。
命令速查表
| 用途 | 命令 | | 内核缓冲 | sysctl net.core.rmem_max\|wmem_max;net.ipv4.tcp_rmem\|tcp_wmem(min default max);net.ipv4.tcp_mem\|udp_mem(min pressure max,页单位);getconf PAGESIZE | | 查 RTT/算 BDP | ping <host>;BDP=带宽(bit/s)×RTT(s)÷8 | | 巨帧 | nmcli connection modify <conn> 802-3-ethernet.mtu 9000 + nmcli connection up <conn> | | ethtool 查/改 | ethtool ens3;ethtool -s ens3 advertise 0x28;ethtool -s ens3 autoneg off speed 1000 duplex full | | offload | ethtool -k ens3;ethtool -K ens3 tx-tcp-segmentation off\|on;持久:nmcli connection modify <conn> ethtool.feature-tx-tcp-segmentation on | | qperf | 服务端 qperf(端口 19765);客户端 qperf <host> --ip_port 19766 --time 20 tcp_bw udp_bw | | team 创建 | nmcli connection add type team con-name team0 ifname team0 team.runner loadbalance\|activebackup\|roundrobin | | team 端口 | nmcli connection add type ethernet slave-type team con-name team0-port1 ifname eno1 master team0 | | team 激活/查验 | nmcli connection up team0[-portN];teamdctl team0 state;teamnl team0 ports\|getoption activeport\|setoption activeport 3\|config dump | | 实验/评分 | lab network-latency\|network-driver\|network-review start;lab network-review grade;… finish |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| PDU / DMA | 协议数据单元/直接内存访问 | 收包 DMA 入缓冲再中断 |
| hard/soft interrupt | 硬/软中断 | 防 livelock 的关键 |
| ring buffer | 网卡环形缓冲 | 丢包多就查它 |
| tcp_mem / udp_mem | TCP/UDP 内存上限 | min pressure max,页单位 |
| rmem_max / wmem_max | 核心收/发缓冲上限 | 字节;tcp_rmem max 不能超它 |
| tcp_rmem / tcp_wmem | TCP socket 缓冲 | min default max 自动调 |
| BDP | 带宽延迟积 | 容量×RTT;窗口要装下管道 |
| window scaling | TCP 窗口缩放 | >64KiB BDP 需要协商 |
| buffer bloat | 缓冲膨胀 | 缓冲过大损害小连接 |
| MTU / jumbo frame | 最大传输单元/巨帧 | 9000 字节上限;SAN 主场景 |
| ethtool | 网卡设置工具 | -s 链路/-k 看 offload/-K 改 |
| advertise bitmask | 通告速度位掩码 | 0x28=100/1000 Full |
| TSO / offload | TCP 分段卸载 | 关掉带宽骤降 |
| qperf | 网络性能测量 | 双机;TCP/UDP/RDMA |
| teamd / runner | 聚合守护/算法 | broadcast/roundrobin/activebackup/loadbalance/lacp |
| activebackup | 主备故障切换 | 只走活跃口 |
| loadbalance / roundrobin | 负载均衡/轮询 | 双口同收发 |
| teamnl / teamdctl | team 排障工具 | 需 team up;config dump 看 JSON |
| link watcher | 链路监视器 | ethtool 默认;可带 prio/sticky |
自测 10 题
- 收包路径中断如何避免 livelock?(内核处理硬中断并调度软中断,避免缓冲打满)
- tcp_mem 的单位与三字段?(页;min/pressure/max)
- tcp_rmem 的 max 为何不能单独调大?(不能超过 net.core.rmem_max/wmem_max)
- 1 Gb/s、RTT 0.341 ms 的 BDP?(约 41.63 KiB;>64KiB 需窗口缩放)
- buffer bloat 何时出现、害谁?(缓冲处理速度低于灌入速度;HTTP/SSH 小连接)
- 巨帧官方上限与典型场景?(9000 字节;SAN/集群/备份/高性能私有网)
- ethtool 修改为何不持久?NM 下如何持久化?(ethtool 即时生效;802-3-ethernet.* 与 ethtool.feature-* 连接属性)
- TSO 关掉实测影响?(qperf 5.89→1.05 Gb/s 级别的大幅下降)
- teamd 的 runner 各干什么?(broadcast 全发/roundrobin 轮询/activebackup 主备/loadbalance 哈希均衡/lacp 802.3ad)
- 无端口的 team 能启 DHCP 吗?(不能,DHCP 等端口;静态 IP 可以)
