NUMA/DPDK/SDN

  • NUMA

    NUMA(Non Uniform Memory Access Architecture 非一致性内存访问架构)是为了解决传统的对称多处理SMP(Symmetric Multi-processor)系统中的可扩展性问题而诞生的。在SMP对 称多处理系统架构中,处理器共享北桥中的内存控制器来达到共同访问外部内存和IO的目的,也就是说所有的处理器对内存和I/O的访问方式和开销都是相同的。在这种系统中,随着更多的处理器被添加到SMP系统中,总线的竞争将会越来越大,系统的性能也必将随之大打折扣。
    SMP系统只拥有一个位于北桥中的内存控制器,而如今更先进的做法是将内存控制器整合到CPU中去,这样每个CPU都拥有自己的内存控制器,不会相互之间产生竞争。CPU之间还采用了一种Hyper-Transport(一种提升设备之间的集成电路通信速度的技术)的技术建立连接,这种连接可以使得CPU通过其他CPU来访问外部内存,访问开销要比访问本地内存更大。
    NUMA系统架构拥有多条总线,将单个硬件CPU(即socket插槽)通过内存总线和一块内存相连构成一个组,即NUMA节点(node)。整个系统被分为N个NUMA节点,根据内存分为本地节点内存(local memory)和外部节点内存(foreign memory),根据节点又分为本地节点(local node),邻居节点(neighbour node)和远端节点(remote node)。访问开销的关系为:本地节点<邻居节点<远端节点。
    北桥芯片:主要负责CPU、内存、显卡之间的高速通信
    南桥芯片:主要负责硬盘等中低速外部设备和PCI(外部设备互联标准)通信
    Socket:主板CPU插槽,对应单个CPU硬件(或多个),对应单个NUMA节点
    Core:CPU硬件内的核芯,对应普通线程(超线程为单个Core对应对多个线程)
    硬件CPU:中央处理器,处理核心
    逻辑CPU:对应支持的线程数,包含超线程
    NUMA架构详解参考:https://blog.csdn.net/ustc_dylan/article/details/45667227
    https://blog.csdn.net/vah101/article/details/40586545
    CPU多核概念参考:https://blog.csdn.net/lsm18829224913/article/details/80398096

  • OpenFlow
    一种网络通信协议,属于数据链路层,能够控制网上交换机或路由器的转发平面(forwarding plane),借此改变网络数据包所走的网络路径。
    Facebook 和 Google 使用的都是 OpenFlow 协议,作用在数据链路层(使用 MAC 地址通信的那一层,也就是普通交换机工作的那一层),它可以统一管理所有网关、交换等设备,让网络架构实时地做出改变,这对这种规模的公司所拥有的巨大的数据中心非常重要。

  • NFV
    NFV(Network Function Virtualizatio 网络功能虚拟化),NFV借助通用硬件以及虚拟化技术,实现专用网络设备的功能,从而降低网络建设的成本。核心思想是将网络硬件设备通过虚拟化技术,集成到通用的服务器或其他硬件平台上,然后在通用标准的硬件平台上,执行路由器、交换机、负载均衡、防火墙、入侵防御等功能,即将分散的网络硬件产品集成到一个“大盒子”里,然后每种产品相当于一个插件来使用。
    NFV和SDN虽然是由不同的组织来引导发展,但是基本诉求是一致的:将组织架构软件化/虚拟化,统一部署管理。

  • SDN
    SDN(Software Defined Network 软件定义网络),是一种数据控制分离、软件可编程的新型网络体系架构。软件定义网络,其本质就是使用计算机科学中最常用的“虚拟机”构想,将传统由硬件实现的 交换、网关、路由、NAT 等网络流量控制流程交由软件来统一管理:可以实现硬件不动,网络结构瞬间变化,避免了传统的停机维护调试的烦恼,也为大规模公有云计算铺平了道路。
    SDN是一种网络设计理念和思想,只要网络硬件可以集中式软件管理,可编程化,控制转发层面分开,则可以认为是一个SDN网络。
    SDN框架主要由应用层、控制层和转发层(基础设施层,例如:运行OpenFlow协议设备)组成,其中应用层提供应用和服务(网关、安全、流控等),控制层提供统一管理和控制(协议计算、策略下发、链路信息收集)、转发层负责硬件设备(交换机、路由器、防火墙等)进行数据转发。
    SDN基于OpenFlow的可编程特性,分别由Controller和OpenFlow转发设备组成,形成控制层和数据转发层。SDN采用了集中式的控制平面和分布式的转发平面,两个平面相互分离,控制平面利用控制、转发通信接口,对转发平面上的网络设备进行集中式管理。
    一般称控制器开放的API为北向接口,而控制器与底层网络之间的接口为南向接口。南北向接口目前都还没有统一的标准,但南向接口用的比较多的是OpenFlow,使其成为事实上的标准(曾经也有人认为SDN=OpenFlow)。
    SDN网络包含三个特征:
    1、控制与转发分离:转发平面由受控转发的设备组成,转发方式以及业务逻辑由运行在分离出去的控制面上的控制应用所控制。
    2、开放API:通过开放的南向和北向API,能够实现应用和网络的无缝集成,使得应用只需要关注自身逻辑,而不需要关注底层实现细节。
    3、集中控制:逻辑上集中的控制平面能够获得网络资源的全局信息并根据业务需求进行全局调配和优化。
    SDN简介参考:https://blog.csdn.net/gengzhikui1992/article/details/83056848
    SDN解释及视频参考:https://www.zhihu.com/question/20279620

  • VPP
    VPP(Vector Packet Processing 矢量数据包处理),是思科矢量数据包处理(VPP)技术的开源版本:一种可在商用CPU上运行的高性能数据包处理堆栈。
    VPP执行于用户空间,支持多种收包方式,经常使用的是DPDK。主要有两个主要功能:框架可扩展;成熟的交换/路由功能。
    VPP平台是通过graph node串联起来处理数据包。通过插件的形式引入新的graph node或者又一次排列数据包的gpragh node。
    VPP平台能够用于构建不论什么类型的数据包处理应用。比方负载均衡、防火墙、IDS、主机栈。也能够是一个组合,比方给负载均衡加入一个vSwitch。

  • TLDK
    TLDK(transport layer development kit 传输层开发套件),是VPP的一个graph node。

  • TLB
    TLB(Translation Lookaside Buffers)转换检测缓冲区,是内存控制器中为增虚拟地址到物理地址的翻译速度而设立的一组电子元件,最近十几年已经随着内存控制器被集成到了 CPU 内部,每颗 CPU 的 TLB 都有固定的长度。
    如果缓存未命中(TLB miss),则要付出 20-30 个 CPU 周期的带价。假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断。

  • HugePage
    HugePage大页内存是一种非常有效的减少 TLB miss 的方式,让我们来进行一个简单的计算。2013 年发布的 Intel Haswell i7-4770 是当年的民用旗舰 CPU,其在使用 64 位 Windows 系统时,可以提供 1024 长度的 TLB,如果内存页的大小是 4KB,那么总缓存内存容量为 4MB,如果内存页的大小是 2MB,那么总缓存内存容量为 2GB。显然后者的 TLB miss 概率会低得多。DPDK 支持 1G 的内存分页配置,这种模式下,一次性缓存的内存容量高达 1TB,绝对够用了。不过大页内存的效果没有理论上那么惊人,DPDK 实测有 10%~15% 的性能提升,原因依旧是那个天生就带的涡轮:局部性。

  • DPDK
    DPDK(Data Plane Development Kit 数据平面开发套件),使用自研的数据链路层(MAC地址)和网络层(ip地址)处理功能(协议栈),抛弃操作系统(Linux,BSD 等)提供的网络处理功能(协议栈),直接接管物理网卡,在用户态处理数据包,并且配合大页内存和 NUMA 等技术,大幅提升了网络性能。
    1、内核态
    EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化
    2、用户态(自底向顶)
    PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率
    流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法
    环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销
    MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用
    3、核心思想
    用户态模式的PMD驱动,去除中断,避免内核态和用户态内存拷贝,减少系统开销,从而提升I/O吞吐能力
    用户态一旦程序崩溃,不至于导致内核错误,带来更高的健壮性
    HugePage,通过更大的内存页(如1G内存页),减少TLB(Translation Lookaside Buffer,即快表)Miss,Miss对报文转发性能影响很大
    多核设备上创建多线程,每个线程绑定到独立的物理核,减少线程调度的开销。同时每个线程对应着独立免锁队列,同样为了降低系统开销
    向量指令集,提升CPU流水线效率,降低内存等待开销
    4、数据包分发机制
    RSS(Receive Side Scaling,接收方扩展)机制:根据关键字,比如根据UDP的四元组进行哈希
    Flow Director机制:可设定根据数据包某些信息进行精确匹配,分配到指定的队列与CPU核
    5、优化
    每个应用程序线程通过Pthread亲和性绑定到特定的硬件线程。程序在该线程所在socket上分配分配内存。
    重载malloc,所有内存分配基于hugepage,减少tlb miss
    实现对象缓冲池mempool,对象着色,确保所有对象均匀分配到cpu cache上。
    网络包结构采用mbuf。mbuf 在程序启动时预先从mempool中分配。
    Lockless ring队列,所有对象均采用此设计进行连接
    针对网卡的Poll mode driver,无中断机制,能够高速收发报。数据包进出应用程序中实现了零拷贝。
    驱动采用run-to-completion机制,数据包收发处理都在一个硬件线程上完成
    流分类:实现了针对Intel架构的优化(Intel SSE)查找hash /lpm/ACL 库
    参考网页:https://lvwenhan.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/492.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值