近期計畫系統地學習下 f-stack,所以還是希望能夠以文件的形式記錄下來,作為學習總結吧。先來看下傳統核心協議棧帶來的效能瓶頸問題。
linux 核心在網路資料報處理上的瓶頸也越發明顯,在傳統的核心協議棧中,網**過硬中斷通知協議棧有新的資料報到達,核心的網絡卡驅動程式負責處理這個硬體中斷,將資料報從網絡卡佇列拷貝至核心開闢的緩衝區,然後資料報經過一系列的協議棧處理流程,最後送到使用者程式指定的緩衝區中。
在這個過程中,中斷處理、記憶體拷貝、系統呼叫、鎖、軟中斷、上下文切換等嚴重影響了網路資料報的處理能力。另外,作業系統對應用程式和資料報處理,可能跨 cpu 排程,區域性性失效進一步影響網路效能。
可能有人會比較疑惑,linux 竟然有這麼多缺點,高效能網路處理不是它的強項麼?個人理解,linux 首先是乙個多工的,通用的作業系統,而我們平時追求的高效能目標一般是落地到某個具體的應用程式。linux 設計時要考慮安全、多工等因素,所以 linux 不是乙個專用的作業系統。試想乙個追求各方面平衡的作業系統,是不會把系統資源都分給乙個應用程式來使用,如何能夠做到專用裝置的高效能呢?
dpdk 全稱是 data plane development kit,資料平面開發工具集,提供高效能收發包框架,專注於網路應用中資料報的高效能處理。它是 intel 公司開發與開源的專案,目前很多大廠基本都有在使用。
dpdk 是將各種常見的效能優化的技術手段綜合了起來,形成了優秀的網路收發包框架,本質上並沒有引入特別多新技術。所以,dpdk 體系包含了非常多的值得學習的知識點和技術,由於涉及內容範圍廣泛,學習的話需要選擇重點才能更高效的達到預期的目標。
(一)背景
(二)能幹什麼
(三)應用場景
dpdk 具備高效能、高吞吐、低延時等優點,具備如下的應用場景 缺點
(四)如何實現高效能
網絡卡佇列與 cpu 繫結
批處理收發包;
高效的記憶體分配機制;
大頁記憶體
系統呼叫 & lib 庫
無鎖訊息佇列;
cache 預取、分支**等;
dpdk 實際上涉及的技術知識點非常廣,基本上涵蓋了作業系統的方方面面,很難用簡單語言來描繪出它的輪廓來,等我們逐步學習來領會它的強大和奧妙吧。
可以看到 f-stack 並不是一蹴而就的,經過了很多方案的迭代和嘗試,最終形成了 f-stack 系統。
f-stack 是一款兼顧高效能、易用性、通用性的網路開發框架,傳統上的 dpdk 大多用於 sdn、nfv、dns 等簡單的應用場景下,對於複雜的 tcp 協議棧上的七層應用很少,市面上已經出現了部分使用者態協議棧,如 mtcp、mirage、iwip、nuse 等,也有使用者態的程式設計框架,如 seastar 等,但統一的特點是應用程式接入門檻較高,不易於使用。
f-stack 使用純 c 實現,充當膠水粘合了 dpdk、freebsd 使用者態協議棧、posix api、微執行緒框架和上層應用(nginx、redis),使絕大部分網路應用可以通過直接修改配置或替換系統的網路介面即可接入 f-stack,從而獲得更高的網路效能;
(一)為什麼採用 freebsd 協議棧
關於 mtcp 使用者態協議棧的問題
為什麼不用 linux?
採用 freebsd 幾個原因
(二)對 freebsd 的修改
f-stack 充當膠水粘合了 dpdk、freebsd 使用者態協議棧、posix api 等,提供了乙個全使用者態的開發套件。
f-stack 是多程序架構模型,每個程序獨享協議棧,架構簡圖如下:
全使用者態
share-nothing 架構
提供了 posix-like api
coroutine(協程)
工具(tools)
優化 & 最佳實踐
補加官方社群提供的 roadmap:
初步認識繼承
include stdafx.h include using namespace std 構造方式跟類內類物件是一樣的 父類 info 派生類 sci 派生類 sci 父類 info struct info 父類 void outputinfo info info private int numb ...
初步認識redis
1.什麼redis 2.為什麼使用redis 3.什麼場合使用redis 4.redis的好處 5.編譯安裝redis 6.redis資料結構 1.什麼是redis redis是remote dictionary server 遠端資料服務 的縮寫,是義大利人antirez開發的一款記憶體快取記憶體...
kafka初步認識
producer 訊息生產者,向kafka集 送訊息,它是乙個程式 consumer 訊息消費者,從kafka集群獲取資料,它是乙個程式 broker kafka集群的最小組成單元,它是乙個服務 topic kafka將producer產生的訊息按照topic進行分類 partition kafka...