為提高轉發效率對linux內核進行優化,應該從哪些方面著手?

目前要開發一款防火牆產品,需要對linux內核進行優化,目的是提高報文的轉發速度,如果能達到線速最好。現在如果不考慮硬體因素,單從軟體考慮,應該對linux內核如何優化,需要從哪些方面著手?


不要上來就談優化,先分析遇到了什麼瓶頸,目前存在哪些問題滿足不了你的需要,再去想優化的辦法。

一般可以從下面幾個角度考慮:

1. 你們自己的驅動代碼寫得是否夠優化(這是首要的)

2. 內存使用量是否滿足要求,內核的內存分配是否會進入slowpath

3. 進程的調度是否影響

4. 中斷風暴


這個10年前我做過,那個時候內核版本2.8(抱歉,是2.6,版本都記錯了),剛出來沒多久。當時我是把2.8內核修改了,作為路由器的專用OS,具體過程我不記得了,我只能說一下大致思路:

首先要分析Linux網路驅動部分代碼(當時把網路相關代碼全部讀完了),我依稀記得它處理報文分了幾步走的,從網卡那裡獲取數據後經過內核網路處理,好像有個什麼隊列,然後把報文放到這個隊列裡面,然後再轉發。就是對這個過程進行優化(網路隊列的修改,轉發過程的修改)。你要畫出這部分工作的流程圖,即網卡接收數據-內核處理-轉發(還是通過網卡),熟悉工作過程(基本上你讀完整個部分代碼,畫出流程圖就知道怎麼弄了,如果會編程的話)。然後可能要修改Linux進程處理代碼(進程調度,讓內核網路處理進程始終處於高優先順序,這部分也是要分析代碼的),然後卸載內核中的文件驅動、媒體驅動等所有無用的東西,讓內核只運行網路相關的進程。

記得當時我就是這樣做的,精簡了一個專門處理網路的內核,好像編譯完只有幾MB或者&<1MB。

當時是自己弄著玩,沒有做成實際產品,但測試了網路轉發效率相當高(2.8內核時鐘周期是1ms,這個也被改了,就專門做數據包的處理),好像是可以達到普通路由器的吞吐量,具體指標不記得了。那個時候沒有openWrt,自己瞎折騰。當然你也可以拿一個openWrt來改,應該也是可以的。

時間久遠,細節不記得了,見諒,希望有所幫助。

ps:當時用了一個什麼工具(叫什麼sight之類的?)把內核代碼全部導入,閱讀非常方便。


可以把釋放的skb回收。不用每個報文進來分配skb。用上個發掉的skb。但是這個要看流量。流量大的情況下還是挺有用的。

標準報文轉發流程里有Qos調度,可以關掉,會影響性能

能在交換晶元轉發掉的盡量用交換晶元。上cpu進內核轉發流程本事就是件可以優化的事。

Napi可以打開,中斷多的情況下Napi可以提升性能


推薦閱讀:

匿名者因「正義」黑掉四所醫院資料庫
白帽子講Web安全

TAG:Linux | 網路安全 | 防火牆 | 計算機網路 | Linux內核 |