Skip to main content Link Search Menu Expand Document (external link) Copy Copied

Netframe Skills

Table of contents

  1. netframe 需要完整的过遍材料!!!!!!!
    1. Installation
    2. 运行依赖
    3. 驱动选择
      1. 驱动说明
      2. 网卡说明
    4. Netlink工具
      1. 配置方法
      2. netlink消息格式
      3. 注意
      4. ipv6特别说明

netframe 需要完整的过遍材料!!!!!!!

Installation

https://yuque.antfin-inc.com/aone588606/netframe-doc

install netframe on ECS:
yum install -b current netframe

aliustack configure:
cat /usr/local/alisocket/config

route_control -E -g 11.122.63.253 -d vlan1

关于IPV6:
你启动之后使用ipintf_control配置一个ipv6地址到vlan上,然后参考/run/nf/nf-json-running-config sudo ./route6_control -A -f 6 -n fda9:4efe:7e3c::/48 -g fda9:4efe:7e3c:bc5c:c44b:cdf0:a15e:160e -d vlan1

默认配置启动需要32G内存。不够的话,也可以修改配置文件改小一点。 alisocket_global.conf做如下修改,然后运行alisocket -i eth1 -d,之后再启动试试: max_tcp_flow改为16384 max_tcp_flow_v6改为16384 max_lcore_id改为8 nr_hugepages改为5120

max_lcore_id这个你可能后面还要调整,这个应该不小于后面你启动的程序的网络线程数量

需要在nf-var-config里面加NF_COUNTER那个配置:

[DPDK_ARGV]
dpdk_argv = --socket-mem 10240 --base-virtaddr=0x3fffffffffff --hot-upgrade

[NF_CORE]
numa = 0
core_mask = 0x7
dataplane_core_rx = 1,2
dataplane_core_tx = 1,2
monitor_info = (vlan1,vlan1,route)
ipv6_switch = 1
localdev_mode = 1
hook_info = /usr/local/alisocket/lib/libalisk_acl.so
rt_lpm_max = 16384
port_pcilist = 0000:00:08.0

[NF_FDIR]
fdir = 1
sip_mask = 0x0
dip_mask = 0x0
sport_mask = 0x0
dport_mask = 0xffe0

[NF_RSS]
rss_hf_tcp = 1
rss_hf_udp = 1
rss_hf_sctp = 1

[NF_DRIVER]
rxmode_strip_crc = 1
rxmode_en_lro = 1
mbuf_num = 1048576
rx_desc = 4096

[NF_PCIOPT]
txq_mpw_en = 0
tso = 1
isolate_mode = 0

[NF_COUNTER]
perlcore_global_counter_num = 1024

aliustack log: cat /var/log/alisocket

w41 : 加载这个模块试试:vfio-pci, 不要用:uio_pci_generic echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

/usr/src/netframe_devel/scripts/netframe.sh

运行依赖

netframe sdk运行依赖了一些外部lib/程序来实现部分功能,由于netframe测试无法覆盖所有依赖组件的所有版本组合,故如果您决定更改netframe的依赖组件的版本,请务必进行完善的回归测试,如果有问题请及早提报

kernel

uio驱动(包括vfio)
kernel版本的不同可能会造成业务对于uio驱动的选择出现不同,详见 驱动选择
即使改变kernel后使用相同的uio驱动,也不能保证行为一致,uio驱动会影响netframe是否能够启动、收发包功能以及网卡高级特性(如fdir)能否正常工作

netlink
kernel版本不同可能造成kernel发布的netlink消息的内容、语义、格式发生变化,netframe的route_monitor和neighbor_monitor功能依赖netlink将kernel的网络信息(路由机neighbor表变化)同步到netframe。如果您使用了上述功能,那么会受到kernel版本影响,详见 Netlink工具

权限
部分版本kernel对于内存、设备管理有更严格的权限管理,可能导致默认情况下netframe无法启动

OFED
目前仅mellanox网卡依赖ofed,包括内核模块和用户态工具,其他网卡可不考虑,具体影响详见 MLX网卡DPDK与OFED兼容性说明
ofed决定了netframe是否可以启动,收发包功能以及网卡高级特性(如rte_flow的支持程度)是否正常

mellanox网卡使用dpdk时涉及到很多非dpdk组件的配合,需要特别注意版本匹配
* dpdk是netframe包中提供,每个netframe包中含有一个dpdk版本
* ofed的用户态库是netframe包中提供,是动态库,位于包中dpdk目录的lib中,包括libmlx5.so和libibverbs.so,请确保运行时使用这两个so
* ofed内核部分和网卡驱动由操作系统或业务方维护,这个部分和用户态库不严格要求版本一致,最好尽量保证一致,但是mlx只承诺对应版本可用,请注意,ofed内核/固件部分不能热升级,一旦选定则绑死了其他组件版本,请谨慎选择
* 网卡firmware由厂商刷入或装机时刷入

LAG说明
如果linux开启了rocelag,那么dpdk port会被虚拟为一个port,只能接管这一个lag port,不能接管两个物理port(ofed 5.0以上默认开启)。此情况下容灾由kernel负责,netframe需设置force_link=1屏蔽link信号(由于mlx的bug,信号不准)

libnl3
libnl3是netlink kernel message的用户态接口,升级可能导致接口改变,影响netframe的route_monitor和neighbor_monitor,详见 Netlink工具

glibc
glibc版本改变很可能会影响netframe整体性能,但是不太可能出现功能和兼容性问题

驱动选择

netframe基于dpdk,使用用户态的poll mode driver。一般需要将网卡设备绑定到一个通用的支持用户态操作的驱动而不是网卡原生驱动

驱动说明

vfio_pci
是内核自带驱动,基本兼容所有网卡,特性支持更多,推荐所有用户使用此驱动 但是需要iommu,建议用户设置grub参数

intel_iommu=on iommu=pt

如果用户评估不可设置此参数,那么vfio模块需要开启noiommu模式

echo Y > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

如果以上两个参数均不能设置,只能选择其他驱动

uio_pci_generic
是内核自带驱动,基本兼容所有网卡,对于不能使用iommu且无法开启vfio驱动noiommu模式的场景,均推荐使用这个驱动

igb_uio
是out-of-tree的驱动,当前是单独代码库维护,需要用户自行在目标机器编译,基本兼容所有网卡

网卡说明

x710 xl710
此网卡由于硬件特性不标准(无法屏蔽部分中断),不能使用uio_pci_generic驱动,请选择其他驱动

mellanox全系
mellanox网卡不需要绑定驱动到uio驱动,kernel驱动可以支持dpdk操作

Netlink工具

netframe是一套独立于linux的网络协议栈,需要用户配置。但是在部分场景中,用户希望各个网络信息(ip、路由、neigbor等)从linux上获取并保持同步,因此netframe提供了一套基于netlink的信息同步工具用于方便用户使用,包括route_monitor进程和neighbor_monitor进程

配置方法

监控路由变化
nf-var-config的[NF_CORE]域,增加monitor_info配置,可以配置多个monitor,写在同一行用逗号隔开,所有字符中间不要有空格,意义为监控linux_dev上的路由变化,将信息同步到netframe_dev上,第三个参数route的意义既为这是同步路由变化的monitor

monitor_info=(linux_dev,netframe_dev,route)

监控neigbor变化
nf-var-config的[NF_CORE]域,增加monitor_info配置,可以配置多个monitor,写在同一行用逗号隔开,所有字符中间不要有空格。意义为监控linux_dev上的neigbor变化(arp及nd),将信息同步到netframe_dev上,第三个参数neighbor的意义既为这是同步neighbor变化的monitor 注意,任何其他类型的monitor都隐含了neigbor monitor,不需要再配置

monitor_info=(linux_dev,netframe_dev,neighbor)

监控ip变化
首先需要设置nf-var-config的[NF_CORE]域中localdev_mode=1,这样netframe才会为vlan生成linux本地接口,然后配置nf-var-config的[NF_CORE]域中vlan_ip_route_monitor=1,这样netframe就会同步vlan的linux本地接口上ip的变化到对应的vlan设备上

netlink消息格式

neigbor和ip变化的netlink消息格式单一,暂时没有出现过变化
由于路由的复杂性,路由变化的netlink消息出现过很多版本,不论您使用ip addr工具手动管理路由还是使用bgp服务自动管理路由,请务必注意消息格式是否兼容:

  • 所有版本的netframe,netlink工具支持ipv4路由整体删除、整体添加、整体替换(不论是普通路由还是ecmp路由),目前我们已知的bgp服务均是这个格式
  • 所有版本的netframe,netlink工具不支持ipv4 ecmp路由追加nexthop和删除nexthop,目前没有bgp服务使用这个格式
  • netframe 2011及之后的版本,netlink工具支持ipv6路由追加ecmp路由的nexthop和删除nexthop(每次可操作多个nexthop),目前已知quagga 0.99在linux-4.11以后的版本使用这个格式
  • netframe 2011之前的版本,netlink工具支持ipv6路由追加ecmp路由的nexthop和删除nexthop(每次仅可操作一个nexthop),目前已知frr、alibgp、quagga 0.99在linux-4.11以前的版本使用这个格式
  • 所有版本的netframe,netlink工具不支持ipv6路由整体删除、整体添加、整体替换(后续会添加支持),目前已知frr、alibgp在linux-4.11以后使用这个格式

注意

netlink工具是独立于netframe核心转发协议栈的外围进程,且自身稳定性和行为受外部各个组件(如kernel、触发产生netlink消息的进程、netlink版本)行为影响很大,如果决定使用该工具,请务必对工具和网络信息做好监控报警

netframe提供了网络信息维护的API和命令行工具,netframe鼓励用户按业务场景自己维护网络信息

ipv6特别说明

早于netframe 2108版本的netframe的ipv6存在以下问题,无法运维,在ipv6场景下禁止使用netlink工具,且强烈不推荐开启ipv6功能:

  • 无ipv6路由管理工具,仅能依靠netlink工具生成路由,核心功能依赖了外围组件
  • 内部管理结构落后,缺乏整体替换、删除ipv6路由的API,无法和linux kernel功能对齐
  • 已经停止支持,无法得到主干上的bugfix