本文是一篇翻译,翻译自https://software.intel.com/en-us/blogs/2015/06/12/user-space-networking-fuels-nfv-performance,文章有点老了,15年写的,但是文章总结了一些用户态的协议栈,很有学习参考的意义。

如今,作为一个网络空间的软件开发人员是非常激动人心的,因为工程师的角色随着这个世界的规则在逐渐改变。

过去这 15 年来,人们对高性能网络做了很多努力,网络模型也发生了很多改变,起初,数据包的收发都要推送到内核才能完成,现在,不用内核态的参与也可以完成。这种改变的背后是在力图解决以下的几个问题:1)用户态和内核态上下文切换的开销;2)软硬中断的开销;3)数据拷贝的开销等等。

最近,很多人在讨论 mTCP——一个实现了用户态协议栈的开源库,这种技术在很大程度上就颠覆了传统的网络模型,使得网络收发包的效率大大提升。它充分利用了 CPU 的亲和性,共享内存,批处理等技术来实现高效的 I/O 事件。与之类似的技术也相继被提出。

实验表明,mTCP 这种用户态协议栈,相较原生的内核协议栈,在处理多种流行的应用时的性能得到较大提升,如 SSLShader 提升了 33%,lighttpd 提升了 320%。

软件形态的改变离不开硬件的革新。由以前的单核系统到如今多核系统的性能扩展,直接导致了网络软件架构的新方法。例如,内核所做的所有功能和处理,包括网络驱动程序,现在都可以被直接放到用户空间中来实现,应用程序可以直接访问底层的 NUMA 结构,利用 CPU 的亲和性,以及多核特性并行处理任务。这种设计避免了上下文之间的切换开销,可以显著降低数据传输的延迟和 CPU 使用,同时提高吞吐量和带宽。另外,提供一种运行到完成(run-to-completion)的模型能够让不同的核独立并行地完成不同的任务。

随着网络的发展,我们现在看到了大量的开源项目,都在将内核协议栈移到用户空间来做。它们的做法存在一些区别,像 mTCP,它的协议栈是从零开始开发的,而其他很多项目则是基于 FreeBSD 的来做,这主要是因为 FreeBSD 的协议栈具有 “最健壮的网络协议栈的声誉”。此外,很多存储解决方案也是采用的 FreeBSD 来作为其核心操作系统。当然,Linux 协议栈也是可以采用的。

这些用户态协议栈怎么做到绕过内核的,这就离不开 DPDK 的支持。利用 DPDK,用户态协议栈可以创建一个中断来将数据包从 NIC 的缓冲区直接映射到用户空间,然后利用协议栈的特性来管理 TCP/IP 数据包的处理和传输。

DPDK 还可以作为一些 vSwitch(虚拟交换机)的加速器,这些 vSwitch 包含 OpenFlow 协议的完整实现,以及与 OpenStack Neutron 的整合。

下面,我们收集了一些发现的开源项目,无论你决定使用一个 vSwitch 还是一个完整的网络协议栈,网络开发人员都有很多选择,可以将应用程序移到用户空间,并在多核系统上扩展性能。


DPDK-Enabled vSwitch:

OVS
Open vSwitch 是一个多核虚拟交换机平台,支持标准的管理接口和开放可扩展的可编程接口,支持第三方的控制接入。
https://github.com/openvswitch/ovs

Lagopus
Lagopus 是另一个多核虚拟交换的实现,功能和 OVS 差不多,支持多种网络协议,如 Ethernet,VLAN,QinQ,MAC-in-MAC,MPLS 和 PBB,以及隧道协议,如 GRE,VxLan 和 GTP。
https://github.com/lagopus/lagopus/blob/master/QUICKSTART.md

Snabb
Snabb 是一个简单且快速的数据包处理工具箱。
https://github.com/SnabbCo/snabbswitch/blob/master/README.md

xDPd
xDPd 是一个多平台,多 OpenFlow 版本支持的开源 datapath,主要专注在性能和可扩展性上。
https://github.com/bisdn/xdpd/blob/stable/README

从零开发的用户空间协议栈套件:

mTCP
mTCP 是一个针对多核系统的高可扩展性的用户空间 TCP/IP 协议栈。
https://github.com/eunyoung14/mtcp/blob/master/README

Mirage-Tcpip
mirage-tcpip 是一个针对 MirageOS 这种 “库操作系统” 而开发的一个用户态网络协议栈,开发的语言是 OCaml。
https://github.com/mirage/mirage-tcpip

IwIP
IwIP 针对 RAM 平台的精简版的 TCP/IP 协议栈实现。
http://git.savannah.gnu.org/cgit/lwip.git/tree/README

移植版的用户空间协议栈套件:

Arrakis
针对多核系统的用户空间 OS,移植于 IwIP。
https://github.com/UWNetworksLab/arrakis/blob/master/README_ARRAKIS

libuinet
用户空间的 TCP/IP 协议栈,移植于 FreeBSD。
https://github.com/pkelsey/libuinet/blob/master/README

NUSE (libos)
一个基于 Linux 的库操作系统,移植于 Linux。
https://github.com/libos-nuse/net-next-nuse/wiki/Quick-Start

OpenDP
一个针对 DPDK TCP/IP 协议栈的数据面,移植于 FreeBSD。
https://github.com/opendp/dpdk-odp/wiki

OpenOnload
一个高性能的用户态协议栈,移植于 IwIP。
http://www.openonload.org/download/openonload-201205-README.txt

OSv
一个针对虚拟机的开源操作系统。移植于 FreeBSD。
https://github.com/cloudius-systems/osv/blob/master/README.md

Sandstorm
一个针对个人服务器安全的开源网络平台,移植于 FreeBSD。
https://github.com/sandstorm-io/sandstorm/blob/master/README.md

总结:

1、这篇文字的亮点在于总结了当前阶段业界出现的一些用户空间协议栈,对于文章标题提到的 NFV 在文中则只字未提,但其实意思也很明了了。用户空间的协议栈是随着硬件技术的发展,以及新鲜应用场景应运而生的,换句话说,对于像 NFV 这种对性能要求比较高的场景,采用用户态的协议栈是比较合适的。

2、文中是 2015 年写的,这意味着到现在为止,肯定出现了很多比上面总结还要多的方案,其中比较出名的有 SeaStar 和 腾讯开源的 F-Stack,后面找机会再进行详述,敬请期待吧。

用户空间网络提升 NFV 的性能的更多相关文章

  1. Linux用户空间网络配置工具tips

    1.当调用`ifconfig eth0 down`命令关闭网络设备eth0时,会产生如下影响: 所有配置在该网卡上的IP地址都将失效并且被移除 (在ubuntu 14.04上测试,IP并不会被移除,重 ...

  2. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  3. 深入理解Linux网络技术内幕——用户空间与内核空间交互

    概述:     内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求.     用户空间与内核有多种交互方式,最常 ...

  4. 译<容器网络中OVS-DPDK的性能>

    译<容器网络中OVS-DPDK的性能> 本文来自对Performance of OVS-DPDK in Container Networks的翻译. 概要--网络功能虚拟化(Network ...

  5. Linux时间子系统之(三):用户空间接口函数

    专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...

  6. Linux时间子系统(三) 用户空间接口函数

    一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1.和系统时间相关的服务.例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时). 2.让进程睡眠一段时间 3. ...

  7. linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解

    1.特权级         Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...

  8. 提升 Web开发性能的 10 个技巧

    随着网络的高速发展,网络性能的持续提高成为能否在芸芸App中脱颖而出的关键.高度联结的世界意味着用户对网络体验提出了更严苛的要求.假如你的网站不能做到快速响应,又或你的App存在延迟,用户很快就会移情 ...

  9. 如何从请求、传输、渲染3个方面提升Web前端性能

    什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情.我们来看看用户访问网站,浏览器都做了哪些事情: 输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 ...

随机推荐

  1. 【ANT】taskdef class org.programmerplanet.ant.taskdefs.jmeter.JMeterTask cannot be found using the classloader AntClassLoader[]解决办法

    把文件apache-jmeter-3.1\extras\ant-jmeter-1.1.1.jar复制到apache-ant-1.10.1\lib目录下即可.

  2. rwx读写执行对文件和目录的意义

    文件 目录 r 查看 列出目录内容 w 修改 在目录内新建删除文件 x 执行 可以进入目录 对文件的删除权限是对文件所有目录的写权限 对目录-wx的权限,有写和执行权限,既可以在目录内创建删除文件,可 ...

  3. 【JMeter】获取json响应报文中数组长度

    import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Predicate; import net.minidev.json.J ...

  4. HTML5 桌面通知:Notification API

    原文地址:http://blog.gdfengshuo.com/article/23/ 前言 Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是 ...

  5. Oracle数据库(一)概述、基础与简单操作

    数据库: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 数据库分类: 关系型数据库 非关系型数据库 数据库 类型 特性 优点 缺点 关系型数据库 SQLite.Oracle. ...

  6. iOS masonry九宫格 单行 多行布局

    Masonry是个好东西,在当前尺寸各异的iOS开发适配中发挥着至关重要的作用,由于项目中Masonry布局用的比较多,对于UI布局也有了一些自己的理解,经常会有人问道Masonry布局九宫格要怎么布 ...

  7. Java中的UDP应用

    我在<JavaSE项目之聊天室>中通过遵守TCP协议的ServerSocket与Socket实现了聊天室的群聊窗口.同时,在介绍OSI与TCP/IP参考模型时,也曾提及TCP与UDP(全称 ...

  8. bzoj 4868: [Shoi2017]期末考试

    Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...

  9. Mysql数据库重要知识点(知了堂学习心得)

    Mysql数据库知识点 1.管理数据库语句: 使用数据库: use test; 添加数据库: create database 数据库名; create database test; 修改数据库: al ...

  10. C#序列化总结

    贴一下自己序列化的代码: public class XMLUtil { /// <summary> /// XML & Datacontract Serialize & D ...