nat 基於 linux 核心的連線跟蹤機制,實現了 ip 位址及埠號重寫的功能,主要被用來解決公網 ip 位址短缺的問題。
在分析 nat 效能問題時,可以先從核心連線跟蹤模組 conntrack 角度來分析,比如用systemtap、perf、netstat等工具,以及 proc 檔案系統中的核心選項,來分析網路協議棧的行為;然後,通過核心選項調優、切換到無狀態 nat、使用 dpdk 等方式,進行實際優化。
網路問題比 cpu、記憶體或磁碟 i/o 都要複雜,無論是應用層的各種 i/o 模型,冗長的網路協議棧和眾多的核心選項,抑或是各種複雜的網路環境,都提高了網路的複雜性。
不過,也不要過分擔心,只要你掌握了 linux 網路的基本原理和常見網路協議的工作流程,再結合各個網路層的效能指標來分析,你會發現,定位網路瓶頸並不難。
找到網路效能瓶頸後,下一步要做的就是優化了,也就是如何降低網路延遲,並提高網路的吞吐量。
實際上,雖然網路效能優化的整體目標,是降低網路延遲(如 rtt)和提高吞吐量(如 bps 和 pps),但具體到不同應用中,每個指標的優化標準可能會不同,優先順序順序也大相徑庭。
就拿nat 閘道器來說,由於其直接影響整個資料中心的網路出入效能,所以 nat 閘道器通常需要達到或接近線性**,也就是說, pps 是最主要的效能目標。
再如,對於資料庫、快取等系統,快速完成網路收發,即低延遲,是主要的效能目標。
而對於我們經常訪問的 web 服務來說,則需要同時兼顧吞吐量和延遲。
所以,為了更客觀合理地評估優化效果,我們首先應該明確優化的標準,即要對系統和應用程式進行基準測試,得到網路協議棧各層的基準效能。
linux 網路協議棧
首先是網路介面層和網路層,它們主要負責網路包的封裝、定址、路由,以及傳送和接收。每秒可處理的網路包數 pps,就是它們最重要的效能指標(特別是在小包的情況下)。你可以用核心自帶的發包工具 pktgen ,來測試 pps 的效能。
再向上到傳輸層的 tcp 和 udp,它們主要負責網路傳輸。對它們而言,吞吐量(bps)、連線數以及延遲,就是最重要的效能指標。你可以用 iperf 或 netperf ,來測試傳輸層的效能。
不過要注意,網路包的大小,會直接影響這些指標的值。所以,通常,你需要測試一系列不同大小網路包的效能。
最後,再往上到了應用層,最需要關注的是吞吐量(bps)、每秒請求數以及延遲等指標。你可以用 wrk、ab 等工具,來測試應用程式的效能。
不過,這裡要注意的是,測試場景要盡量模擬生產環境,這樣的測試才更有價值。比如,你可以到生產環境中,錄製實際的請求情況,再到測試中回放。
總之,根據這些基準指標,再結合已經觀察到的效能瓶頸,我們就可以明確效能優化的目標。
網路效能優化
應用程式
應用程式,通常通過套接字介面進行網路操作。
由於網路收發通常比較耗時,所以應用程式的優化,主要就是對網路 i/o 和程序自身的工作模型的優化。
套接字套接字可以遮蔽掉 linux 核心中不同協議的差異,為應用程式提供統一的訪問介面。
每個套接字,都有乙個讀寫緩衝區。
傳輸層傳輸層最重要的是 tcp 和 udp 協議,所以這兒的優化,其實主要就是對這兩種協議的優化。
網路層鏈路層鏈路層負責網路包在物理網路中的傳輸,比如 mac 定址、錯誤偵測以及通過網絡卡傳輸網路幀等。
自然,鏈路層的優化,也是圍繞這些基本功能進行的。
接下來,我們從不同的幾個方面分別來看:
在優化網路的效能時,我們可以結合 linux 系統的網路協議棧和網路收發流程,從應用程式、套接字、傳輸層、網路層再到鏈路層等,對每個層次進行逐層優化。
實際上,我們分析和定位網路瓶頸,也是基於這些網路層進行的。而定位出網路效能瓶頸後,我們就可以根據瓶頸所在的協議層,進行優化。具體而言:
php效能優化的幾個方法
找到瓶頸 finding the bottleneck 快取 caching 編譯 vs.解釋 compiling vs.interpreting content reduction 多執行緒與多程序 multithreading multiprocessing 字串 strings 正規表示式 r...
Android 的幾個效能優化
1記憶體優化 使用的分析工具 memory monitor 工具 android studio自帶 1.集合類洩漏 如果乙個集合是全域性性變數 比如類中的靜態變數或全域性性map即有靜態引用又或者final指向它 只有新增元素的方法,而沒有清除的機制,就會一直占用記憶體,造成記憶體洩漏。3.非靜態內...
前端效能優化的幾個方法
為什麼要做前端效能優化?在構建web站點的過程中,任何乙個細節都有可能影響 的訪問速度,如果不了解前端效能優化的知識,很多不利於 的因素會累加,從而嚴重影響 的效能,導致 訪問速度變慢,使用者體驗低下,最終導致使用者流失。前端效能優化的方式 1.封裝元件 把所有需要復用的功能或網頁模板封裝成元件,在...