本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃

  一、概述

  商业操作系统在应用程序每秒钟需要数百万次操作时才能保持高吞吐量和低(尾)延迟,对于最慢的请求只需几百微秒。通常认为对于高性能网络(小信息的高包率、低延迟)的构建,最好都是在内核之外构建用户态协议,IX提出了dataplane operating system,提供高IO性能同时保持内核的安全性。IX通过硬件虚拟化技术分离内核网络处理的调度和管理。

  如果阅读本文有些困惑,可以先阅读我的上一篇文章《NFV、DPDK以及部分用户态协议研究》。

  二、IX在HOME服务器的配置运行

  1. 基本需求

  未发现IX的requirement page(估计关闭了),在GitHub上说需要DPDK以及Intel网卡82599、X520、X540,aws ec2测试失败,家里一台realtek网卡机器测试失败,现在另一台Intel网卡服务器测试,具体配置信息为:

  1. Ubuntu 16.04. LTS
  2. #lspci | # hardinfo
  3. Intel(R) Core(TM) i7-6800K CPU @ .40GHz
  4. :19.0 Ethernet controller: Intel Corporation Ethernet Connection () I218-V (rev )
  5. :00.0 Network controller: Intel Corporation WiFi Link
  6. :00.0 VGA compatible controller: NVIDIA Corporation Device 1b80 (rev a1)
  7. # lscpu
  8. 虚拟化:VT-x
  9. L1d cache32K
  10. L1i cache32K
  11. L2 cache256K
  12. L3 cache15360K
  13. # /proc/meminfo
  14. MemTotal: kB
  1. 下载ix项目及相关子模块

  1. git clone https://github.com/ix-project/ix.git
  2. git submodule update --init
  3. ## 子模块下载速度比较慢,尤其是dpdk(我在aws上下载好了)
  4. [submodule "deps/dpdk"]
  5. url = http://dpdk.org/git/dpdk
  6. [submodule "deps/dune"]
  7. url = https://github.com/ix-project/dune.git
  8. [submodule "deps/pcidma"]
  9. url = https://github.com/ix-project/pcidma.git
  1. 编译子模块

  1. ## 逐步编译,dpdk可能报错,建议先把所有依赖环境安装完毕,参照DPDK的安装使用及测试。
  2. chmod +r /boot/System.map-`uname -r`
  3. make -sj64 -C deps/dune
  4. make -sj64 -C deps/pcidma
  5. make -sj64 -C deps/dpdk config T=x86_64-native-linuxapp-gcc
  6. 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年就开工了。

  1. 编译IX:

  1. ## 注意centos和Ubuntu安装包不同,编译出现过dev报错,make clean后重新编译了一次才成功。
  2. apt-get install libconfig-dev libnuma-dev
  3. make -sj64
  1. 环境配置

  1. ## 目录下ix.conf为主配置文件。
  2. cp ix.conf.sample ix.conf
  3. # modify at least host_addr, gateway_addr, devices, and cpu
  4. ## 修改了大页配置,设置大页内存为4096(这里只是一次性修改,注意node*,分配给了每个NUMA节点)
  5. sh -c 'for i in /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages; do echo 4096 > $i; done'
  6. ## 将编译好的dune和pcima加载到内核中
  7. insmod deps/dune/kern/dune.ko
  8. insmod deps/pcidma/pcidma.ko
  9. ## 加载dpdk的用户态uio驱动
  10. modprobe uio
  11. insmod deps/dpdk/build/kmod/igb_uio.ko
  12. ## 特别注意,这里需要关闭网卡,因为要进行dpdk绑定,ssh链接确保有两块网卡,否则需要在服务器上调试
  13. ifconfig
  14. eno1 Link encap:以太网 硬件地址 4c:cc:6a::5d:
  15. inet 地址:192.168.2.100 广播:192.168.2.255 掩码:255.255.255.0
  16. inet6 地址: fe80::::a1ed:cb9e/ Scope:Link
  17. lo Link encap:本地环回
  18. inet 地址:127.0.0.1 掩码:255.0.0.0
  19. inet6 地址: ::/ Scope:Host
  20. wlp7s0 Link encap:以太网 硬件地址 :1e:7e:c3:7a:
  21. inet 地址:192.168.3.200 广播:192.168.3.255 掩码:255.255.255.0
  22. inet6 地址: fe80::5f5c:c814:4b64:35fd/ Scope:Link
  23. ifdown eno1
  24. ## 无法执行,新的Linux更改了网卡的命名方式,ifdown无法识别,改用命令:
  25. ifconfig eno1 down
  26. ## 断开链接,使用另一个ssh连接电脑——
  27. ## 绑定dpdk的uio模块到eno1网卡,address为前面检测到的PCI地址,或者lspci | grep -i eth
  28. deps/dpdk/tools/dpdk_nic_bind.py -b igb_uio PCI_ADDRESS
  29. ## 运行IX的TCP echo服务器,这里出了一点错误:配置文件中也需要修改pci地址和同一个网段的ip地址
  30. ./dp/ix -- ./apps/echoserver
  31. ## echo | nc -vv 192.168..xxx
  32. ## 默认端口号为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,他还是体系结构的量化分析、云计算等概念的创始人之一。。。震惊。。。原来老外的水都这么深。。。

IX-Protected Dataplane Operating System解读的更多相关文章

  1. [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 ...

  2. How to Make a Computer Operating System

    How to Make a Computer Operating System 如何制作一个操作系统(翻译版) 原文地址:Github:How to Make a Computer Operating ...

  3. General-Purpose Operating System Protection Profile

    1 Protection Profile Introduction   This document defines the security functionality expected to be ...

  4. 《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 ...

  5. 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 ...

  6. The World's Only Advanced Operating System

    The World's Only Advanced Operating System

  7. Unable to open the physical file xxxx. Operating system error 2

    在新UAT服务器上,需要将tempdb放置在SSD(固态硬盘)上.由于SSD(固态硬盘)特性,所以tempdb的文件只能放置在D盘下面,而不能是D盘下的某一个目录下面. ALTER  DATABASE ...

  8. CREATE FILE encountered operating system error 5(Access is denied.)

    这篇博文主要演示"CREATE FILE encountered operating system error 5(Access is denied.)"错误如出现的原因(当然只是 ...

  9. Linux启动报错missing operating system

    用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...

随机推荐

  1. 其他信息: ORA-01400: 无法将 NULL 插入

    这个错误其实就是oracle数据库的某列约束为 not null,但在插入值的时候插入了控制,无论是null和"",它都识别为空 有两种方法: 1.修改数据库字段约束为允许为空 2 ...

  2. linux expect自动登陆远程服务器 批量管理服务器

    #!/usr/bin/expect set ipaddress [lindex $argv 0] set passwd [lindex $argv 1] set timeout 3 spawn ssh ...

  3. vim操作命令

    一,命令模式下 文件顶部: gg 文件底部: G 删除当前行:dd 删除当前行,并进入INSERT模式: cc 取消删除:u

  4. View处理常用方法封装

    处理View常用的一些方法:Drawable和Bitmap互相转换,Bitmap改变大小,dp.px互相转换,sp.px互相转换,根据Id查找Drawable,获取屏幕大小等方法. import an ...

  5. openface 训练数据集

    训练深度网络模型OpenFace还不是运用faceNet的model作为训练模型,所以在准确性上比faceNet要低,如果你只是做一个简单的分类,建议你看看官网的demo3(http://cmusat ...

  6. 分布式监控系统Zabbix3.2给异常添加邮件报警

    在前一篇 分布式监控系统Zabbix3.2跳坑指南 中已安装好服务端和客户端,此处客户端是被监控的服务器,可能有上百台服务器.监控的目的一个是可以查看历史状态,可以对比零晨和工作区间数据的对比,以便后 ...

  7. eclipse中将本地项目上传到svn库

    转载文章:http://blog.csdn.net/singit/article/details/48972197

  8. Netty4 学习笔记之四: Netty HTTP服务的实现

    前言 目前主流的JAVA web 的HTTP服务主要是 springMVC和Struts2,更早的有JSP/servlet. 在学习Netty的时候,发现Netty 也可以作HTTP服务,于是便将此整 ...

  9. python 3.6 tkinter+urllib+json 火车车次信息查询

    --------blogs:  陈月白    http://www.cnblogs.com/chenyuebai    -------- 一.概述 妹子工作时需要大量地查询火车车次至南京的信息,包括该 ...

  10. 错误代码: 1054 Unknown column 't.createUsrId' in 'group statement'

    1.错误描写叙述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:select count(t.id),t.`createUserId` ...