我有一台 Ubuntu 22.04 服务器、一台 MikroTik CRS328-24P-4S+RM 交换机和以太网连接的摄像头。我想增加所有系统的 MTU,以便传输巨型帧,从而减少从许多摄像头接收高清流时服务器的 CPU 负载,但我注意到,即使使用默认 MTU 设置(1500 字节),摄像头也会发送巨型帧。
更详细地:
- 服务器上
ip l
显示的网络接口为:2: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
即 MTU 1500。 - 在交换机管理 Web 界面上,我检查了服务器接口和摄像头接口的 MTU。它们设置为 MTU = 1500,L2 MTU = 1592。
- 我不知道如何检查相机的 MTU(对我来说它们是一个黑匣子)。
我检查了传输的数据包的大小:
在服务器上,我用 tcpdump 查看了数据包。
tcpdump -i eno2 -s 100 -e | less
显示数据包如下:16:25:06.315612 <MAC redacted> (oui Unknown) > <MAC redacted> (oui Unknown), ethertype IPv4 (0x0800), length 9014: camera1.3957 > server.46179: UDP, length 8972
。以太网数据包的大小为 9014 字节。我禁用了服务器上的“卸载”,如https://wiki.wireshark.org/CaptureSetup/Offloading
ethtool --offload eno2 rx off tx off
中所述。在交换机上,我可以看到相机接口的 RX 速率约为 500 Mbps,RX 数据包速率约为 7000 p/s。结果为
((500/8)*1024*1024)/7000
= ~9362 字节/数据包。
问题:
我上面的分析有错误吗?
网络设备有可能发送大于中间设备配置的MTU的UDP数据包吗?
附录:
结果ethtool --show-offload eno2
:
Features for eno2:
rx-checksumming: off
tx-checksumming: off
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: off
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
tx-tcp-segmentation: off [requested on]
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: off [requested on]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: on
receive-hashing: on
highdma: off [fixed]
rx-vlan-filter: on
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-gre-csum-segmentation: off [fixed]
tx-ipxip4-segmentation: off [fixed]
tx-ipxip6-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
tx-udp_tnl-csum-segmentation: off [fixed]
tx-gso-partial: on
tx-tunnel-remcsum-segmentation: off [fixed]
tx-sctp-segmentation: off [fixed]
tx-esp-segmentation: off [fixed]
tx-udp-segmentation: on
tx-gso-list: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
l2-fwd-offload: off [fixed]
hw-tc-offload: on
esp-hw-offload: off [fixed]
esp-tx-csum-hw-offload: off [fixed]
rx-udp_tunnel-port-offload: off [fixed]
tls-hw-tx-offload: off [fixed]
tls-hw-rx-offload: off [fixed]
rx-gro-hw: off [fixed]
tls-hw-record: off [fixed]
rx-gro-list: off
macsec-hw-offload: off [fixed]
rx-udp-gro-forwarding: off
hsr-tag-ins-offload: off [fixed]
hsr-tag-rm-offload: off [fixed]
hsr-fwd-offload: off [fixed]
hsr-dup-offload: off [fixed]
交换机上仍有一个接口配置了较大的 MTU。将此 MTU 更改为正常大小(MTU=1500 且 L2MTU 为 1592)后,所有摄像头都不再发送巨型帧,而只发送正常大小的帧。
所以我的结论是:提高此交换机上任何接口(即使是未使用的接口)的 L2 MTU使得可以在任何接口之间发送巨型帧。
此外,接收服务器上的 MTU 不会影响此行为。它仍配置为 1500,但服务器成功接收巨型帧。这与 Tom Yan 的建议相符:
由于摄像机通过 UDP 进行通信,因此这个想法听起来很现实。