Linux內核網卡收包機制歷史變革

Linux內核對網卡收包處理機制大約經歷了4個階段。

1、網卡在同一時刻只能接收一個包,當網卡接收到包之後,馬上向中斷控制器發出中斷請求,中斷控制器向CPU發出中斷信號。

2、網卡在同一時刻能接收多個包,單CPU,網卡接收到多個包的時刻,馬上向中斷控制器發出中斷請求,中斷控制器向CPU發出中斷信號。

3、網卡在同一時刻能接收多個包,多CPU,網卡接收到多個包的時刻,馬上向中斷控制器發出中斷請求,中斷控制器向CPU發出中斷信號,所有CPU都將接收到數據包放入同一個接受隊列裏。

4、網卡支持多隊列+DMA方式,多CPU,網卡接收到多個包的時刻,主動把數據包通過網卡DMA到rx_ring(多個)裏,當DMA完成時,發生網卡硬件中斷,在硬中斷裏調用軟中斷,軟中斷把該CPU對應的r_ring裏buffer拷貝到鏈路層(又稱爲接口層)接收隊列裏。

第一個階段(約1985~1997?):

tcp/ip協議棧在1985左右開始集成到BSD UNIX內核中。在那個年代,互聯網是個稀罕玩意兒,網絡流量不大,網卡性能也比較弱。

網絡處理機制從純硬中斷到下半部機制過渡。


第二個階段(約1997~2000?):

網絡流量開始增大,傳統的Linux下半部機制仍然能應付。


第三個階段(2000~2008?):

Linux內核開始出現NAPI網絡處理機制。

這個階段最大的問題在於SMP下網卡的優勢無法發揮出來。中斷落在CPU0上,SMP對網卡處理負載不均衡。流量大的時候,CPU0負載很高,網卡丟包現象嚴重。

解決問題的方法是採用APIC中斷控制器,但是,此時接收隊列仍然只有1個,即便網卡中斷均衡到多個CPU, 接收隊列只有一個 ,CPU對網卡數據處理仍然有很大瓶頸。這好比5個未成年男淫與一個成年女性輪流發生性關係,沒辦法5個人一起來,只能輪流來。


第四個階段:(約2008?~now):

多隊列網卡出現。同一個網卡具備多個rx_ring和DMA功能。本質上,借用了NUMA架構思想(與SMP同一層級的架構)。


發佈了171 篇原創文章 · 獲贊 9 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章