1 准备工作
如果有实际的硬件支持,可以直接从1.3开始
1.1 设定 VMware
Processors :2
增加2个 network adapter
1.2 确认状态
因为pktgen运行在内核态,用root登录VM
加载pktgen
root@ubuntu:~# modprobe pktgen
root@ubuntu:~# lsmod | grep pktgen
pktgen 53248 0
root@ubuntu:~#
root@ubuntu:~# lspci | grep -i ethernet
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:06.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) <=新增
02:07.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) <=新增
root@ubuntu:~#
1.3 开启2个端口
我安装的是ubuntu18版本,会显示ens 而不是 eth
root@ubuntu:~# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.121.135 netmask 255.255.255.0 broadcast 192.168.121.255
inet6 fe80::20c:29ff:fedf:924f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:4f txqueuelen 1000 (Ethernet)
RX packets 1280 bytes 145948 (145.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 956 bytes 176323 (176.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fedf:9259 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:59 txqueuelen 1000 (Ethernet)
RX packets 18 bytes 1656 (1.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1006 (1.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens39: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fedf:9263 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:63 txqueuelen 1000 (Ethernet)
RX packets 18 bytes 1656 (1.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1006 (1.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 112 bytes 8456 (8.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 112 bytes 8456 (8.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@ubuntu:~# ifconfig ens38 up
root@ubuntu:~# ifconfig ens39 up
root@ubuntu:~#
1.4 link up
root@ubuntu:~# ethtool ens33
Settings for ens33:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes <==
2 设定pktgen
设定双核,这样就可以让ens38 ens39分别由一个核心来负责
在/proc/net/pktgen 会看到 kpktgend_0 kpktgend_1
(有几个核心就会显示几个 kpktgend_x)
root@ubuntu:~# cd /proc/net/pktgen
root@ubuntu:/proc/net/pktgen# ls
kpktgend_0 kpktgend_1 pgctrl
root@ubuntu:/proc/net/pktgen# echo "add_device ens38" > kpktgend_0
root@ubuntu:/proc/net/pktgen# echo "add_device ens39" > kpktgend_1
这样就会生成2个文件ens38 ens39
root@ubuntu:/proc/net/pktgen# ls
ens38 ens39 kpktgend_0 kpktgend_1 pgctrl
root@ubuntu:/proc/net/pktgen# cat ens38
Params: count 1000 min_pkt_size: 0 max_pkt_size: 0
frags: 0 delay: 0 clone_skb: 0 ifname: ens38
flows: 0 flowlen: 0
queue_map_min: 0 queue_map_max: 0
dst_min: dst_max:
src_min: src_max:
src_mac: 00:0c:29:df:92:59 dst_mac: 00:00:00:00:00:00
udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9
src_mac_count: 0 dst_mac_count: 0
Flags:
Current:
pkts-sofar: 0 errors: 0
started: 0us stopped: 0us idle: 0us
seq_num: 0 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
cur_saddr: 0.0.0.0 cur_daddr: 0.0.0.0
cur_udp_dst: 0 cur_udp_src: 0
cur_queue_map: 0
flows: 0
Result: Idle
互相绑定 mac
root@ubuntu:/proc/net/pktgen# echo "dst_mac 00:0c:29:df:92:63" > ens38
root@ubuntu:/proc/net/pktgen# echo "dst_mac 00:0c:29:df:92:59" > ens39
设定要测的封包大小
root@ubuntu:/proc/net/pktgen# echo "pkt_size 1000" > ens38
root@ubuntu:/proc/net/pktgen# echo "pkt_size 1000" > ens39
设定要测的封包数量
root@ubuntu:/proc/net/pktgen# echo "count 1000000" > ens38
root@ubuntu:/proc/net/pktgen# echo "count 1000000" > ens39
最后是这样
root@ubuntu:/proc/net/pktgen# cat ens38
Params: count 1000000 min_pkt_size: 1000 max_pkt_size: 1000
frags: 0 delay: 0 clone_skb: 0 ifname: ens38
flows: 0 flowlen: 0
queue_map_min: 0 queue_map_max: 0
dst_min: dst_max:
src_min: src_max:
src_mac: 00:0c:29:df:92:59 dst_mac: 00:0c:29:df:92:63 <== 由原来的00 变成了ens39的地址
udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9
src_mac_count: 0 dst_mac_count: 0
Flags:
Current:
pkts-sofar: 0 errors: 0
started: 0us stopped: 0us idle: 0us
seq_num: 0 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
cur_saddr: 0.0.0.0 cur_daddr: 0.0.0.0
cur_udp_dst: 0 cur_udp_src: 0
cur_queue_map: 0
flows: 0
Result: OK: count=1000000
3 pktgen 测试
3.1
关注点是 RX packets, TX packets, 以 ens39为例
RX packets 102 bytes 9384 (9.3 KB)
TX packets 15 bytes 1146 (1.1 KB)
root@ubuntu:/proc/net/pktgen# ifconfig ens39
ens39: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fedf:9263 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:63 txqueuelen 1000 (Ethernet)
RX packets 102 bytes 9384 (9.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15 bytes 1146 (1.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.2 进行测试
执行echo之后.会 5~10s 时间, 要等测试结束
root@ubuntu:/proc/net/pktgen#
root@ubuntu:/proc/net/pktgen# echo start > pgctrl
3.3 结果分析
root@ubuntu:/proc/net/pktgen# ifconfig ens39
ens39: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fedf:9263 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:63 txqueuelen 1000 (Ethernet)
RX packets 1000102 bytes 1000009384 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1000015 bytes 1000001146 (1.0 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
RX=1000102 - 102 = 1000000
TX=1000015 - 15 = 1000000
就等于前面设定的count 1000000
echo “count 1000000” > ens39
ens38也是差不多…
root@ubuntu:/proc/net/pktgen# ifconfig ens38
ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fedf:9259 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:92:59 txqueuelen 1000 (Ethernet)
RX packets 1000114 bytes 1000010488 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1000015 bytes 1000001146 (1.0 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0