IX-Protected Dataplane Operating System解读
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃
一、概述
商业操作系统在应用程序每秒钟需要数百万次操作时才能保持高吞吐量和低(尾)延迟,对于最慢的请求只需几百微秒。通常认为对于高性能网络(小信息的高包率、低延迟)的构建,最好都是在内核之外构建用户态协议,IX提出了dataplane operating system,提供高IO性能同时保持内核的安全性。IX通过硬件虚拟化技术分离内核网络处理的调度和管理。
如果阅读本文有些困惑,可以先阅读我的上一篇文章《NFV、DPDK以及部分用户态协议研究》。
二、IX在HOME服务器的配置运行
基本需求
未发现IX的requirement page(估计关闭了),在GitHub上说需要DPDK以及Intel网卡82599、X520、X540,aws ec2测试失败,家里一台realtek网卡机器测试失败,现在另一台Intel网卡服务器测试,具体配置信息为:
Ubuntu 16.04. LTS
#lspci | # hardinfo
Intel(R) Core(TM) i7-6800K CPU @ .40GHz
:19.0 Ethernet controller: Intel Corporation Ethernet Connection () I218-V (rev )
:00.0 Network controller: Intel Corporation WiFi Link
:00.0 VGA compatible controller: NVIDIA Corporation Device 1b80 (rev a1)
# lscpu
虚拟化:VT-x
L1d cache:32K
L1i cache:32K
L2 cache:256K
L3 cache:15360K
# /proc/meminfo
MemTotal: kB
下载ix项目及相关子模块
git clone https://github.com/ix-project/ix.git
git submodule update --init
## 子模块下载速度比较慢,尤其是dpdk(我在aws上下载好了)
[submodule "deps/dpdk"]
url = http://dpdk.org/git/dpdk
[submodule "deps/dune"]
url = https://github.com/ix-project/dune.git
[submodule "deps/pcidma"]
url = https://github.com/ix-project/pcidma.git
编译子模块
## 逐步编译,dpdk可能报错,建议先把所有依赖环境安装完毕,参照DPDK的安装使用及测试。
chmod +r /boot/System.map-`uname -r`
make -sj64 -C deps/dune
make -sj64 -C deps/pcidma
make -sj64 -C deps/dpdk config T=x86_64-native-linuxapp-gcc
make -sj64 -C deps/dpdk
pcima模块用于PCI设备驱动,目的在于进行DMA/总线控制,后面的ix配置文件中如果网卡成功绑定了PCI设备号,就可以获取DMA/总线控制权,同时,使用完毕,pcima模块负责释放控制
dune模块是他们提到的安全控制模块,通过硬件虚拟化技术,让应用跑在ring0层(Intel的CPU分层访问机制),像OS一样拥有访问CPU特权并且能改变page table和注册中断等等,同时还能执行正常的系统调用。http://dune.scs.stanford.edu/dune有两大模块:kern和libdune,就是虚拟化内核和使用库函数,它只会影响调用dune_init的app,其他系统中的app不受影响。这个项目比较早,大概2010年就开工了。

编译IX:
## 注意centos和Ubuntu安装包不同,编译出现过dev报错,make clean后重新编译了一次才成功。
apt-get install libconfig-dev libnuma-dev
make -sj64
环境配置
## 目录下ix.conf为主配置文件。
cp ix.conf.sample ix.conf
# modify at least host_addr, gateway_addr, devices, and cpu
## 修改了大页配置,设置大页内存为4096(这里只是一次性修改,注意node*,分配给了每个NUMA节点)
sh -c 'for i in /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages; do echo 4096 > $i; done'
## 将编译好的dune和pcima加载到内核中
insmod deps/dune/kern/dune.ko
insmod deps/pcidma/pcidma.ko
## 加载dpdk的用户态uio驱动
modprobe uio
insmod deps/dpdk/build/kmod/igb_uio.ko
## 特别注意,这里需要关闭网卡,因为要进行dpdk绑定,ssh链接确保有两块网卡,否则需要在服务器上调试
ifconfig
eno1 Link encap:以太网 硬件地址 4c:cc:6a::5d:
inet 地址:192.168.2.100 广播:192.168.2.255 掩码:255.255.255.0
inet6 地址: fe80::::a1ed:cb9e/ Scope:Link
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::/ Scope:Host
wlp7s0 Link encap:以太网 硬件地址 :1e:7e:c3:7a:
inet 地址:192.168.3.200 广播:192.168.3.255 掩码:255.255.255.0
inet6 地址: fe80::5f5c:c814:4b64:35fd/ Scope:Link
ifdown eno1
## 无法执行,新的Linux更改了网卡的命名方式,ifdown无法识别,改用命令:
ifconfig eno1 down
## 断开链接,使用另一个ssh连接电脑——
## 绑定dpdk的uio模块到eno1网卡,address为前面检测到的PCI地址,或者lspci | grep -i eth
deps/dpdk/tools/dpdk_nic_bind.py -b igb_uio PCI_ADDRESS
## 运行IX的TCP echo服务器,这里出了一点错误:配置文件中也需要修改pci地址和同一个网段的ip地址
./dp/ix -- ./apps/echoserver
## echo | nc -vv 192.168..xxx
## 默认端口号为1234,不在同一网段,连接失败,但是服务运行成功。
.png)

关于网卡支持的问题:

他们说最新支持的型号看doc,反正我没找到doc。。。大概翻了一下的他们的代码,关于设备驱动的就这里进行了特殊加载:

ixgbe和i40e驱动都是Intel支持虚拟化功能的驱动,它们的主要作用有两点:一是SR-IOV mode,直接将端口资源分配给不同访客操作系统,以开启本地模式;二是VMDq mode,通过IO虚拟机或虚拟监视器进行网络资源集中管理,可以进行软件切换加速模式。上面也看到了,在加载vfio模块的时候报错了,但是这里ix跳过去了,应该也是支持普通模式的,我还没研究这个普通模式的具体区别是啥样的。http://dpdk.readthedocs.io/en/latest/nics/intel_vf.html
三、最后再介绍一下IX-project这波人
这个项目是DARPA(美国国防预先研究计划局)的crash计划资助的,有一定的军方背景,论文主要是14年在USENIX的OSDI发表的这篇:

同年和15年产生了很多类似的项目,更出名一点的是韩国人在USENIX的NSDI发表的mtcp。16年IX这波人在ACM的TOCS上又投了一篇类似的文章。

.png)
人没咋换,我就顺手看了一下,主要是斯坦福的几个人,瑞士的没仔细看。一作Adam Belay是16年毕业的博士,这里头的三作者Christos Kozyrakis是他的导师,Christos是希腊人,到UC Berkeley读的研究生,他研究的东西挺杂,硬件架构、系统环境、系统软件、编程模型等等,从他的词云里没看到ix,只看到了前面的dune,这个项目也是Adam Belay和他搞的。


我就又查了查Christos的导师,他02年从伯克利毕业,导师是UC Berkeley的David Patterson,这个老头很出名,他是精简指令集RSIC的创始人,他还提出了冗余廉价磁盘阵列RAID,他还是体系结构的量化分析、云计算等概念的创始人之一。。。震惊。。。原来老外的水都这么深。。。

.png)
IX-Protected Dataplane Operating System解读的更多相关文章
- [Chapter 3 Process]Practice 3.3 Discuss three major complications that concurrent processing adds to an operating system.
3.3 Original version of Apple's mobile iOS operating system provied no means of concurrent processi ...
- How to Make a Computer Operating System
How to Make a Computer Operating System 如何制作一个操作系统(翻译版) 原文地址:Github:How to Make a Computer Operating ...
- General-Purpose Operating System Protection Profile
1 Protection Profile Introduction This document defines the security functionality expected to be ...
- 《modern operating system》 chapter 5 Input and output 注意事项
Input / Output It should also provide an interface between the devices and the rest of the system th ...
- DBCC CHECKDB 遭遇Operating system error 112(failed to retrieve text for this error. Reason: 15105) encountered
我们一个SQL Server服务器在执行YourSQLDBa的作业YourSQLDba_FullBackups_And_Maintenance时遇到了错误: Exec YourSQLDba.Maint ...
- The World's Only Advanced Operating System
The World's Only Advanced Operating System
- Unable to open the physical file xxxx. Operating system error 2
在新UAT服务器上,需要将tempdb放置在SSD(固态硬盘)上.由于SSD(固态硬盘)特性,所以tempdb的文件只能放置在D盘下面,而不能是D盘下的某一个目录下面. ALTER DATABASE ...
- CREATE FILE encountered operating system error 5(Access is denied.)
这篇博文主要演示"CREATE FILE encountered operating system error 5(Access is denied.)"错误如出现的原因(当然只是 ...
- Linux启动报错missing operating system
用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...
随机推荐
- Vim配置及使用笔记
Vim配置及使用笔记 安装 apt-get install vim -y 配置说明 vim /etc/vim/vimrc 在配置文件后加入这些配置项 set nu set tabstop=4 set ...
- 【手记】让Fiddler抓取入站请求,或者叫用Fiddler做反向代理
注意:本文不涉及HTTPS的场景 最近在弄公众号开发,除了主动去调公众号接口,还存在公众号后台要反过来调你的情形,攻受转换一线间.对于回调的情况,想要知道对方是怎样来请求的很有必要.此前经常用Fidd ...
- SUCTF--WEB
题目:flag 在哪? 介绍:网址(http://23.106.143.230/a_real_babyweb.php) 1,打开网址,抓包可以发现在 HTTP 头里面有 Cookie:suctf{Th ...
- SQLServer2008数据库连接error40错误
在连接SQL Server偶尔会遇到报错,如在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为 ...
- Ubuntu安装pyenv实现多版本控制
Ubuntu安装pyenv实现多版本控制 git clone git://github.com/yyuu/pyenv.git ~/.pyenv echo 'export PYENV_ROOT=&quo ...
- 字符串的缺点以及StringBuilder
字符串的缺点: String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的 ...
- C语言一些知识点总结
一.关键字 1. 什么是关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doubl ...
- 杭电ACM——自我强化步骤
第一阶段:开始入门吧!(15天,53题) http://blog.csdn.net/always2015/article/details/44966019#t0 一.输入输出练习(2天,10题) 10 ...
- Webpack飞行手册
前言 在学习 Webpack 之前,我们需要了解一个概念:模块. 何为模块? 如果你曾学过 Java , C# 之类的语言,一定会知道 Java 中的 import 或 C# 中的 using 吧? ...
- 超简单的php缓存类
<?php class Cache { private $dir = "data/cache/";//定义缓存目录 private $key='c_a_sss'; // 文件 ...