1. 程式人生 > >《Linux 效能及調優指南》1.5 網路子系統

《Linux 效能及調優指南》1.5 網路子系統

翻譯:飛哥 ( http://hi.baidu.com/imlidapeng)

版權所有,尊重他人勞動成果,轉載時請註明作者和原始出處及本宣告。

原文名稱:《Linux Performance and Tuning Guidelines》

原文地址:http://www.redbooks.ibm.com/abstracts/redp4285.html

-------------------------------------------------------------------------------------------

1.5.1 網路實現
1.5.2 TCP/IP
1.5.3 減負
1.5.4 繫結

-------------------------------------------------------------------------------------------


​網路子系統是效能方面另一個重要的子系統。
​網路除了Linux以外還會與其它很多裝置互動,如交換機、路由器、閘道器、PC客戶端等等。
​儘管這些裝置已超出Linux的控制範圍,但它們仍會對系統整體效能產生影響。不要忘記我們現在工作生活在一個網路時代。

在此我們將主要關注Linux是怎樣處理網路操作的。


​1.5.1 網路的實現

TCP/IP協議有著與OSI模型相似的層次結構。Linux網路實現使用了類似的方法。

​圖1-23展示了Linux TCP/IP堆疊的層次結構和TCP/IP通訊的概覽。


圖1-23 網路層次結構和網路執行概覽

像許多UNIX系統一樣Linux的TCP/IP網路使用套接字介面。
​套接字為使用者應用程式提供使用介面。

​讓我們將一起來了解一下網路傳輸時必要的操作步驟。

1. 當要傳送資料到對方主機時,應用程式建立所要傳送的資料。

2. 應用程式開啟套接字並向套接字寫入資料。

3. 使用套接字緩衝【socket buffer】介面來處理需要傳輸的資料。套接字緩衝擁有資料的引用並通過所有層將其向下傳遞。

4. 在每一層裡,都會執行相應的操作如解析資料包頭、新增修改資料包頭、檢查大小、路由操作、分片等。
​    當套接字緩衝通過這些層向下傳遞時,其資料本身不會被複制到每個層,因為將實際的資料複製到每個層是很沒有效率的,
​    核心通過及時更改套接字緩衝的引用並傳遞到下一層來節省沒有必要的開銷。

5. 最後資料通過網絡卡傳輸到線路中。

6. 乙太網幀到達對方主機的網路介面。

7. 如果與網絡卡的MAC吻合,幀會被轉到網絡卡的緩衝。

8. 網絡卡最後會將資料包移到套接字緩衝並向CPU發出一個硬終端。

9. 然後CPU處理資料包並通過所有層向上傳遞直到其到達應用程式(如Apache)的埠。

套接字緩衝

正如前面所述,核心使用緩衝來發送和接受資料。
​圖1-24展示了網路中所用的緩衝。它們可以通過/proc/sys/net下的檔案來調整。

/proc/sys/net/core/rmem_max
/proc/sys/net/core/rmem_default
/proc/sys/net/core/wmem_max
/proc/sys/net/core/wmem_default
/proc/sys/net/ipv4/tcp_mem
/proc/sys/net/ipv4/tcp_rmem
/proc/sys/net/ipv4/tcp_wmem

有時它可以影響網路效能。我們將在4.7.4“增加網路緩衝”中詳細介紹。


圖1-24 套接字緩衝的記憶體分配

網路API(NAPI)

在新的網路API中網路子系統發生了一些變化。Linux中網路堆疊的標準實現更加關注可靠性和低延時而不是低開銷和高吞吐量。
​當建立防火牆時這些特點適合的,但大多數企業應用如檔案列印或資料庫的執行速度要比相似情況下windows要慢。

如圖1-25中藍色箭頭所描述的,在傳統處理網路資料包的方法中,網絡卡最後將資料包轉移至作業系統核心的網路緩衝中並向CPU發出一個硬中斷。

雖然這只是簡單描述了處理網路資料包的過程,但其反應了這種方法的弊病。
​每次匹配MAC地址的乙太網幀到網路介面時,都會產生一個硬中斷。無論何時也不管CPU在做什麼都不得不要停止下來處理這個硬中斷,
​這會導致一個上下文交換並要清空相應的處理器快取。
​如果只有很少的資料包到達介面,你可能認為這並不是問題,但在千兆網和現代的應用程式每秒鐘可以建立數千個數據包的情況下,這會導致大量中斷和上下文交換的發生。


圖1-25 Linux網路堆疊

因此為減少處理網路通訊的開銷,NAPI被採用。
​當第一個資料包到來時,NAPI像傳統方式一樣發出一箇中斷。
​但此後,網路介面進入輪詢模式【Polling Mode】。
​即使在網路介面的DMA環緩衝中有資料包,也不會產生新的中斷,這可以有效減少上下文交換和相應的開銷。
​直到最後一個數據包被處理完並且環緩衝為空時,網絡卡重新恢復到中斷模式【Interrupt Mode】。
​NAPI另外的好處就是其建立的軟中斷可以由多個處理器處理從而提升多處理器的擴充套件性。
​NAPI為大多數企業級多處理器系統帶來明顯改善,但它需要支援NAPI的驅動。正如我們在本文調優章節中所闡明的,這裡有著很大的調優空間。


​Netfilter

作為核心的一部分Linux有著先進的防火牆功能。這個功能由Netfilter模組實現。
​你可以使用iptables工具來調整和配置Netfilter。


​一般而言,Netfilter提供以下功能。

▶ 包過濾:當資料包符合某個規則時,Netfilter接受或拒絕此資料包,或者根據拒絕規則執行一個特定動作。

▶ 地址轉換:當資料包符合某個規則時,Netfilter將變更此資料包來符合地址轉換的要求。


​匹配過濾可以定義以下屬性。

▶ 網路介面

▶ IP地址、IP地址範圍、子網

▶ 協議

▶ ICMP型別

▶ 埠

▶ TCP標誌

▶ 狀態(參見“連線追蹤”)

圖1-26顯示資料包是怎樣通過Netfilter鏈的,
​Nefilter鏈是指依次應用在每個節點上的一組已定義規則。


圖1-26 Netfilter中資料包的流向


​如果資料包與規則匹配Netfilter會執行相應的動作,這個動作被叫做target,可能的target有:

ACCEPT:接受資料包並讓其通過

DROP:默默地將資料包丟棄

REJECT:丟棄資料包,向傳送端回傳資料包如ICMP埠不能到達。重置源主機TCP。

LOG:記錄匹配的資料包。

MASQUERADE,SNAT,DNAT,REDIRECT:地址轉換。


​連線追蹤

為獲得更精緻的防火牆功能,Netfilter使用連線追蹤機制記錄所有網路通訊的狀態。
​使用TCP連線狀態(參考“建立連線”)和其他網路屬性(如IP地址、埠、協議、序列號、ack number、ICMP型別等),

​Netfilter將包分為下面四種狀態。

NEW:試圖建立新連線的包

ESTABLISHED:通過連線的包

RELATED:與前面的包相關的包

INVALID:由於損壞或無效而未知狀態的包

另外,Netfilter能使用單獨的模組分析協議的特定屬性和操作來獲得更為詳細的連線追蹤。
​例如用於FTP、NetBIOS、TFTP、IRC等的連線追蹤模組。


​1.5.2 TCP/IP

TCP/IP作為預設的網路協議已經有很多年了。Linux的TCP/IP實現與標準完全相容。
​為了更好的效能調優,你應該熟悉基本的TCP/IP網路。

要了解詳細內容,參見《TCP/IP Tutorial and Technical Overview》,GG24-3376


​連線的建立

在應用資料傳輸前,需要在客戶端和伺服器端建立連線。連線建立的過程叫做TCP/IP三次握手。

​圖1-27展示了連線建立到結束的過程。

1. 客戶端傳送一個SYN包(設定SYN標誌的包)給對方主機請求連線。

2. 伺服器端接收到包併發送一個SYN+ACK包。

3. 然後客戶端傳送一個ACK包到對方完成連線的建立。

一旦連線建立,應用程式的資料就可以通過連線傳輸。當所有的資料傳輸完成,連線結束流程開始。

1. 客戶端傳送一個FIN包給伺服器段,開始連線結束流程。

2. 伺服器端傳送FIN的確認,如果沒有資料需要傳給客戶端,傳送FIN包到客戶端。

3. 客戶端傳送ACK包到伺服器端結束連線。


圖1-27 TCP三次握手


​在此會話過程中,連線狀態會發生改變。
​圖1-28展示了TCP/IP連線的狀態圖。


圖1-28 TCP連線的狀態圖


​你可以使用netstat命令瞭解每個TCP/IP會話的連線狀態。
​更多內容請看2.3.11“netstat”。


​流量控制【Traffic control】

TCP/IP實現中有一種機制來保證資料的有效傳輸和確保即使在網路傳輸質量很差又擁堵時包也可以順利傳遞。

TCP/IP傳輸視窗

在Linux作業系統效能中傳輸視窗策略是TCP/IP實現的重要方面。
​基本上,TCP傳輸視窗就是在對方請求確認前指定主機能傳送和接收資料的最大數量。
​視窗大小由接收主機通過TCP資料包頭中視窗大小欄位提供給傳送主機。
​使用傳輸視窗,主機可以更有效地傳送包,因為傳送主機沒有必要等待每個傳送包的確認。
​它提高網路利用率。也會提升延遲確認效率。
​TCP視窗開始時很小,隨著來自對方的每此成功確認慢慢增長。
​想要優化視窗大小,見4.7.4“增加網路緩衝”。


圖1-29滑動視窗和延遲確認

作為一個選項,高速網路使用一個名叫視窗縮放【Windows Scaling】的技術來增加最大傳輸視窗大小。
​我們將在“TCP選項調優”分析這些實現的影響。


​重傳【Retransmission】

在連線建立、結束和資料傳輸過程中,由於一些原因(網絡卡故障、路由緩慢、網路堵塞、buggy network implementation等)會發生多次超時和資料重傳。
​為解決這種狀況TCP/IP將包放入佇列並嘗試多次傳送包。

你可以通過配置引數來改變某些核心行為。你可能想當網路丟包率高時增加嘗試TCP SYN連線建立包的數量。
​你也可以通過/proc/sys/net下的檔案改變某些超時臨界值。更多資訊,請看“調優TCP行為”。


​1.5.3 減負【offload】

如果你係統中的網路介面卡支援硬體減負功能,核心可以將其部分任務轉移到介面卡上執行,這樣可以減少CPU的使用。

▶ 校驗和減負

執行IP/TCP/UDP校驗和,通過比較協議頭中校驗和欄位的值和計算包資料的值來為確保包被正確的傳輸。


​▶ TCP分段減負(TSO)

當資料大小超過目標網路介面卡的最大傳輸單元(MTU)時,資料被分割成MTU大小的包,這個動作由介面卡代表核心來完成。

關於更多的網路進階特性,參見“Tuning IBM System x Servers for Performance”和10.3 網路進階特性。


​1.5.4 繫結模組

Linux核心通過使用繫結【bonding】驅動程式提供將網路介面整合在一起的功能。這是裝置獨立的繫結驅動。(
​也有裝置特定的驅動)繫結驅動支援802.3連線的整合規範和一些原始的負載平衡和容錯實現。
​它可以獲得更高等級的可用性和效能的提升。請參見核心相關文件Documention/networking/bonding.txt