Akemi

Linux网络调优

2025/05/30

网络内核可调项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#包接收流程
(网线)
1.电信号被网卡芯片解码,转换成以太网帧
(网卡)
2.网卡DMA引擎将帧直接写入环形缓冲区
3.缓冲区达到阈值之后,网卡触发硬中断(缓冲区满时新的帧会被丢弃
4.内核中断处理程序标记需要处理的帧,并触发软中断来处理硬中断
5.数据从环形缓冲区复制到内核协议栈内存,方便软中断单独处理
6.软中断剥离包,并判断是给本机还是转发的
(应用层)
7.如果报文的目的地是本地,放入socket接收缓冲区,复制到用户空间内存

#包发送流程
1.应用调用write()将数据放入Socket发送缓冲区
(内核)
2.协议栈封装
3.协议栈将帧放入环形缓冲区(TX Ring)
4.网卡通过DMA获取帧数据
5.发送完成后触发发送完成中断

环形缓冲区是网卡和内核的交接区
任何环节积压都会导致丢包
调优本质:扩大缓冲区 or 加速处理能力

调优缓冲区大小

网络缓冲区包括

核心网络读和写缓冲区(用于UDP和TCP)
每个套接字TCP读和写缓冲区
碎片缓冲区
用于网卡的DMA缓冲区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
内核可调项

net.ipv4.tcp_mem
net.ipv4.udp_mem
总的tcp/udp缓冲区。有三个值(单位:页)
min
pressure 超过时,内存介入调整,使其低于min
max 所有套接字排队的最大内存量

net.core.rmem_max
net.core.wmem_max
核心网络的最大套接字接收/发送缓冲区。单位字节

net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
套接字TCP读写缓冲区,单位字节,不能超过上面的缓冲区大小

带宽延迟乘积BDP

BDP表示“正在链路上传输的数据总量”

当水龙头打开后,水需要一定时间才能从一端到达另一端。水管中始终充满水,这些水就是“在途数据”。

如果发送方发送的数据量小于BDP,管道就没有被充分利用,因为等到时网络一直没有被使用

要最大化利用网络链路,就需要对BDP进行调优

1
2
3
4
5
6
7
8
9
10
1.计算延迟
通过网络ping就可以看到延迟
2.计算BDP=带宽×延迟
3.设置TCP窗口≥DBP

调优缓冲区大小
sysctl -w net.ipv4.tcp_wmem='<最小值> <默认值> <窗口最大值>'

默认情况下窗口最大限制为64kiB
如果net.ipv4.tcp_windows_scaling=1 内核将尝试协商窗口缩放

巨型帧设置

1
nmcli con modify ens33 802-3-ethernet.mtu 9000

qperf网络测试工具

qperf 是一个强大的网络性能测试工具,用于测量两个节点之间的带宽(bandwidth)和延迟(latency)。它支持 TCP/IP、RDMA、UDP、SCTP 等多种协议,特别适合测试高速网络性能(如 InfiniBand、RoCE)。

qperf的使用需要两台服务端和测试端共同协作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum -y install qperf

# 服务端启动,19765端口
qperf

# 测试端发送请求
qperf 192.168.10.250 tcp_bw tcp_lat udp_bw udp_lat
tcp_bw:
bw = 118 MB/sec
tcp_lat:
latency = 169 us
udp_bw:
send_bw = 120 MB/sec
recv_bw = 120 MB/sec
udp_lat:
latency = 162 us

相关参数

参数 说明 示例
tcp_bw TCP 带宽测试 qperf 192.168.1.100 tcp_bw
tcp_lat TCP 延迟测试 qperf 192.168.1.100 tcp_lat
-t 测试持续时间(秒) -t 5
--msg_size 消息大小(字节) --msg_size 65536
-v 显示详细输出 qperf -v 192.168.1.100 tcp_bw
-lp 本地监听端口 qperf -lp 5555
-ip 指定服务器端口 qperf 192.168.1.100 -ip 5555 tcp_bw
CATALOG
  1. 1. 网络内核可调项
    1. 1.1. 调优缓冲区大小
    2. 1.2. 带宽延迟乘积BDP
  2. 2. 巨型帧设置
  3. 3. qperf网络测试工具