对于一块单独的solarflare网卡进行性能测试,如何进行?
solarflare x2万兆光网卡上面有两个port,通过光纤直连这两个port进行测试。如果不做任何其他的设置,直接一个port Ip作为client地址,另一个port作为server地址,这样测试的结果是不准确的。你可以尝试把光驱从光模块上拔掉,会发现数据发送接收不受影响。
这是如何实现的?环回接口允许在同一台主机上的客户程序和服务器程序通过tcp/ip进行通信。任何传给该主机ip地址的数据均送到环回接口,传给回环接口的任何数据均作为ip输入。也就是走的local路由表的loopback。
那么如何实现一个从一个port发送经过光纤被另外一个port接收到呢?使用net namespace可以实现。Namespace是Linux的一种轻量级的虚拟化,提供了更精细化的资源管理方式。Net namespace用来隔离网络设备,ip地址,端口等。每个net namespace都有自己独立的网络栈、路由表、防火墙规则、socket等。
逻辑拓扑:
enp130s0f0np0 ß--------光纤--------à enp130s0f1np1
enp130s0f0np0和enp130s0f1np1是solarflare万兆光网卡的两个port,它们通过光纤连接。
1>添加一个netns
ip netns add t1
2>将enp130s0f1np1加入命名空间t1
ip link set enp130s0f1np1 netns t1
3>设置enp130s0f1np1的ip地址
ip netns exec t1 ifconfig enp130s0f1np1 192.168.1.101
完成之后通过ifconfig命令将看不到enp130s0f1np1,
4>运行client程序,client使用enp130s0f1np1
ip netns exec t1 ./client_new
或者使用onload:
ip netns exec t1 onload -p latency taskset -c 1 ./client_new
5>运行server程序,service使用enp130s0f0np0
./server
或者使用onload:
onload -p latency taskset -c 3 ./server
按照上面配置方式测试,从同一网卡的port0传递数据到port1会通过光纤,而不是像之前那样走的local路由表的loopback。