任务描述
- 某型号服务器(银河Kylin系统,linux内核)拥有两个千兆以太网口和两个万兆光口,将两个千兆以太网口直连,将两个万兆光口直连,使用iperf工具测试接口带宽。
实现原理
-
错误方法:以千兆以太网口为例,如果仅将两个网口的IP地址改为同一子网下,使用iperf工具直接创建服务器和客户端进行测试是不正确的。此时两个网卡的IP地址都会被内核视为本地地址,从而不经过物理层,直接以lo的方式完成数据转发。也就是说,数据并没有经过网口1——网线——网口2。
-
正确方法:使用net namespace方式,将物理网卡隔离到不同的网络命名空间中。
网络命令空间:在linux协议栈中引入网络命名空间,是为了支持网络协议栈的多个实例,而这些协议栈的隔离就是通过命名空间来实现的,一个net namespace为进程提供一个完全独立的网络协议栈的视图,包括网络设备接口、ipv4和ipv6协议栈、ip路由表、防火墙规则、sockets等。一个net namespace提供了一份独立的网络环境,就跟独立的系统一样。一个物理设备只能存在于一个net namespace中,但可以从一个net namespace移动到另一个net namespace。
测试步骤
- 创建一个netns
ip netns add g1 #g1是自己确定的netns名称
- 将某个网络设备移动到新的空间中
#通过ifconfig命令可以查看系统默认netns中存在的网络设备实例
#该型号服务器的四个网络设备名称分别为enp11s0(以太网1)、enp12s0(以太网2)、enp14s0f0(光口1)、enp14s0f1(光口2)
ip link set enp14s0f0 netns g1 #将光口1移动到g1空间中
ip netns exec g1 ifconfig enp14s0f0 192.168.1.101 #设置g1空间中光口1的ip地址
#ip netns exec g1类似于c语言中的"std::",即命令空间前缀
- 使用iperf工具进行自环测试
#建立iperf服务器
ip netns exec g1 iperf3 -B 192.168.1.101 -s
#使用光口2作为客户端
ifconfig enp14s0f1 192.168.1.55 #改动光口2的ip地址,使其与光口1处于同一子网中
iperf3 -B 192.168.1.55 -c 192.168.1.101 -t 20 #进行20秒打流
- 测试结果示例

附录
- 上述配置在系统重启后会还原,放心测试。