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同一層級的架構)。