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.3 LTS #lspci | # hardinfo Intel(R) Core(TM) i7-6800K CPU @ 3.40GHz 12 00:19.0 Ethernet controller: Intel Corporation Ethernet Connection (2) I218-V (rev 05) 07:00.0 Network controller: Intel Corporation WiFi Link 5100 03: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:16329504 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:43:5d:91 inet 地址:192.168.2.100 广播:192.168.2.255 掩码:255.255.255.0 inet6 地址: fe80::9193:9580:a1ed:cb9e/64 Scope:Link lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host wlp7s0 Link encap:以太网 硬件地址 00:1e:7e:c3:7a:06 inet 地址:192.168.3.200 广播:192.168.3.255 掩码:255.255.255.0 inet6 地址: fe80::5f5c:c814:4b64:35fd/64 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 4 ## echo 123 | nc -vv 192.168.2.xxx 1234 ## 默认端口号为1234,不在同一网段,连接失败,但是服务运行成功。
关于网卡支持的问题:
他们说最新支持的型号看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上又投了一篇类似的文章。
人没咋换,我就顺手看了一下,主要是斯坦福的几个人,瑞士的没仔细看。一作Adam Belay是16年毕业的博士,这里头的三作者Christos Kozyrakis是他的导师,Christos是希腊人,到UC Berkeley读的研究生,他研究的东西挺杂,硬件架构、系统环境、系统软件、编程模型等等,从他的词云里没看到ix,只看到了前面的dune,这个项目也是Adam Belay和他搞的。
我就又查了查Christos的导师,他02年从伯克利毕业,导师是UC Berkeley的David Patterson,这个老头很出名,他是精简指令集RSIC的创始人,他还提出了冗余廉价磁盘阵列RAID,他还是体系结构的量化分析、云计算等概念的创始人之一。。。震惊。。。原来老外的水都这么深。。。