韩国保姆2_少女伦理电影_HD中文字幕在线观看,玩偶姐姐在线观看高清,8090新视觉电影免费播放在线观看,98蜜桃

沃趣科技技術社區
行業前沿信息一網打盡
技術社區 > 性能優化|Nocalhost - 讓云原生時代的開發更高效1

性能優化|Nocalhost - 讓云原生時代的開發更高效1

2023年06月07日

從初學者角度,介紹 Linux 內核如何接收網絡幀:從網卡設備完成數據幀的接收開始,到數據幀被傳遞到網絡棧中的三層結束。重點介紹內核的工作機制,不會深入過多代碼層面的細節,示例代碼來自 Linux 2.6。


設備的通知手段


從計算機硬件的角度,一個數據幀從進入網卡到最后被內核處理的整體示意圖如下:


               


               

當網卡設備完成一個數據幀的接收后,可能將數據幀暫存于設備內存,也可能通過 DMA(Direct memory access) 直接寫入到主內存的接收環(rx                    ring),接著必須通知操作系統內核對已接收的數據進行處理。下面將討論幾種可能的通知手段。


輪詢


輪詢(Polling)指的是由內核主動地去檢查設備,比如定期讀取設備的內存寄存器,判斷是否有新的接收幀需要處理。這種方式在設備負載較高時響應效率低,在設備負載低時又占用系統資源,操作系統很少單獨采用,結合其他機制后才能實現較理想的效果。


硬件中斷


當接收到新的數據幀等事件發生時,設備將生成一個硬件中斷信號。該信號通常由設備發送給中斷控制器,由中斷控制器分發給 CPU。CPU                    接受信號后將從當前執行的任務中被打斷,轉而執行由設備驅動注冊的中斷處理程序來處理設備事件。中斷處理程序會將數據幀拷貝到內核的輸入隊列中,并通知內核做進一步處理。這種技術在低負載時表現良好,因為每一個數據幀都會得到及時響應,但在負載較高時,CPU                    會被頻繁的中斷從而影響到其他任務的執行。


對接收幀的處理通常分為兩個部分:首先驅動注冊的中斷處理程序將幀復制到內核可訪問的輸入隊列中,然后內核將其傳遞給相關協議的處理程序直到最后被應用程序消費。第一部分的中斷處理程序是在中斷上下文中執行的,可以搶占第二部分的執行,這意味著復制接收幀到輸入隊列的程序比消費數據幀的協議棧程序有更高的優先級。


在高流量負載下,中斷處理程序會不斷搶占 CPU。后果顯而易見:輸入隊列最終將被填滿,但應該去出隊并處理這些幀的程序處于較低優先級沒有機會執行。結果新的接收幀因為輸入隊列已滿無法加入隊列,而舊的幀因為沒有可用的                    CPU 資源不會被處理。這種情況被稱為接收活鎖(receive-livelock)。


硬件中斷的優點是幀的接收和處理之間的延遲非常低,但在高負載下會嚴重影響其他內核或用戶程序的執行。大多數網絡驅動會使用硬件中斷的某種優化版本。


一次處理多個幀


一些設備驅動會采用一種改良方式,當中斷處理程序被執行時,會在指定的窗口時間或幀數量上限內持續地入隊數據幀。由于中斷處理程序執行時其他中斷將被禁用,因此必須設置合理的執行策略來和其他任務共享 CPU 資源。


該方式還可進一步優化,設備僅通過硬件中斷來通知內核有待處理的接收幀,將入隊并處理接收幀的工作交給內核的其他處理程序來執行。這也是 Linux 的新接口 NAPI 的工作方式。


在實踐中的組合


不同的通知機制有其適合的工作場景:低負載下純中斷模型保證了極低延遲,但在高負載下表現糟糕;計時中斷在低負載下可能會引入過高延遲并浪費 CPU 時間,但在高負載下對減少 CPU                    占用和解決接收活鎖有很大幫助。在實踐中,網絡設備往往不依賴某種單一模型,而是采取組合方案。


以 Linux 2.6 Vortex 設備所注冊的中斷處理函數 vortex_interrupt(位于 /drivers/net/3c59x.c)為例:


設備會將多個事件歸類為一種中斷類型(甚至還可以在發送中斷信號前等待一段時間,將多個中斷聚合成一個信號發送)。中斷觸發 vortex_interrupt 的執行并禁用該 CPU 上的中斷。


如果中斷是由接收幀事件 RxComplete 引發,處理程序調用其他代碼處理設備接收的幀。


vortex_interrupt 在執行期間持續讀取設備寄存器,檢查設備是否有新的中斷信號發出。如果有且中斷事件為 RxComplete,處理程序將繼續處理接收幀,直到已處理幀的數量達到預設的                    work_done值才結束。而其他類型的中斷將被處理程序忽略。


軟中斷處理機制


當硬件中斷信號到達 CPU 后,需要通過合理的任務調度機制,才能以較低延遲處理接收幀,又避免接收活鎖和饑餓等資源搶占問題。


一個中斷通常會觸發以下事件:


設備產生一個中斷并通過硬件通知內核。


如果內核沒有正在處理另一個中斷(即中斷沒有被禁用),它將收到這個通知。


內核禁用本地 CPU 的中斷,并執行與收到的中斷類型相關聯的處理程序。


內核退出中斷處理程序,重新啟用本地 CPU 的中斷。


CPU 在執行中斷號對應處理程序的期間處于中斷上下文,中斷會被禁用。這意味著 CPU 在處理某個中斷期間,它既不會處理其他中斷,也不能被其他進程搶占,CPU                    資源由該中斷處理程序獨占。這種設計決定減少了競爭條件的可能性,但也帶來了潛在的性能影響。


顯然,中斷處理程序應當盡可能快地完成工作。不同的中斷事件所需要的處理工作量并不相同,比如當鍵盤的按鍵被按下時,觸發的中斷處理函數只需要將該按鍵的編碼記錄下來,而且這種事件的發生頻率不會很高;而處理網絡設備收到的新數據幀時,需要為                    skb 分配內存空間,拷貝接收到的數據,同時完成一些初始化工作比如判斷數據所屬的網絡協議等。


為了盡量減少 CPU 處于中斷上下文的時間,操作系統為中斷處理程序引入了上、下半部的概念。


下半部處理程序


即使由中斷觸發的處理動作需要大量的 CPU 時間,大部分動作通常是可以等待的。中斷可以第一時間搶占 CPU                    執行,因為如果操作系統讓硬件等待太長時間,硬件可能會丟失數據。這既適用于實時的數據,也適用于在固定大小緩沖區中存儲的數據。如果硬件丟失了數據,一般沒有辦法再恢復(不考慮發送方重傳的情況)。                    另一方面,內核或用戶空間的進程被推遲執行或搶占時,一般不會有什么損失(對實時性有極高要求的系統除外,它需要用完全不同的方式來處理進程和中斷)。

讓數據庫基礎設施更簡單
加速企業數字化轉型建設及落地
立即咨詢

沃趣科技

中立的企業級數據庫云
十年磨一劍十年來始終如一的專注數據庫生態領域
夯實技術底蘊打造最適合時代的數據庫基礎設施
業績持續領先目前已累計服務超3000家企業客戶

留言咨詢

完善信息,我們第一時間跟您聯系
姓名
手機
公司
所在地區
咨詢問題