文档章节

实战录 | mTCP用户态协议栈浅析

天蚕宝衣
 天蚕宝衣
发布于 2017/06/02 21:59
字数 1401
阅读 248
收藏 1
点赞 0
评论 0

1. 关于用户态协议栈

一直以来,网络协议栈都和内核密切相关,内核作为操作系统的控制者,也是负责网络资源分配的最佳人选。随着Linux系统的不断壮大,内核协议栈的功能性能和稳定性都得到了高度认可。

现在互联网业务蒸蒸日上,本该是性能瓶颈的网络传输,被聪明的开发者们通过集群、分布式等方式不断优化,将网络业务的力量不断提高。但随之而来,Linux内核作为一个调度者,不适宜对外提供业务服务,也不适合占用系统资源,无论多么巧妙的开发技巧,都存在面对单点性能瓶颈的问题。

而用户态协议栈,可以让Linux内核更专注系统的控制调度;将复杂的协议处理放到用户态,使用更多的系统资源,提供给开发者更自由的环境,做更多更酷的事~

2. 关于mTCP

关于用户态协议栈已经有很多开源的项目,之所以选mTCP来说,主要觉得其层次结构清晰,便于适配使用。

参考其首页描述,将结构分成:IO驱动、mTCP协议栈应用。

实战录 | mTCP用户态协议栈浅析

mTCP设计模型:

3. 协议栈模型

按描述,mTCP的实现基于RFC793规范,提供了大多数基础tcp功能,以及一些常见的socket套接字配置。TCP协议栈的实现内容较多,有兴趣会另起一个专题详述,当前着重从其模型分析其架构。

实战录 | mTCP用户态协议栈浅析

从其提供的结构模型看,实现了:

·传统socket套接字接口,对每条流提供socket形式的抽象。

·线程间有共享内存的使用方法。

·支持epoll相似的批事件处理。

·与mTCP协议栈交互的消息队列机制。

·配置cpu绑定的多线程/进程模型。

按example中epserver的启动过程进行分析,从而了解其内部运作机制。

实战录 | mTCP用户态协议栈浅析

注意:

启动基于mTCP的应用,至少需要三个线程(日志、mTCP协议栈和应用自身)。

如其首页所说,”a separate-TCP-thread-per-application-thread model”。

基于mTCP的应用,read/write依旧会有内存拷贝问题。

Event触发的通知方式,采用pthread唤醒机制。

由于app线程和mTCP线程一对一,其协议栈设计为仅支持一个epoll服务注册。

4. IO驱动

mTCP提供两种方式:

·根据intel网卡驱动igb/ixgbe改进的PSIO(PacketShader I/O engine)。

·基于intel的DPDK(DATA PLANE DEVELOPMENT KIT)进行适配的驱动。

这里选用了基于DPDK的IO驱动,因为PSIO的支持依赖内核版本。DPDK是一套用户态高性能网络设备开发工具,在用户态就可以控制和使用网卡硬件资源。(DPDK本身非常强大,这里就不详细分析了……)

使用中发现,mTCP对DPDK进行了一小部分拓展:被igb_uio驱动绑定的硬件设备,自动为其在Linux上注册为网络设备,被用作配置接口(如ifconfig命令配置ip等)。

5. 为何高性能

由模型来分析,其内存管理机制,没有实现”零拷贝”;其线程调度也较为传统。没有这些较热门的技术,其为何可以提高数倍于传统协议栈的性能?抛开mTCP协议栈性能的优化,其高性能更依赖其用户态的多核架构设计。

实战录 | mTCP用户态协议栈浅析

CPU设置线程亲和性;降低cache miss,提高资源利用率。

每个线程独立状态信息;大大降低因信息同步而使用锁的场景。

利用网卡硬件基于rss进行分流(五元组);确保每个线程只处理属于自己的流。

用户态应用;降低了传统socket系统调用的额外开销。

6. 测试对比

mTCP自带了一些用例,其中包含集成好的lighttpd和ab(ApacheBench)。

我采用了ab来进行测试,不同版本的ab,分别访问一台nginx服务器的静态页面,根据ab自身信息来查看并发性能和mTCP效果。

·环境:两台E5-2690,64G内存服务器 x520网口对接

·参数:ab -n 200000 -c 10000 http://111.11.1.1/index.html

·方法:分别用传统协议栈ab,mTCP版ab,对nginx服务器做测试。

每个用例运行10次,平均结果如下图,分别是传统协议栈的ab,和配置1,2,8个核的mTCP版ab。

mTCP单核性能比传统协议栈差很多,但由于支持多核架构,多核版的处理能力高于传统协议栈。

mTCP协议栈在异常状态处理上还有所不足,出现了一些Failed requests。

实战录 | mTCP用户态协议栈浅析

实战录 | mTCP用户态协议栈浅析

7. 结语

mTCP的结构简洁,层次分明。由于时间问题,还没有做针对性的功能和性能测试- -,有机会后面会有更详尽的补充。

通过上面的描述,可见其有符合未来高性能架构的基础。而且内存操作和线程调度上,还有提升的潜力。

但分流策略依赖硬件配置,intel网口不同芯片支持的队列数也是0~16不等,使用时需要考虑自己的平台规格,对架构设计者要求较高。

要想做一个高性能网络服务端,mTCP+DPDK的组合可以作为一个学习优化定制的起点。

本文转载自:http://www.toutiao.com/i6298834917304304130/

共有 人打赏支持
天蚕宝衣
粉丝 18
博文 236
码字总数 178069
作品 0
天津
完全在用户态实现IPSec VPN

IPSec的复杂性之一在于它和内核协议栈实现高度相关,造成升级和管理的不便,如果能在用户态实现IPSec,那么所有的客户端就可以使用这种用户态的IPSec了。 需要特别注意的是,如果你拥有一台I...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

高性能 TCP 堆栈--mTCP

mTCP 是一个的用户级别的 TCP 堆栈,用于多核处理器的系统。mTCP 从 I/O 包到 TCP 连接管理上进行全方位的优化。 示例代码: 性能比较:

红薯 ⋅ 2014/10/23 ⋅ 2

兼容Redis协议的存储系统--pedis

这是一个高并发,低延迟,兼容Redis协议的NoSQL存储系统, 名字叫作Pedis(是parall 与 redis 两个单词的合成)。与社区版Redis最大的区别就是,Pedis能够以多线程方式运行(threaded redis)...

丰茂IO ⋅ 2016/08/24 ⋅ 1

linux内存管理浅析

地址映射 linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址。 想一下,地址映射还是一件很恐怖的事情。当访问一个...

chengyang ⋅ 2012/03/13 ⋅ 0

linux系统并发tcp连接数

在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。...

markqk ⋅ 2016/07/11 ⋅ 1

网络数据包转发处理--DPDK

Intel® DPDK 全称 Intel Data Plane Development Kit,是 Intel 提供的数据平面开发工具集,为 Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不...

匿名 ⋅ 2017/03/18 ⋅ 0

浅析GPU通信技术(下)-GPUDirect RDMA

目录 浅析GPU通信技术(上)-GPUDirect P2P 浅析GPU通信技术(中)-NVLink 浅析GPU通信技术(下)-GPUDirect RDMA 1. 背景 前两篇文章我们介绍的GPUDirect P2P和NVLink技术可以大大提升GPU服...

撷峰 ⋅ 今天 ⋅ 0

Linux平台VPN技术概论

声明: 1.对于IPSec,不谈其Tunnel以及Transport模式 2.对于OpenVPN,不剖析代码 3.不涉及Linux内核源码剖析 4.不深入谈PPTP以及L2TP 5.本文不是HOWTO也不是技术文档 6.本文的性质是科普 第一...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

windows和linux的协议栈驱动

windows中没有将loopback当成一个网卡来实现,而是直接在比较高的层次解决了对127.0.0.0网段的访问,因此使用wiresharck是无法抓取这种loopback包的,pcap工作在非常低的层次,127.0.0.0网段...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

Netfilter-iptabes报文过滤框架(一)

什么是Netfilter/iptable Netfilter/iptables是Linux内核内置的报文过滤框架,程序可以通过该框架完成报文过滤、地址转换(NAT)以及连接跟踪等功能。 Netfilter/iptables由两部分组成,一部分...

hoolev ⋅ 2015/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 7分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 8分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 19分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 21分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 23分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 25分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 55分钟前 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部