netperf 测试一个 kube-ovn udp 基准

111 阅读21分钟

工具:

在 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 场景跨节点,同节点对比测试来看,当前环境至少存在三个问题:

  1. 同节点测试: node1 和 node3 基本一致,但是是node2性能的1/3,这个应该可以通过配置优化
  2. 跨节点测试: node1 发起的到node2|node3的pod,几乎全部丢包
  3. 跨节点测试: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 提升一倍,观察是否可提升性能

2.3 在节点 1 测试

2.4 在节点 2 测试

3. 基于 netshoot pod netperf 测试物理机间业务网卡 udp stream 性能

3.1 节点1 <--> 测试

4. 基于 netshoot pod netperf 测试跨节点 vlan pod udp stream 性能

4.1 在节点1 测试

4.2 在节点2 测试