(5)Linux性能調優之網絡子系統

1、前言

前面咱們談了的內容以下:數據庫

(1)Linux性能調優之Linux進程管理windows

(2)Linux性能調優之Linux內存體系緩存

(3)Linux性能調優之Linux文件系統性能優化

(4)Linux性能調優之磁盤I/O子系統bash

這一節咱們將談下Linux的網絡子系統服務器

2、概覽

網絡子系統是另外一個影響性能的重要子系統!網絡操做相關的組件有不少,例如交換機、路 由器、網關、PC等等。儘管這些組件不受到Linux系統的控制,可是,他們對系統的總體性能 有很大影響。網絡

如今,讓咱們主要集中注意力看看Linux是如何處理網絡操做的。socket

3、網絡實現

TCP/IP協議和OSI模型有相似的層級結構。Linux內核的網絡實現採用了類似的辦法。下圖展 示了Linux的TCP/IP棧的層級和TCP/IP通訊概覽:tcp

和不少Unix操做系統同樣,Linux爲TCP/IP網絡操做提供套接字(Socket)接口。套接字爲用 戶應用程序提供接口。下面咱們看看在網絡數據傳遞過程當中,基本的數據處理順序:post

  1. 當應用程序要把數據發送給其它主機,應用程序首先建立數據。
  2. 應用程序打開套接字,經過套接字接口寫入數據。
  3. 套接字緩衝(socket buffer)是用來處理傳輸數據的。套接字緩衝中有數據的參考,數據 穿過該層,向下傳遞。
  4. 在每一層,都要作相應的修改,例如修改頭部、添加修改包頭、校驗值、路由、分片等 等。當套接字緩衝向下層傳遞,數據自己不在層之間複製。由於在各層之間複製數據的 效率過低,內核只修改套接字緩衝中的參考而且向下層傳遞,避免沒必要要的損耗。
  5. 最後,數據經過網卡進入網線。
  6. 以太幀(Ethernet frame)到達對方的網絡接口。
  7. 若是MAC地址和網卡MAC地址匹配的話,分片就接收到網卡緩衝中。
  8. 網卡把數據包移動到套接字緩衝中,觸發一次CPU的硬中斷。
  9. 而後CPU處理這個數據包,把他一層層向上傳遞,直到抵達一個應用程序(例如進程的 TCP端口),好比Apache。

3.1 套接字緩衝(Socket buffer)

正如前文所說,內核使用緩衝來發送和接收數據。下圖展現了網絡緩存的配置項。能夠 用/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
複製代碼

下圖展現了這些參數:

3.2 網絡API(Network API,NAPI)

新的網絡子系統API發生了一些變化。Linux網絡棧的標準實現更關注可靠性和低延時,而不是低負載和高吞吐。這個特徵雖然有利於建立防火牆,可是大多數企業應用,例如文件、打印和數據庫都會比相同狀況下的windows慢一些。

在一個典型的網絡包處理中,以下圖藍色箭頭所描繪的,網卡把數據包移動到操做系統內核 的網絡緩衝,而且觸發一個CPU的硬中斷。

這只是是進程處理網絡包的一個簡單視圖,可是顯示出了這種方法的一個不足。每次當一個 MAC地址匹配的以太網幀到達接口,都會引發一次硬中斷。不管如何,CPU必須停下正在處 理的進程,而後處理這個硬中斷,引起一次上下文切換和刷新處理器緩存。你可能以爲,若是隻有不多的數據包,那這就不是什麼大問題。可是,GB級別的以太網卡和現代的應用程序 一秒鐘能產生數千個包,致使數量龐大的中斷和上下文切換。

所以,Linux引入NAPI來對抗處理網絡流量引起的相關開銷。對於第一個包,NAPI就和傳統 的實現同樣,觸發一次中斷。可是第一個包以後的包,接口進入了polling模式。只要還有數據 包在網卡DMA 的環狀緩衝(ring buffer)中,就不會引起新的中斷,從而高效的減小了上下文 切換和相關的消耗。在最後的包被處理,環狀緩存被清空以後,網卡又回到了中斷模式。 NAPI的的另外一個好處是經過生成能被多處理器支持的軟中斷,加強了多處理器的擴展。NAPI 對大多數企業級種的多處理器操做系統都是巨大的改進,須要NAPI支持的驅動。還有極大的 調優空間等着咱們在後面探索。

3.3 Netfilter

Linux已經把防火牆做爲內核的一部分。這一功能由Netfilter模塊提供。你可使用iptables命 令來管理和配置Netfilter。

通常來講,Netfilter提供了以下的幾個功能。

  • 數據包過濾:若是數據包匹配到一條規則,Netfilter將會接收、拒絕或者根據其它預約的 操做來處理這個數據包。
  • 地址翻譯:若是數據包匹配到一條規則,Netfilter會根據地址翻譯的需求修改這個數據 包。

匹配過濾器能夠定義以下的屬性。

  • 網絡接口(Network Interface) IP地址,IP地址範圍,子網(IP address,IP address range,subnet)
  • 協議(Protocol)
  • ICMP類型(ICMP Type)
  • 端口(Port)
  • TCP標誌(TCP flag)
  • 狀態(state)

下圖展現了數據包如何在Netfilter鏈中傳遞,以及順序中每個點定義的可用規則。

若是匹配到規則,Netfilter將會採起相應的操做,這個操做被叫作目標(target),下面是一 些可用的target。

  • ACCEPT:接受包,而且放行。
  • DROP:丟棄包
  • REJECT:丟棄包,而且回覆一個消息,例如ICMP端口不可達、TCP重置源主機。
  • LOG:記錄匹配的包
  • MASQUERADE, SNAT, DNAT, REDIRECT:地址翻譯(NAT)

3.4 鏈接追蹤(Connection tracking)

爲了知足更多的防火牆功能,Netfilter使用鏈接追蹤機制,跟蹤全部網絡流量的狀態。經過 TCP鏈接狀態和其它網絡屬性(IP地址,端口,協議,序列號,ack,ICMP類型,等), Netfilter把每個包分類到下面四個狀態。

  • NEW:嘗試創建新鏈接的包
  • ESTABLISHED:已創建鏈接的包
  • RELATED:和前面的包相關的包
  • INVALID:由於異常或者非法的不知狀態的包

做爲補充,Netfilter可使用其它模塊,經過分析協議特定屬性和操做進行更詳細的鏈接跟 蹤。例如,有FTP、NetBIOS、TFTP、IRC的鏈接跟蹤模塊。

4、TCP/IP

TCP/IP一直是默認的網絡協議。Linux上的TCP/IP實現是十分契合TCP/IP標準的。爲了更好 的性能優化,應該熟悉基本的TCP/IP網絡。

4.1 鏈接創建

在應用數據傳輸以前,服務器和客戶端就應該創建起鏈接,鏈接創建的過程叫作TCP/IP三次 握手。下圖展現了基本的鏈接創建和中斷過程。

  1. 客戶端發送SYN包(帶有SYN標誌設置的包)到服務器,請求鏈接
  2. 服務器收到SYN請求包,回覆一個SYN+ACK的包
  3. 而後客戶端發送ACK包給服務器完成鏈接創建。

在回話期間,鏈接狀態會發生改變。下圖展現了TCP/IP鏈接狀態圖:

一旦創建起鏈接,應用數據就能夠經過這個鏈接來傳送,在全部的數據傳輸完成以後,鏈接關閉。下面是四次揮手的簡單過程:

  1. 客戶端發送FIN包給服務器,開始終止鏈接的過程。
  2. 服務器回覆一個ACK的確認包回去,若是再沒有數據要發送給客戶端,服務器而後發送 一個FIN包給客戶端。
  3. 客戶端發送一個ACK包給服務器,完成鏈接終止。

4.2 流量控制(Traffic control)

TCP/IP有一種機制,確保即便在擁擠時段和網絡傳輸質量惡劣的狀況下,高效數據傳輸!這種機制就是TCP/IP滑動窗口(TCP/IP transfer window)

滑動窗口是Linux操做系統上TCP/IP實現的重要組成。基本上,TCP滑動窗口就是在發送數據 以前,一臺機器和對方機器確認能發送和接收的最大數據量的機制。窗口大小放在TCP頭的 滑動窗口字段中,由接受端傳遞給發送端。使用滑動窗口可使數據傳遞更加高效,由於發 送主機沒必要等待每個數據包的確認。這使得網絡更加有效利用,也提升了延遲確認效率。 在鏈接中,TCP窗口從很小開始,隨着收到每個對端的確認而慢慢增加。下面是圖示:

5、下一節是???

談完Linux的網絡子系統,理論知識梳理完了,下一節將會談談:理解Linux性能指標

相關文章
相關標籤/搜索