工具:
在 Netperf 中,你可以使用 netperf 命令来进行 UDP 流量测试。UDP 是一种无连接的传输协议,因此 UDP 测试通常会关注在不可靠网络环境下的性能和吞吐量。
以下是在 Linux 中使用 Netperf 进行 UDP 流量测试的示例:
# 在服务器上启动 netserver(如果 netserver 尚未运行)
netserver
# 在客户端上使用 netperf 进行 UDP 流量测试
netperf -H server_ip_address -t UDP_STREAM
请将 server_ip_address 替换为你的服务器 IP 地址。
在此示例中,-t UDP_STREAM 参数指定了 UDP 流量测试。Netperf 将会向服务器发送 UDP 数据包,并测量所产生的吞吐量以评估 UDP 性能。
需要注意的是,UDP 是一种无连接的协议,因此它不提供像 TCP 那样的可靠性和有序性。在 UDP 测试中,需要关注丢包率、延迟以及带宽利用率等指标,以评估网络环境下的 UDP 性能。
docker pull networkstatic/netperf
# 当前使用版本:
root@netperf1:/# netserver -V
Netperf version 2.7.0
root@netperf1:/# netperf -V
Netperf version 2.7.0
root@netperf1:/#
1. 基于 netshoot pod netperf 测试节点本地 vpc pod udp stream 性能
# 默认 vpc 的网卡的 mtu 值是 1450
root@kube-ovn-pinger-64224:/kube-ovn# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3984: eth0@if3985: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether 00:00:00:f6:33:76 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.222.0.11/18 brd 10.222.63.255 scope global eth0
1.1 在节点 1 测试
# kgp | grep net
default netperf1 1/1 Running 0 2m44s 10.222.3.9 csy-wx-pm-os01-eis-node01 <none> <none>
default netperf2 1/1 Running 0 2m44s 10.222.3.10 csy-wx-pm-os01-eis-node01 <none> <none>
# 启动服务端
root@netperf2:/# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
root@netperf2:/# ss -tunlp
# 客户端测试
# 测试三次
root@netperf1:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 244419 0 2134.81
212992 60.00 243608 2127.73
root@netperf1:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 250220 0 2185.48
212992 60.00 249559 2179.70
root@netperf1:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 246987 0 2157.24
212992 60.00 246238 2150.70
三次测试结果稳定,收发吞吐量偏差<1%.
1.2 在节点 2 测试
default netperf3 1/1 Running 0 7s 10.222.3.56 csy-wx-pm-os01-eis-node02 <none> <none>
default netperf4 1/1 Running 0 7s 10.222.3.57 csy-wx-pm-os01-eis-node02 <none> <none>
# 启动服务端
root@netperf4:/#
root@netperf4:/# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
root@netperf4:/#
[root@csy-wx-pm-os01-eis-node01 zbb]# k exec -it -n default netperf4 -- bash
root@netperf4:/#
root@netperf4:/#
root@netperf4:/# ip a
bash: ip: command not found
root@netperf4:/# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
root@netperf4:/#
# 客户端测试
# 测试三次
# k exec -it -n default netperf3 -- bash
root@netperf3:/#
root@netperf3:/#
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 608513 0 5314.90
212992 60.00 603018 5266.90
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 570150 0 4979.82
212992 60.00 566680 4949.51
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 665268 0 5810.60
212992 60.00 659855 5763.32
root@netperf3:/#
# 这个node2的测试结果却是比其他节点好2-3倍。
root@netperf3:/# netperf -H 10.222.3.56 -t UDP_STREAM -l 60
establish control: are you sure there is a netserver listening on 10.222.3.56 at port 12865?
establish_control could not establish the control connection from 0.0.0.0 port 0 address family AF_UNSPEC to 10.222.3.56 port 12865 address family AF_INET
root@netperf3:/#
# 复测了,如果指定错了没有启动netserver的ip,是无法测试的
三次测试结果稳定,收发吞吐量偏差<1%.
但是 node1 和 node2 上的 pod 存在性能差距,查看cpu型号,内存负载
# node1
# dmidecode -t processor | grep -E "Version|Hz"
Version: Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz
External Clock: 100 MHz
Max Speed: 4000 MHz
Current Speed: 2100 MHz
Version: Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz
External Clock: 100 MHz
Max Speed: 4000 MHz
Current Speed: 2100 MHz
# free -h
total used free shared buff/cache available
Mem: 376Gi 98Gi 112Gi 20Gi 164Gi 257Gi
Swap: 0B 0B 0B
# node 2
# dmidecode -t processor | grep -E "Version|Hz"
Version: Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz
External Clock: 100 MHz
Max Speed: 4000 MHz
Current Speed: 2100 MHz
Version: Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz
External Clock: 100 MHz
Max Speed: 4000 MHz
Current Speed: 2100 MHz
# free -h
total used free shared buff/cache available
Mem: 376Gi 94Gi 101Gi 7.9Gi 180Gi 274Gi
Swap: 0B 0B 0B
可以看到cpu型号一致,内存用量基本一致。 确认内核一致, ovs-ovn 内存一致
# node 1
resources:
limits:
cpu: "1"
memory: 1000Mi
requests:
cpu: 200m
memory: 200Mi
# node2
resources:
limits:
cpu: "1"
memory: 1000Mi
requests:
cpu: 200m
memory: 200Mi
再多对比一个节点
default netperf5 1/1 Running 0 41s 10.222.3.48 csy-wx-pm-os01-eis-node03 <none> <none>
default netperf6 1/1 Running 0 41s 10.222.3.49 csy-wx-pm-os01-eis-node03 <none> <none>
#
# k exec -it -n default netperf6 -- bash
root@netperf6:/# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
root@netperf6:/#
exit
[root@csy-wx-pm-os01-eis-node01 zbb]# k exec -it -n default netperf5 -- bash
root@netperf5:/#
# 测试 3次
[root@csy-wx-pm-os01-eis-node01 zbb]# k exec -it -n default netperf5 -- bash
root@netperf5:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 192751 0 1683.52
212992 60.00 192263 1679.26
root@netperf5:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 195192 0 1704.85
212992 60.00 194715 1700.69
root@netperf5:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 185384 0 1619.19
212992 60.00 185018 1615.99
总结:三个节点上的同节点内的 kube-ovn 的同一vpc两个pod的udp的收发性能能够保持稳定,收发偏差<1%. 但是存在一个节点的性能是另外两个节点点的2-3倍,怀疑可能是有系统配置影响,导致udp性能可显著提升。
跨节点打流
1.3 pod1 --> pod4
[root@csy-wx-pm-os01-eis-node01 zbb]# kgp | grep net
default netperf1 1/1 Running 0 70m 10.222.3.9 csy-wx-pm-os01-eis-node01 <none> <none>
default netperf2 1/1 Running 0 70m 10.222.3.10 csy-wx-pm-os01-eis-node01 <none> <none>
default netperf3 1/1 Running 0 21m 10.222.3.56 csy-wx-pm-os01-eis-node02 <none> <none>
default netperf4 1/1 Running 0 21m 10.222.3.57 csy-wx-pm-os01-eis-node02 <none> <none>
default netperf5 1/1 Running 0 32m 10.222.3.48 csy-wx-pm-os01-eis-node03 <none> <none>
default netperf6 1/1 Running 0 32m 10.222.3.49 csy-wx-pm-os01-eis-node03 <none> <none>
[root@csy-wx-pm-os01-eis-node01 zbb]# k exec -it -n default netperf1 -- bash
root@netperf1:/#
root@netperf1:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
# k exec -it -n default netperf1 -- bash
root@netperf1:/#
root@netperf1:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 119410 0 1042.95
212992 60.00 70 0.61
root@netperf1:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 121156 0 1058.20
212992 60.00 55 0.48
root@netperf1:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 121725 0 1063.17
212992 60.00 53 0.46
root@netperf1:/#
1.4 pod1 --> pod6
root@netperf1:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 119264 0 1041.67
212992 60.00 60 0.52
root@netperf1:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 122037 0 1065.90
212992 60.00 74 0.65
root@netperf1:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 123029 0 1074.56
212992 60.00 62 0.54
1.5 pod3 --> pod2
# k exec -it -n default netperf3 -- bash
root@netperf3:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 87053 0 760.34
212992 60.00 85222 744.35
root@netperf3:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 86701 0 757.26
212992 60.00 86552 755.96
root@netperf3:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 84686 0 739.67
212992 60.00 84561 738.57
1.6 pod3 --> pod6
root@netperf3:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 84773 0 740.42
212992 60.00 42202 368.60
root@netperf3:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 85580 0 747.47
212992 60.00 42677 372.75
root@netperf3:/# netperf -H 10.222.3.49 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.49 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 86095 0 751.97
212992 60.00 45715 399.28
可以看到 node2 的 pod 到 node1 节点上的pod,测试结果好很多。 可以看到 node2 的 pod 到 node3 节点上的pod,测试结果比上者差一半。 node1 到 node2,node1到node3测试结果奇差,几乎为0,怀疑可能是被包出了物理交换机的端口后,被丢包了。
抓包观察性能最好的节点上的两个pod对测时发的udp包的大小
## 没有抓包时的性能
# k exec -it -n default netperf3 -- bash
root@netperf3:/#
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 460004 0 4017.78
212992 60.00 456608 3988.11
## tcpdump -i eth0 host 10.222.3.56 and udp -vv 抓包时的性能,
## 目前看起来损耗不大,<10%
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 428487 0 3742.50
212992 60.00 425747 3718.57
## tcpdump -i eth0 host 10.222.3.56 and udp -vv | grep -v "length 1444" 抓包时的性能,
## 目前看起来性能还提升了(可能是服务器还有其他负载的原因)
root@netperf3:/#
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 587024 0 5127.20
212992 60.00 581101 5075.47
tupdump 抓包显示测试结果:
用该命令抓包,tcpdump -i eth0 host 10.222.3.56 and udp -vv | grep -v "length 1444",会得到以下结果:
14:27:33.159070 IP (tos 0x0, ttl 64, id 3633, offset 65504, flags [none], proto UDP (17), length 31)
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56.39859 > csy-wx-pm-os01-eis-node02.35201: UDP, bad length 65507 > 1416
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
10.222.3.56 > csy-wx-pm-os01-eis-node02: udp
推理出这个udp的包大小其实是 65507,
UDP, bad length 65507 > 1416 这个信息表示在UDP包的头部中指定的长度为65507字节,但是实际接收到的数据包长度只有1416字节。这种不匹配的情况通常被认为是不正常的,可能是由于数据包损坏、网络问题或其他错误引起的。
是的,虽然在UDP包头部指定的长度和实际接收到的长度不匹配可能表示存在异常情况,但有些网络性能测试工具(比如netperf)可能会忽略这种不匹配,而继续发送指定长度的数据包来测试网络吞吐量或性能。在这种情况下,测试工具可能会继续发送大小为65507字节的UDP包,以评估网络的吞吐量和表现。
在这种情况下,当netperf的客户端发送一个UDP包大小为65507字节的数据包时,而网卡的MTU(最大传输单元)为1400字节,这个包将在转发过程中进行分片。MTU是指在每一层网络参与者(例如网卡、路由器、交换机等)能够接收或发送的最大数据包的大小。
由于65507字节的UDP数据包大于网卡的MTU,网络设备在转发这个数据包时会将其分割成更小的片段(通常为1400字节的分片),以便在网络上正确传输。在目标端,这些分片会被重新组装成原始的UDP数据包。这个过程在网络协议栈的传输层(如UDP协议)中处理,以确保数据的可靠传输。
UDP协议本身并不提供分片和重新组装数据包的功能。在OSI模型中,UDP是传输层协议,负责在主机之间传输数据,但不提供可靠的传输、重组装分片、拥塞控制等功能。
当UDP数据包超过网络设备的MTU时(导致需要分片),分片和重新组装的功能主要由网络层的协议来处理。在IP协议中,负责处理分片和重新组装数据包的是分片(fragmentation)机制,由IP协议中的路由器负责将过大的IP数据包分片为更小的片段,在目的端点重新组装。这种分片机制只会在IP层级进行,UDP协议本身并不干涉分片和重新组装的具体细节。
因此,尽管UDP数据包可能会被分片,但分片和重新组装的过程是由网络层的IP协议来处理的,而不是由UDP协议本身。UDP协议更侧重于提供简单的数据传输服务,不负责处理分片和重组的细节。
统计 node2 的测试数据,正常包和异常包的比例
root@netperf3:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 623744 0 5447.92
212992 60.00 619608 5411.80
rm -f pkts;
tcpdump -i eth0 host 10.222.3.56 and udp -nvv | tee pkts
## 文件行数,约总包数 * 2
## wc -l pkts
7919352 pkts
# grep "length 1444" pkts | wc -l
3876052
# grep "bad length" pkts | wc -l
84701
# grep "bad length 65507" pkts | wc -l
84701
# 错误比例 84701/3876052=0.021
小结:在 node2 观察到很少的 bad length 65507 > 1416 的提示。如果性能差,应该要首先注意下包的总数,大包的(1444)总数 ,以及 bad length 的比例。
统计 node1 的测试数据,正常包和异常包的比例
## 未抓包时的基准,可以看到收发相差不大,应该部署服务端少收包
# k exec -it -n default netperf1 -- bash
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/#
root@netperf1:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 255377 0 2230.52
212992 60.00 253850 2217.18
## 抓包时
root@netperf1:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 239098 0 2088.34
212992 60.00 238232 2080.77
## 抓包
rm -f pkts;
tcpdump -i eth0 host 10.222.3.9 and udp -nvv | tee pkts
## 总行数 总包数 * 2 (几乎是)
# wc -l pkts
5945207 pkts
## 总包数
# grep "10.222.3.9 > 10.222.3.10" pkts | wc -l
2909323
# grep "length 1444" pkts | wc -l
2909398
# grep "bad length" pkts | wc -l
63280
# grep "bad length 65507" pkts | wc -l
63280
# 错误比例 63280/2909323=0.021
小结:在 node1 观察到很少(比例和node1相同)的 bad length 65507 > 1416 的提示。性能差,是因为包的总数少一倍,大包的(1444)总数也少一倍 ,以及 bad length 的比例。
对比跨节点的测试结果
1.5 1.3 pod1 --> pod4
root@netperf1:/# netperf -H 10.222.3.57 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.57 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 120432 0 1051.88
212992 60.00 99 0.86
# 可以看到数据奇差无比
rm -f pkts;
tcpdump -i eth0 host 10.222.3.56 and udp -nvv | tee pkts
## 文件行数,约总包数 * 2
# wc -l pkts
3876501 pkts
## grep "length 1444" pkts | wc -l
1897536
# grep "bad length" pkts | wc -l
42523
# grep "bad length 65507" pkts | wc -l
42523
# 错误比例 42523/1897536=0.022
小结: 无论是同节点还是跨节点,node上的pod发出去的包被服务端pod接收到的数目基本一致,所以应该不是发包的问题。如果同样的包,服务端收到之后给客户端确认,服务端收到确认。那么这个包和同节点的测试结果应该基本差不了多少。
1.6 pod3 --> pod2
# 可以看到跨节点数据大概是node1同节点的 1/3
root@netperf3:/# netperf -H 10.222.3.10 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.222.3.10 () port 0 AF_INET : demo
enable_enobufs failed: getprotobyname
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
212992 65507 60.00 85270 0 744.77
212992 60.00 77589 677.68
# 可以看到数据奇差无比
rm -f pkts;
tcpdump -i eth0 host 10.222.3.56 and udp -nvv | tee pkts
## 文件行数,约总包数 * 2
# # wc -l pkts
3834122 pkts
## grep "length 1444" pkts | wc -l
1876276
# grep "bad length" pkts | wc -l
40798
# grep "bad length 65507" pkts | wc -l
40798
# 错误比例 40798/1876276=0.021
总结: 基于 vpc 场景跨节点,同节点对比测试来看,当前环境至少存在三个问题:
- 同节点测试: node1 和 node3 基本一致,但是是node2性能的1/3,这个应该可以通过配置优化
- 跨节点测试: node1 发起的到node2|node3的pod,几乎全部丢包
- 跨节点测试:node2 发起的到node1的pod几乎不丢包,但性能和同节点有显著差异,是node同节点测试的1/3
目前没有共性问题,都是特例。应该和操作系统环境以及网卡以及交换机有关系。
1.3 在节点 1 测试
1.4 在节点 2 测试
2. 基于 netshoot pod netperf 测试本地 vlan pod udp stream 性能
2.1 在节点 1 测试
2.2 在节点 2 测试
将 ovs 内存和cpu 提升一倍,观察是否可提升性能