本文爲做者原創,轉載請註明出處(http://www.cnblogs.com/mar-q/)by 負贔屓html
1、概述node
商業操做系統在應用程序每秒鐘須要數百萬次操做時才能保持高吞吐量和低(尾)延遲,對於最慢的請求只需幾百微秒。一般認爲對於高性能網絡(小信息的高包率、低延遲)的構建,最好都是在內核以外構建用戶態協議,IX提出了dataplane operating system,提供高IO性能同時保持內核的安全性。IX經過硬件虛擬化技術分離內核網絡處理的調度和管理。linux
若是閱讀本文有些困惑,能夠先閱讀個人上一篇文章《NFV、DPDK以及部分用戶態協議研究》。git
2、IX在HOME服務器的配置運行github
基本需求編程
未發現IX的requirement page(估計關閉了),在GitHub上說須要DPDK以及Intel網卡8259九、X520、X540,aws ec2測試失敗,家裏一臺realtek網卡機器測試失敗,如今另外一臺Intel網卡服務器測試,具體配置信息爲:centos
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
3、最後再介紹一下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,他仍是體系結構的量化分析、雲計算等概念的創始人之一。。。震驚。。。原來老外的水都這麼深。。。