4、网络高级特性:配置网桥实现容器网络互通,配置VLAN子接口,配置网络吞吐量测试
好,咱们继续往下走。前面几章我们把Jetson的基础网络配置、双网卡绑定、还有路由策略都捋了一遍。说实话,那些是基本功,就像练武要扎马步一样。但到了实际项目中,你会发现光有这些还不够。
比如,你跑着好几个Docker容器,它们之间怎么通信?再比如,你接了个交换机,上面划分了不同的VLAN,你的Jetson怎么同时接入多个VLAN?还有,你辛辛苦苦配好了网络,到底能跑多快?心里没底可不行。
这一章,我就带你把这几个高级特性啃下来。我个人觉得,这是从「会用网络」到「会调网络」的分水岭。
4.1 配置网桥(Bridge)实现容器网络互通
先说说网桥。说白了,网桥就是一个虚拟的交换机。你的物理网卡、虚拟网卡、容器里的网卡,都可以插到这个虚拟交换机上。这样一来,它们就在同一个二层网络里了,互相通信毫无障碍。
我在项目中遇到过一种情况:Jetson上跑了三个AI推理容器,每个容器都需要访问同一个摄像头数据流。如果不用网桥,你得搞端口映射,麻烦不说,性能还差。用了网桥,容器之间直接通过内部IP通信,延迟低得多。
4.1.1 创建网桥并绑定物理网卡
Jetson用的是NetworkManager,但配置网桥我建议直接用nmcli,或者干脆手动改配置文件。我个人习惯用nmcli,因为命令清晰,不容易出错。
先看看当前网络设备状态:
nmcli device status
假设你的物理网卡是eth0,我们要创建一个叫br0的网桥,然后把eth0加进去。
# 创建网桥
sudo nmcli connection add type bridge con-name br0 ifname br0
# 把物理网卡eth0作为网桥的从属端口
sudo nmcli connection add type bridge-slave con-name br0-port1 ifname eth0 master br0
# 给网桥配置IP地址(原来eth0的IP要移过来)
sudo nmcli connection modify br0 ipv4.addresses 192.168.1.100/24
sudo nmcli connection modify br0 ipv4.gateway 192.168.1.1
sudo nmcli connection modify br0 ipv4.dns 8.8.8.8
sudo nmcli connection modify br0 ipv4.method manual
# 停掉原来的eth0连接,启动网桥
sudo nmcli connection down eth0
sudo nmcli connection up br0
嗯,这里要注意:原来的eth0连接会被自动禁用,因为它的物理端口已经被网桥占用了。你执行完up br0之后,用ip a看一下,应该能看到br0有了IP,而eth0变成了无IP状态。
4.1.2 让Docker容器使用网桥
默认情况下,Docker会创建一个叫docker0的网桥。但那个是Docker自己管的,跟我们的br0是两码事。要让容器直接接入br0,你需要用macvlan或者ipvlan驱动。
我个人更推荐macvlan,因为它让每个容器都有独立的MAC地址,看起来就像一台独立的物理机。
# 创建一个macvlan网络,绑定到br0
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=br0 \
my_macvlan_net
然后启动容器时指定这个网络:
docker run -itd --name container1 --network my_macvlan_net --ip 192.168.1.50 nvidia/cuda:11.0-runtime
docker run -itd --name container2 --network my_macvlan_net --ip 192.168.1.51 nvidia/cuda:11.0-runtime
现在,这两个容器可以直接用IP地址互相ping通。你想想看,它们跟宿主机也在同一个二层网络里,是不是很方便?
4.2 配置VLAN子接口
接下来聊VLAN子接口。这个在工业现场太常见了。你想想看,一个工厂里可能有办公网、生产网、监控网,它们用VLAN隔离开。你的Jetson如果只接一根网线,怎么同时访问这三个网络?
答案就是VLAN子接口。在Linux里,你可以给一个物理网卡创建多个带VLAN标签的逻辑接口。每个接口对应一个VLAN。
4.2.1 使用nmcli配置VLAN子接口
假设物理网卡是eth0,交换机上已经配好了VLAN 10(办公网)、VLAN 20(生产网)、VLAN 30(监控网)。Jetson的eth0要接在Trunk口上。
# 创建VLAN 10子接口
sudo nmcli connection add type vlan con-name eth0.10 ifname eth0.10 vlan.parent eth0 vlan.id 10
sudo nmcli connection modify eth0.10 ipv4.addresses 10.0.10.100/24
sudo nmcli connection modify eth0.10 ipv4.method manual
# 创建VLAN 20子接口
sudo nmcli connection add type vlan con-name eth0.20 ifname eth0.20 vlan.parent eth0 vlan.id 20
sudo nmcli connection modify eth0.20 ipv4.addresses 10.0.20.100/24
sudo nmcli connection modify eth0.20 ipv4.method manual
# 创建VLAN 30子接口
sudo nmcli connection add type vlan con-name eth0.30 ifname eth0.30 vlan.parent eth0 vlan.id 30
sudo nmcli connection modify eth0.30 ipv4.addresses 10.0.30.100/24
sudo nmcli connection modify eth0.30 ipv4.method manual
# 启动所有子接口
sudo nmcli connection up eth0.10
sudo nmcli connection up eth0.20
sudo nmcli connection up eth0.30
配置完成后,用ip a查看,你会看到eth0.10、eth0.20、eth0.30三个接口,各自有独立的IP地址。这时候,你的Jetson就可以同时跟三个VLAN里的设备通信了。
4.2.2 验证VLAN通信
你可以用ping测试一下:
# 从VLAN 10 ping VLAN 10内的设备
ping -I eth0.10 10.0.10.1
# 从VLAN 20 ping VLAN 20内的设备
ping -I eth0.20 10.0.20.1
如果VLAN之间需要互通,那就要靠三层交换机或者路由器了。Jetson本身不做路由转发的话,不同VLAN子接口之间默认是隔离的。
4.3 配置网络吞吐量测试(iperf3)
网络配好了,到底快不快?别靠感觉,咱们用数据说话。iperf3是业界标准的网络性能测试工具,轻量、准确、跨平台。
我每次部署完网络,第一件事就是跑一遍iperf3。有一次在客户现场,千兆网卡死活只能跑到300Mbps,查了半天发现是网线质量太差。要是没跑测试,光靠感觉,这问题根本发现不了。
4.3.1 安装iperf3
Jetson上安装很简单:
sudo apt update
sudo apt install iperf3 -y
另一台测试用的电脑(或者另一个Jetson)也要装上。
4.3.2 基本吞吐量测试
先在一台设备上启动服务端:
iperf3 -s
默认监听5201端口。然后在客户端运行:
iperf3 -c 192.168.1.100
你会看到类似这样的输出:
Connecting to host 192.168.1.100, port 5201
[ 5] local 192.168.1.50 port 45678 connected to 192.168.1.100 port 5201
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.09 GBytes 941 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 1.09 GBytes 940 Mbits/sec 0 receiver
940 Mbits/sec,嗯,千兆网卡跑满了,说明物理链路没问题。
4.3.3 双向测试与UDP测试
有时候网络是单向瓶颈,比如上传和下载速度不一样。用双向模式可以同时测:
iperf3 -c 192.168.1.100 -d
如果你要测试UDP吞吐量(比如视频流场景),加上-u参数:
iperf3 -c 192.168.1.100 -u -b 100M
这个命令会以100Mbps的速率发送UDP包。输出里会显示丢包率(Lost/Total Datagrams)。对于实时视频传输,丢包率超过1%就明显卡顿了。
- Bitrate:实际吞吐量,越接近理论值越好
- Retr:TCP重传次数,0最好,数值大说明网络有拥塞或丢包
- Jitter(UDP测试):抖动,视频会议要求低于30ms
- Lost/Total(UDP测试):丢包率,越低越好
4.3.4 测试VLAN子接口和网桥的性能
你可以分别测试每个VLAN子接口的吞吐量:
iperf3 -c 10.0.10.1 -B 10.0.10.100
iperf3 -c 10.0.20.1 -B 10.0.20.100
-B参数指定了从哪个接口发起测试。这样就能确认每个VLAN的带宽是否达标。
对于网桥场景,你可以测试容器到容器的吞吐量:
# 在container1里启动iperf3服务端
docker exec container1 iperf3 -s &
# 在container2里运行客户端
docker exec container2 iperf3 -c 192.168.1.50
如果容器之间跑不满带宽,检查一下macvlan的驱动模式,或者看看是不是CPU瓶颈了。Jetson的ARM架构在高速网络处理上,有时候确实不如x86,但跑满千兆是没问题的。
taskset把iperf3绑定到空闲的核心上。
好了,这一章的内容就这些。网桥、VLAN子接口、iperf3测试,这三个技能在实际项目中几乎是必用的。你把这些练熟了,Jetson的网络配置这块基本就没什么能难住你的了。
下一章,咱们聊聊更进阶的内容——网络监控与故障排查。到时候我会分享一些我踩过的坑,保证让你少走弯路。