Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
8.2. 優化網路設定
效能微調一般是以先佔的方式來進行的。通常,我們會在執行一項應用程式或是建置一部系統之前,調整已知的變數。若這項調整沒有任何效應,我們便嘗試其它變數。此構思的邏輯是:「就預設值」來說,系統並非以優化的狀態在運作;也因此,我們「認為」我們需要相應地調整系統。在某些情況下,我們可透過導出計算猜測來進行調整。
如先前所提到的,網路堆疊通常會自行優化。此外,若要有效微調網路,您必須擁有詳細的理解,不僅是網路堆疊如何運作,還必須知道特定系統的網路資源需求。錯誤的網路效能配置反而會影響並降低效能。
比方說,請考量 「bufferfloat 問題」。增加緩衝區佇列的深度,可能會造成 TCP 連線擁有比連結所允許還要大的壅塞視窗(因為過深的緩衝行為)。然而,這些連線也擁有極大的 RTT 值,因為 frame 花上了太多時間在佇列中。因為無法偵測壅塞,這反而無法帶來優化的效能。
有關於網路效能,「除非」發生了明顯的效能問題,否則建議您保留預設設定。此問題包含了 frame 遺失、傳輸量明顯降低等等。儘管如此,最佳的解決方式通常是擴充性問題進行精密檢查而衍生出的解決方法,而非僅是將設定往上微調(增加緩衝區/佇列長度、降低插斷延遲等等)。
若要正確診斷網路效能問題,請使用下列工具:
- netstat
- 會印出網路連線、路由表、介面卡數據、偽裝連線和 multicast 成員的命令列工具程式。它會由
/proc/net/
檔案系統截取有關於網路子系統的資訊。這些檔案包含了:/proc/net/dev
(裝置資訊)/proc/net/tcp
(TCP socket 資訊)/proc/net/unix
(Unix 區域 socket 資訊)
欲取得更多有關於netstat
及其位於/proc/net/
的參照檔案的相關資訊,請參閱netstat
的 man page,指令為:man netstat
。 - dropwatch
- 這是個用來監控 kernel 所捨棄的封包的監控工具程式。欲取得更多資訊,請參閱
dropwatch
的 man page,指令為:man dropwatch
。 - ip
- 這是個用來管理和監控路由、裝置、政策路由以及通道的工具程式。欲取得更多資訊,請參閱
ip
的 man page,指令為:man ip
。 - ethtool
- 這是個用來顯示和更改 NIC 設定的工具程式。欲取得更多資訊,請參閱
ethtool
的 man page,指令為:man ethtool
。 - /proc/net/snmp
- 這是個顯示了
snmp
代理程式管理 IP、ICMP、TCP 和 UDP 所需要的 ASCII 資料。它亦可顯示即時的 UDP-lite 數據。
《SystemTap 初學者指南》包含了數個範例 script,您可使用它們來設定監控網路效能。網址為 https://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/?locale=zh-TW。
在搜集了有關於網路效能問題的資料後,您便應該能夠制訂一套理論 — 以及相應的解決方法。[5]比方說,在
/proc/net/snmp
中的 UDP 輸入錯誤若增加的話,即代表當網路堆疊嘗試將新的 frame 排入一個應用程式的 socket 時,一個或更多個 socket 接收佇列已滿。
這代表封包至少在一個 socket 佇列上發生了問題,即代表 socket 佇列排出封包的速度太慢,或是封包量對於該 socket 佇列來說太大。若是後者的話,請查看所有網路使用量較大的應用程式使用記錄中,是否有遺失的資料 -- 若要解決此問題,您需要優化或是重新配置該應用程式。
8.2.1. Socket 接收緩衝區大小
Socket 的傳送和接收大小皆是以動態的方式進行調整的,因此您很少需要手動式編輯。若進階分析(例如 SystemTap 網路範例中所使用的分析
sk_stream_wait_memory.stp
)顯示 socket 佇列的排出率過慢,您可嘗試增加應用程式的 socket 佇列的深度。若要這麼做,請藉由配置下列其中一個值,以增加 socket 所使用的接收緩衝區大小:
- rmem_default
- 這是個用來控制 socket 所使用的接收緩衝區「預設」大小的 kernel 參數。若要進行相關配置,請執行下列指令:
sysctl -w net.core.rmem_default=N
請將N
取代為您希望使用的緩衝區大小(位元組)。欲判定此 kernel 參數的值,請參閱/proc/sys/net/core/rmem_default
。請注意,rmem_default
的值不該超過rmem_max
(/proc/sys/net/core/rmem_max
);若需要超過這個值,請增加rmem_max
的值。 - SO_RCVBUF
- 這是個用來控制 socket 的接收緩衝區「最大」大小的 socket 選項(位元組)。欲取得更多有關於
SO_RCVBUF
的相關資訊,請用以下指令參閱 man page:man 7 socket
。若要配置SO_RCVBUF
,請使用setsockopt
工具程式。您可透過getsockopt
截取目前的SO_RCVBUF
值。欲取得更多有關於使用這兩個工具程式的相關資訊,請參閱setsockopt
的 man page,指令為:man setsockopt
。