服务器网卡,10GE设备相关笔记

连接线

铜线

六类线基本可以满足万兆, 万兆网络一般只在短程使用铜线, 或者完全不用铜线

光纤

根据带宽和距离, 分为OM2, OM3, OM4等, OM2一般用于千兆或者短距离万兆, 长距离万兆使用OM3, OM4.
根据波长类型
常见的光纤有850nm, 1310nm, 1550nm, 其中850nm为多模光纤一般为水蓝色, 1310nm和1550nm为单模, 黄色居多.
根据接头类型

  • FC, Ferrule Connector, 其外部加强件是采用金属套,紧固方式为螺丝扣。圆形带螺纹接头,是金属接头, 电信运营商用的比较多.
  • ST, Stab & Twist, 多模网络中最常见的连接设备。它具有一个卡口固定架,和一个2.5毫米长圆柱体的陶瓷(常见)或者聚合物卡套以容载整条光纤。插入,然后拧紧. 外壳为圆形,固定方式为螺丝扣.
  • SC, Square Connector, 标准方形接头,直接插拔,使用方便。采用工程塑料, 早先年的交换机上的GBIC模块都是用这个接口.
  • LC, 与SC接头形状相似, 较SC接头小一些. 路由器常用的SFP, mini GBIC所插的线头都是LC
  • DSC, 是SC的一种,不过是把两个SC头连到一起,好处是防误插,不会把收光的口插上收光的线。SC接口可以插到接DSC的插座上,但DSC的接口不能插到SC的插座上
  • DLC, 和DSC的原理一样,就是把两个LC连在一起,好处是防误插, SFP模块可以插DLC,也能插LC
  • MTRJ, 和LC一样也是小型化的接口,不过用于光纤到桌面的更多。把一收一发两个口做到一起。
    目前常用于机房中万兆设备的是DLC-DLC接口,

模块

光纤模块

根据波长类型以及传输距离, 可以分为850nm, 1310nm, 1550nm等, 距离为300m, 1.4km, 10km等. 在网卡和交换机上常用的是LC接头.
1310nm和1550nm常用于远距离传输, 也意味着更大的功率和更大的发热量.
注意 新手使用光模块经常犯的错误是在同一条光纤的两端使用不同参数的模块, 导致连接失败. 在一根光纤上尽量使用同厂家同型号的模块, 以避免出现连接问题.

网卡

常见的千兆网卡

  • Realtek 8139: 经典的百兆网卡, 是KVM里虚机的默认网卡
  • Realtek 8111系列, 8168, 8169, 这些在普通PC上使用广泛, 在ESXi上需要自己集成社区开发的驱动, ESXi7.0以后不再支持
  • Intel E1000: 经典的千兆网卡, KVM的千兆模拟网卡
  • Intel EXPI9402PT, 82576芯片, ESXi7.0以后不兼容
  • Intel i350 T2/T4, 兼容ESXi7.0

常见的万兆网卡

  • Mellanox ConnectX-3
    341是单口,342是双口. 价格上单口100, 双口150, 是市面上最便宜的卡. 需要使用转接卡才能接入常见的PCIe插槽, 不支持SR-IOV
  • Intel X520 SR1/SR2, DA1/DA2
    SR和DA的区别仅在于购买时带不带光模块(SR带, DA不带). 82599EN是单口, 82599ES是双口, ESXi和Centos上无需另外安装驱动, 支持SR-IOV. 功率在5 - 10W, 价格上单口180双口320. 性价比最高的卡
  • 优肯 UK-A2XGS
    82599芯片, 在系统中会被识别为X520, 使用上与Intel X520无异
  • Intel X710 DA2 双口 & DA4 四口
    在ESXi早期版本中存在问题, 在6.5U1之后似乎正常

https://forum.vyos.io/t/intel-x520-sr2-x520-da2-or-x710-and-xl710/4682/5

If you are using Intel 700-series NICs, be aware that they are very fragile with regards the combination of (kernel_version,driver_version,firmware_version).
Check what kernel and kernel driver you are running and then make sure you have updated the NVM on the card to run something which is compatible. Otherwise you will find mysterious bugs happen after some time (e.g. card stops forwarding packets, or packet loss which goes away when you start running tcpdump).

万兆双口网卡需要使用PCIEx8或PCIEx16的插槽, 如果使用PCIEx4, 需要ver3.0, 否则无法达到线速.

  • X1 pcie2.0理论带宽4G,3.0理论带宽8G
  • X4 pcie2.0理论带宽16G,3.0理论带宽32G
  • X8 pcie2.0理论带宽32G,3.0理论带宽64G

https://community.spiceworks.com/topic/286749-10gb-network-cards-and-pcie-2-0

Will the X540 function if only 4x PCIe lanes are routed to it?
A: Yes, the X540 complies with the PCIe specification so it runs on less than x8 lanes; however with significant throughput performance (about 70%) limitations when both ports are enabled. Intel recommends using x8 lanes of PCIe for optimal X540 performance.

常用检测方法

查看设备信息

通过dmesg查看PCIE设备的速度, 在PCIEx4插槽上的82599, 实际带宽只能到16Gbps

dmesg |grep -i pcie
# 这个是在PCIEx16上的82576
[    0.285125] pci 0000:01:00.0: 8.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x4 link at 0000:00:01.0 (capable of 31.504 Gb/s with 8 GT/s x4 link)
# 这个是主板自带的RTL8111
[    0.287710] pci 0000:04:00.0: 2.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x1 link at 0000:00:1c.2 (capable of 7.876 Gb/s with 8 GT/s x1 link)
# 这个是PCIEx4上的82599
[    0.289837] pci 0000:05:00.0: 16.000 Gb/s available PCIe bandwidth, limited by 5 GT/s x4 link at 0000:00:1c.4 (capable of 63.008 Gb/s with 8 GT/s x8 link)

通过netstat -i查看网卡信息

netstat -i

通过lspci

lspci |grep -i ether

ping 检测 MTU

ping 192.168.111.202 -M do -s 8192
# -M do:禁止分片, want:当包过大时分片, dont:不设置分片标志DF flag
# -s 每次ping发送的数据字节数, 默认56+28(ICMP)=84字节. 头+内容不能大于65535, 所以最大值为linux:65507,windows:65500
  • 当数据包大于本机网卡MTU时, 会报ping: local error: Message too long, mtu=xxx
  • 当数据包大于外部网络以及对方网卡MTU时, 数据包被丢弃, ping无返回.

MTU说明

在以太网交互设备中, MTU指的是Ethernet maximum frame size, 一个IPv4报头包含

  • 设备vlan tag部分: 4 byte - 这个对于设备外部不可见, 可以忽略
  • 固定的部分: 20 byte
  • 可变长度的部分: 最大40 byte
    • 对于UDP, 包头是固定的8 byte
    • 对于TCP, 包头由两部分组成, 基本TCP头部为20 byte, 可变长部分为最大40 byte, 所以TCP包头总长度在20 - 60 byte


如果定义的MTU是1500 byte, 那么在硬件设备中传输的最大包要扣除IP包头长度, 包长度为1480 byte, 对于UDP packet, 要去掉8个byte的包头, 最大的数据长度为1472.

iperf3 带宽测试

启动服务端, 如果要指定网口, 需要加--bind或-B参数

iperf3 --server --bind 192.168.111.212

客户端测试命令

# TCP
iperf3 --interval 1 --time 8 --omit 1 --client 192.168.111.211 --verbose --parallel 4 --len 256
# 等效于
iperf3 -i1 -t8 -O1 -c192.168.111.211 -V -P4 -l256

# UDP
iperf3 --interval 1 --time 8 --omit 1 --client 192.168.111.211 --udp --bandwidth 10G --verbose --parallel 4 --len 256

# interval 间隔时间
# time 次数
# omit 忽略开头的N个结果
# verbose 输出更多信息, 建议加上
# parallel 并发连接数
# len 发出的每个数据包的长度, 当长度超出本机MTU时会提示, 因为实际传输时会被网口分段传输

查看RSS通道

查看网卡使用了的RSS通道以及所处的中断

cat /proc/interrupts |grep [网卡名]

性能测试

为测试方便, 将服务端MTU修改为9000

ip link set enp1s0f0 mtu 9000

Windows 10

默认配置测试结果

TCP		MTU-64	MTU-84	MTU-600	MTU-1K5	MTU-3K	MTU-5K	MTU-8K
Parallel-1	444M	863M	8.32G	8.38G	8.18G	7.09G	8.01G
Parallel-2	475M	842M	8.53G	9.46G	9.59G	9.77G	9.81G
Parallel-4	696M	780M	6.97G	9.14G	9.59G	9.79G	9.81G

UDP		MTU-64	MTU-84	MTU-600	MTU-1K5	MTU-3K	MTU-5K	MTU-8K
Parallel-1	407M	634M	2.25G	3.09G	3.41G	3.56G	3.58G
Parallel-2	355M	638M	2.85G	3.92G	4.24G	4.65G	4.67G
Parallel-4	347M	548M	3.34G	4.62G	5.37G	5.28G	5.35G

Centos7.9

测试命令

# TCP
iperf3 --interval 1 --time 8 --omit 1 --client 192.168.111.211 --verbose --parallel 4 --len 256
# UDP
iperf3 --interval 1 --time 8 --omit 1 --client 192.168.111.211 --udp --bandwidth 10G --verbose --parallel 4 --len 256

测试结果

TCP 		len-128	len-256	len-512	len-1K	len-1K5	len-3K	len-5K	len-8K
Parallel-1	578M	1.14G	2.12G	3.49G	5.58G	9.33G	8.89G	9.41G
Parallel-2	694M	1.24G	2.38G	4.19G	6.88G	9.41G	9.41G	9.41G
Parallel-4	924M	1.63G	3.09G	5.17G	6.12G	9.41G	9.41G	9.41G
								
UDP		len-128	len-256	len-512	len-1K	len-1K5	len-3K	len-5K	len-8K
Parallel-1	324M	635M	1.25G	2.36G	2.78G	3.72G	4.03G	4.46G
Parallel-2	388M	734M	1.50G	2.75G	3.15G	4.77G	6.17G	7.03G
Parallel-4	427M	831M	1.67G	3.08G	3.30G	4.96G	6.38G	7.14G

对Centos7的性能优化

默认系统参数

sysctl -a|grep net.core
...
net.core.rmem_default = 212992
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
...

增加 net.core.rmem_max, rmem_default, wmem_max, rmem_default

默认为 212992 (208K), 修改为2129920 (2080K), 这个配置在网络MTU为标准的1500时, 能增加长度为3000字节以上的包的吞吐量

[root@202v2 ~]# sysctl -w net.core.rmem_max=2129920
net.core.rmem_max = 2129920
[root@202v2 ~]# sysctl -w net.core.wmem_max=2129920
net.core.wmem_max = 2129920
[root@202v2 ~]# sysctl -w net.core.wmem_default=2129920
net.core.wmem_default = 2129920
[root@202v2 ~]# sysctl -w net.core.rmem_default=2129920
net.core.rmem_default = 2129920

将配置持久化

  1. /etc/sysctl.conf 文件增加配置
    net.core.rmem_max=2129920
    net.core.rmem_default=2129920
    net.core.wmem_max=2129920
    net.core.wmem_default=2129920

  2. 增大网卡txqueuelen
    ifconfig enp1s0f0 txqueuelen 10000

启用packet chain

https://www.ibm.com/docs/en/aix/7.2?topic=tuning-udp-packet-chaining

UDP packet chaining causes IP to build the entire chain of fragments and pass that chain down to the Ethernet device driver in one call. This improves performance by reducing the calls down through the ARP and interface layers and to the driver. This also reduces lockand unlock calls in SMP environment. It also helps the cache affinity of the code loops. These changes reduce the CPU utilization of the sender.

通过ifconfig查看是否带CHAIN标识

# 启用
ifconfig en0 pktchain
# 关闭
ifconfig en0 -pktchain

应用中调整UDP包长度

IP数据包长度超过MTU时, 发送方IP层就需要分片(fragmentation), 将数据包分成若干片, 使每一片小于MTU. 在接收方IP层则需要进行数据报的重组. 在IP层分片并重组的效率比在应用层约束数据包长度的效率更高, 在这种情况下

  • 对于UDP, 报文长度增大能提高系统的性能, 但是当某一片数据在传输中丢失时,接收方无法重组数据包, 导致整个UDP数据包被丢弃, 所以原则是: 网络质量好丢包率低, 则使用长一点的UDP包; 网络质量差, 则UDP包长度不要超过MTU. 在内网环境, 为了达到10Gbps带宽, 可以将UDP长度提升到3倍以上MTU大小, 对于外网环境, 可以使用2倍MTU.
  • 对于TCP, TCP丢包可以自动重传, 所以不存在UDP包的丢弃问题. TCP包长度增大一样能提高系统性能, 但是分包和错误重组可能会耗费时间,使传送时间延长,长度到一定程度后反而影响性能.

参考

posted on 2021-03-15 10:18  Milton  阅读(2865)  评论(0编辑  收藏  举报

导航