1. Install Ubuntu and DPDK for new server.
TBD:
a. BIOS Setting
b. boot setting
c. OVS installation
d. Try a DPDK sample
2. 研究NIC+Linux Kernel如何處理封包+DPDK帶來的好處
TBD:
a. DPDK如何運作
3. Still reading SDN and DDoS Attacks in Cloud Computing Environments: A Survey, Some Research Issues, and Challenges (25 paper citations) (30%)
4. 完成ASIC HW3
Driver
1. Kernel boots up 2.資料結構初始化 3. 設定interrupt參數 4. 告訴NIC把收到的封包放到哪裡(Main memory socket buffer)
把driver註冊到PCI bus, 在PCI bus上面啟用裝置, 設定interrupt handler(知道收到封包後該怎麼處理), 配置Tx/Rx資源, multi-queue 分散CPU負擔, 設定HW跟SW interrupt routine, 每個queue有自己的interrupt number對應特定的CPU core來做off-loading, 接下來trigger HW interrupt完成後跟著觸發SW interrupt
igb driver運作範例:(參考)
1. 封包到達NIC
2. 找下一個HW descriptor allocate的memory位址(初始化的時候NIC的Descriptor Ring指向記憶體並分配一個空的區塊來當做socket buffer,存packet )
3. 透過DMA把封包寫到socket buffer(Main memory)並由linux kernel maintain. 當封包複製到socket buffer後
4. 產生HW interrupt 告訴CPU可以開始處理進來的封包了,CPU會call interrupt handler,interrupt handler會把NIC加到poll_list,和產生由SW interrupt,kernel現在知道放在接收佇列的封包現在可以被進一步處理了,例如繼續往上送到TCP/IP Stack。kernel開始執行預先設定的的interrupt routine, 最後把queue跟某個特定的CPU core連結起來。
(封包在記憶體main memory內要複製兩次, 第一次由NIC到kernel space main memory, 第二次由kernel space到user space) >> CPU access memory need幾百個clock cycle
名詞解釋:
HW interrupt : 當NIC收完封包後,觸發interrupt告訴CPU中斷其正在處理的程序,以便來處理NIC所需的input或output動作,此動作即原先所定義好的interrupt service routine.
SW interrupt(Soft IRQ):Put in CPU's backlog queue as softIRQ so whenever it get chance, it will start processing and move the packet upto TCP/ IP stack. Doing TCP/ IP processing and provide data to application stack.
Interrupt : 控制週邊裝置時,與同步、鎖定等功能同樣不可或缺的是「中斷」機制。 由於IO設備的速度遠慢於CPU,如果CPU要等待IO動作完成並處理的話,效率是非常差的。透過interrupt機制可解決這問題,當IO動作完成後會發出一個asynchronous interrupt,CPU偵測後會暫停手邊的工作,然後喚醒ISR(interrupt service routine)執行,並處理I/O的請求。
例如,網路卡在收到外面傳來的封包時,就會以中斷向 CPU 報告,CPU 偵側到裝置傳來的中斷後,就會立刻執行 OS 的「中斷處理程序(interrupt handler)」。「中斷處理程序(interrupt handler)」涵蓋了「中斷程序(interrupt routine)」以及「中斷服務程序(ISR: Interrupt Service Routine)」,各種 OS 用的稱呼都不太一樣,但概念都是相同的。
Kernel / User Overhead : 傳統硬體收到封包後觸發 interrupt 後導到 Linux Kernel, 如果還要進入 user space,就要通過 copy_to_user/copy_from_user 這樣的機制,而這會牽扯到記憶體拷貝的問題,這是因為不能讓 user space 直接讀到 kernel space 的記憶體管理,免得造成系統錯誤,所以作業系統會用一塊虛擬化的記憶體位置來給 user space 的 process,而這種記憶體保護機制以及拷貝很吃系統資源,這也是為什麼傳統上在處理 Linux 的 Data Plane 的時候都盡可能在 Kernel 處理,減少 user space 和 kernel space 記憶體拷貝所造成效率低下。
DPDK架構:
數學算式 >> 1GbE >> 1.48M packet / sec >> means 672ns to process before next frame came inside
10GbE >> 14.8M packet / sec >> means 67.2ns >> 134 clock cycles in Xeon 2GHz
8 bytes 同步 / 64 bytes 最小封包大小 / 12 bytes inter frame gap