Intel IGB网卡

1 Intel IGB网卡 - I210
1.1 IOAT
ioat:主要包含IntMod,quick-data,rss,dca,offload,dmac,MSI-X等

1.2 网卡多队列
1.2.1 RSS - Microsoft提出
lspci -vvv
cat /proc/interrupts - 如果看到eth0-TxRx-0等表示支持硬件多队列
tx_ring->count:ring buffer的个数,igb默认是256

将每个设备申请的rx队列与tx队列调整为1;调整方法是:
@ igb.h
IGB_MAX_RX_QUEUES
IGB_ABS_MAX_TX_QUEUES
IGB_MAX_TX_QUEUES
三个宏的値全部改为1。 

IO-APIC 有两种工作模式:logic 和 physical
- 在 logic 模式下 IO-APIC 可以同时分布同一种 IO 中断到8颗 CPU (core) 上(受到 bitmask 寄存器的限制,因为 bitmask 只有8位长。);
- 在 physical 模式下不能同时分布同一中断到不同 CPU 上,比如,不能让 eth0 中断同时由 CPU0 和 CPU1 处理,这个时候只能定位 eth0 到 CPU0、eth1 到 CPU1,也就是说 eth0 中断不能像 logic 模式那样可以同时由多个 CPU 处理。

1.2.2 softirq - Google提出
- RPS,receive packet steering
- RFS,receive flow steering

1.3 Linux网卡驱动2个重要函数
struct net_device {
    [...]
    dev_addr; // arp
    set_mac_address; // ifconfig eth0 hw ether 00:11:22:33:44:55
    set_multicast_list; // promiscuous and multicast, ifconfig eth0 promisc / ifconfig eth0 -promisc
    [...]
};

1.4 关闭I210网卡的硬件tcp分段功能
ethtool -k eth0
ethtool -K eth0 tso off

1.5 Linux网卡流量控制工具tc
script实现
HTB: Hierarchical Token Bucket
burst: size of the bucket, in bytes. This is the maximum amount of bytes that tokens can be available for instantaneously, whose minimum buffer size is equal to rate / HZ(egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`). The final piece is a token-making machine that adds rate/HZ tokens to the bucket every tick

# tc uses the following units when passed as a parameter.
# kbps: Kilobytes per second
# mbps: Megabytes per second
# kbit: Kilobits per second
# mbit: Megabits per second
# bps: Bytes per second
#
# Amounts of data can be specified in:
# kb or k: Kilobytes
# mb or m: Megabytes
# mbit: Megabits
# kbit: Kilobits
# To get the byte figure from bits, divide the number by 8 bit
#

# disable eth0 qdisc
tc qdisc del dev eth0 root

# enable eth0 qdisc
# parent class: 1
# subclass ID: 1
tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate 200kbps ceil 200kbps burst 4k # burst max 4 Kilobytes per 1/HZ
tc class add dev eth0 parent 1: classid 1:20 htb rate 90mbit ceil 95mbit burst 14k # burst max 14 Kilobytes per 1/HZ
tc filter add dev eth0 parent 1: prio 1 protocol ip u32 match ip dport 8000 0xffff flowid 1:1

2 i210 EAVB
2.1 PTP - IEEE 1588
- 整个网络ptp时钟同步,有一个daemon叫gptp
- 另一个根据网络调整时间的协议是NTP
- 调整SoC系统RTC时间的API是__NR_clock_adjtime
- 网络硬件时间戳SO_TIMESTAMPING
- UDP方式处理PTP报文;linux_hal_intelce.cpp和linux_hal_common.cpp
- PTP模块一般集成在以太网PHY中,分辨率能够达到8ns
- PTP分master和slave,如果时间精度要求较高,比如几十ns,必须使能交换芯片的IEEE1588
- 计时的秒数从01-01-1970 00:00:00开始(同RTC),ptp有秒(48bit)和纳秒(32bit)2个寄存器;而普通的RTC只有秒计数寄存器
- ptp实际上就是一个高精度RTC,network上的master不断将自己的ptp时间广播给网络中每一个slave设备,每一个slave设备调整自己PHY中的ptp秒和纳秒
- 路径/sys/class/rtc和/sys/class/ptp

2.2 MRP
- 运行在二层协议MAC层
- MRP(Multiple Registration Protocol)多属性注册协议,传递SRP带宽预留的消息;一种“信令”系统,实现整条路径上的带宽预约
- raw方式处理MRP报文;mrpd.c

2.3 MMAP
MMAP: Multicast Address Acquisition Protocol,for MAC addresses

2.4 1722
- 注册1个字符设备/dev/igb_avb,用到了用户空间libpci库
- 将I210的地址空间mmap到用户空间,libigb.a操作/dev/igb_avb的硬件队列0和队列1,普通的socket应用发送数据到硬件队列2和队列3(skb->queue_mapping)
- AVB交换机需要用到VLAN,AVB VLAN的3bit TCI的值对应到交换机8个内部队列中的一个,交换机根据TCI(或者PCP)优先级决定8个队列的发送顺序
- Linux tc(traffic control)工具对AVB(eth_header、1722_header、61883_header,其中1722和61883是大端格式)的流量没有影响,只影响通过socket发送的数据
- 发送时,1722_header中的字段timestamp由I210每次发送时(间隔125us or 250us)自动填充(TSYNCTXCTL.EN)
- 接收时,1722_header中的字段timestamp由I210的寄存器TSYNCRXCTL和TSYNCRXCFG控制
- PCP2 is mapping to traffic class 6 (Class B)
- PCP3 is mapping to traffic class 7 (Class A)

2.5 网卡硬件时间戳
- 检查网卡是否支持硬件时间戳
ethtool -T eth0

3 virtio_net
3.1 驱动原理
发送数据,写设备寄存器触发中断通知虚拟机:vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY

Virtual I/O Device (VIRTIO) Version 1.0 http://docs.oasis-open.org/virtio/virtio/v1.0/csprd01/virtio-v1.0-csprd01.html

3.2 tcpdump抓包原理
__netif_receive_skb_core()
xmit_one() 

tcpdump -i eth0 -s 0 ip multicast -w /data/virtio_net.pcap
tcpdump -i eth0 -s 0 ether multicast -w /data/virtio_net.pcap

4 多端口网卡
i350-t2:2端口网卡,枚举成2个网卡,eth0和eth1
i350-t4:4端口网卡,枚举成4个网卡,eth0、eth1、eth2和eth3
Intel 82571EB:
82599:multi-function PCIe设备,支持两个网口,万兆以太网物理层接口XAUI(读作Zowie)收发都是4-Lane,每个Lane的速度是3.125Gb/s

多端口网卡可以用来搭建软路由。选择其中一个ethX做WAN口,剩余的做LAN口。这个不同于外挂交换机的路由器(SoC上只有一个物理网卡接口eth0,其它的口都是交换机上的口)。

5 RDMA
5.1 原理
通用的RDMA实现是RoCEv2,其中TCP/UDP(包括TSO,TCP分段减负)、IP、MAC层都有硬件实现。
RDMA的性能提升本质上来自于整个协议栈的offload。

5.2 URLs
RDMA core userspace libraries and daemons
https://github.com/linux-rdma/rdma-core

6 Abbreviations
ioat:Intel Ethernet I/O Acceleration Technology
MIB:Management Information Base,交换机收发数据统计模块
OFA:OpenFabrics Alliance
PTP:Precision Time Protocol ,精准时间同步协议
Qav:Queuing and Forwarding Protocol,队列及转发协议
tdt:tx_descriptor_tail
Traffic Shaping:流量整形
TSO:TCP Segment Offload,把TCP数据分段放到网卡(offload)来做

你可能感兴趣的:(Network)