第一點,是網路收發過程中,收發佇列和緩衝區位置的疑問。在 關於 linux 網路,你必須要知道這些 中,我曾介紹過 linux 網路的收發流程。這個流
程涉及到了多個佇列和緩衝區,包括:
不過相應的,就會有兩個問題。
首先,這些緩衝區的位置在哪兒?是在網絡卡硬體中,還是在記憶體中?這個問題其實仔細想一下,就很容易明白——這些緩衝區都處於核心管理的記憶體中。
其中,環形緩衝區,由於需要 dma 與網絡卡互動,理應屬於網絡卡裝置驅動的範圍。
sk_buff 緩衝區,是乙個維護網路幀結構的雙線鍊錶,鍊錶中的每乙個元素都是乙個網路幀(packet)。雖然 tcp/ip 協議棧分了好幾層,但上下不同層之間的傳遞,實際上只需
要操作這個資料結構中的指標,而無需進行資料複製。
套接字緩衝區,則允許應用程式,給每個套接字配置不同大小的接收或傳送緩衝區。應用程式傳送資料,實際上就是將資料寫入緩衝區;而接收資料,其實就是從緩衝區中讀取。
至於緩衝區中資料的進一步處理,則由傳輸層的 tcp 或 udp 協議來完成。
其次,這些緩衝區,跟前面記憶體部分講到的 buffer 和 cache 有什麼關聯嗎?
這個問題其實也不難回答。我在記憶體模組曾提到過,記憶體中提到的 buffer ,都跟塊裝置直接相關;而其他的都是 cache。
實際上,sk_buff、套接字緩衝、連線跟蹤等,都通過 slab 分配器來管理。你可以直接通過 /proc/slabinfo,來檢視它們占用的記憶體大小。
第二個問題,核心協議棧的執行,是按照乙個核心執行緒的方式嗎?在核心中,又是如何執行網路協議棧的呢?
說到網路收發,在中斷處理文章中我曾講過,其中的軟中斷處理,就有專門的核心執行緒ksoftirqd。每個 cpu 都會繫結乙個 ksoftirqd 核心執行緒,比如, 2 個 cpu 時,就會有
ksoftirqd/0 和 ksoftirqd/1 這兩個核心執行緒。
不過要注意,並非所有網路功能,都在軟中斷核心執行緒中處理。核心中還有很多其他機制(比如硬中斷、kworker、slab 等),這些機制一起協同工作,才能保證整個網路協議棧
的正常執行。
關於核心中網路協議棧的工作原理,以及如何動態跟蹤核心的執行流程,專欄後續還有專門的文章來講。如果對這部分感興趣,你可以先用我們提到過的 perf、systemtap、bcc-
tools 等,試著來分析一下。
我們知道,無論 tcp 還是 udp,埠號都只佔 16 位,也就說其最大值也只有 65535。是不是說,如果使用 tcp 協議,在單台機器、單個 ip 位址時,併發連線數最大也只有
那65535 呢?
對於這個問題,首先你要知道,linux 協議棧,通過五元組來標誌乙個連線(即協議,源ip、源埠、目的 ip、目的埠)。
明白了這一點,這個問題其實就有了思路。我們應該分客戶端和伺服器端,這兩種場景來分析。
對客戶端來說,每次發起 tcp 連線請求時,都需要分配乙個空閒的本地埠,去連線遠端的伺服器。由於這個本地埠是獨佔的,所以客戶端最多只能發起 65535 個連線。
對伺服器端來說,其通常監聽在固定埠上(比如 80 埠),等待客戶端的連線。根據五元組結構,我們知道,客戶端的 ip 和埠都是可變的。如果不考慮 ip 位址分類以及資
源限制,伺服器端的理論最大連線數,可以達到 2 的 48 次方(ip 為 32 位,埠號為 16位),遠大於 65535。
所以,綜合來看,客戶端最大支援 65535 個連線,而伺服器端可支援的連線數是海量的。當然,由於 linux 協議棧本身的效能,以及各種物理和軟體的資源限制等,這麼大的連線
數,還是遠遠達不到的(實際上,c10m 就已經很難了)。
在 如何優化 nat 效能 的最後, 我給你留了兩個思考題。
masquerade 是最常用的 snat 規則之一,通常用來為多個內網 ip 位址,提供共享的出口 ip。假設現在有一台 linux 伺服器,用了 masquerade 方式,為內網所有 ip 提供
出口訪問功能。那麼,
對於這兩個思考題,我來也、ninuxer 等同學,都給出了不錯的答案:
先看第一點,當多個內網 ip 位址的埠號相同時,masquerade 當然仍可以正常工作。不過,你肯定也聽說過,配置 masquerade 後,需要各個應用程式去手動配置修
改埠號。
實際上,masquerade 通過 conntrack 機制,記錄了每個連線的資訊。而在剛才第三個問題 中,我提到過,標誌乙個連線需要五元組,只要這五元組不是同時相同,網路連線就
可以正常進行。
再看第二點,在內網 ip 位址和連線數比較小時,這種方式的問題不大。但在 ip 位址或併發連線數特別大的情況下,就可能碰到各種各樣的資源限制。
比如,masquerade 既然把內部多個 ip ,轉換成了相同的外網 ip(即 snat),那麼,為了確保傳送出去的源埠不重複,原來網路包的源埠也可能會被重新分配。這樣
的話,轉換後的外網 ip 的埠號,就成了限制連線數的乙個重要因素。
除此之外,連線跟蹤、masquerade 機器的網路頻寬等,都是潛在的瓶頸,並且還存在單點的問題。這些情況,在我們實際使用中都需要特別注意。
LinuxIO效能優化實戰學習筆記
以下內容來自極客課程,如對您有幫助,詳細課程請見海報 1.檔案系統 為了方便管理,linux 檔案系統為每個檔案都分配兩個資料結構,索引節點 index node 和目錄項 directory entry 它們主要用來記錄檔案的元資訊和目錄結構。2.slab cache cached sreclai...
學習Linux效能優化實戰 1
程序排程 軟中斷測試工具 最近在極客時間上面發現了倪鵬飛老師的linux效能優化實戰,自己感覺講得很好,有興趣的朋友可以去極客時間上面訂閱。部落格是自己總結學習到的一些命令,記錄下來,以備後面使用。侵刪。uptime 用來看系統過去的 1 5 15 分鐘的平均負載。mpstat p all inte...
Linux效能優化實戰學習筆記 第三講
上下文切換是對任務當前執行狀態的暫存和恢復 當多個程序競爭cpu的時候,cpu為了保證每個程序能公平被排程執行,採取了處理任務時間分片的機制,輪流處理多個程序,由於cpu處理速度非常快,在人類的感官上認為是並行處理,實際是 偽 並行,同一時間只有乙個任務在執行處理。根據 tsuna 的測試報告,每次...