42 | 案例篇:如何优化 NAT 性能?(下)
生活随笔
收集整理的這篇文章主要介紹了
42 | 案例篇:如何优化 NAT 性能?(下)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一節,我們學習了 NAT 的原理,明白了如何在 Linux 中管理 NAT 規則。先來簡單復習一下。 NAT 技術能夠重寫 IP 數據包的源 IP 或目的 IP,所以普遍用來解決公網 IP 地址短缺的問題。它可以讓網絡中的多臺主機,通過共享同一個公網 IP 地址,來訪問外網資源。同時,由于 NAT 屏蔽了內網網絡,也為局域網中機器起到安全隔離的作用。 Linux 中的 NAT ,基于內核的連接跟蹤模塊實現。所以,它維護每個連接狀態的同時,也對網絡性能有一定影響。那么,碰到 NAT 性能問題時,我們又該怎么辦呢? 接下來,我就通過一個案例,帶你學習 NAT 性能問題的分析思路。
案例準備
下面的案例仍然基于 Ubuntu 18.04,同樣適用于其他的 Linux 系統。我使用的案例環境是這樣的: 機器配置:2 CPU,8GB 內存。 預先安裝 docker、tcpdump、curl、ab、SystemTap 等工具,比如 # Ubuntu apt-get install -y docker.io tcpdump curl apache2-utils# CentOS curl -fsSL https://get.docker.com | sh yum install -y tcpdump curl httpd-tools 大部分工具,你應該都比較熟悉,這里我簡單介紹一下 SystemTap 。SystemTap?
SystemTap 是 Linux 的一種動態追蹤框架,它把用戶提供的腳本,轉換為內核模塊來執行,用來監測和跟蹤內核的行為。關于它的原理,你暫時不用深究,后面的內容還會介紹到。這里你只要知道怎么安裝就可以了: # Ubuntu apt-get install -y systemtap-runtime systemtap # Configure ddebs source echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \ sudo tee -a /etc/apt/sources.list.d/ddebs.list # Install dbgsym apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622 apt-get update apt install ubuntu-dbgsym-keyring stap-prep apt-get install linux-image-`uname -r`-dbgsym# CentOS yum install systemtap kernel-devel yum-utils kernel stab-prep 本次案例還是我們最常見的 Nginx,并且會用 ab 作為它的客戶端,進行壓力測試。案例中總共用到兩臺虛擬機,我畫了一張圖來表示它們的關系。 接下來,我們打開兩個終端,分別 SSH 登錄到兩臺機器上(以下步驟,假設終端編號與圖示 VM 編號一致),并安裝上面提到的這些工具。注意,curl 和 ab 只需要在客戶端 VM(即 VM2)中安裝。 同以前的案例一樣,下面的所有命令都默認以 root 用戶運行。如果你是用普通用戶身份登陸系統,請運行 sudo su root 命令,切換到 root 用戶。 如果安裝過程中有什么問題,同樣鼓勵你先自己搜索解決,解決不了的,可以在留言區向我提問。如果你以前已經安裝過了,就可以忽略這一點了。 接下來,我們就進入到案例環節。案例分析
為了對比 NAT 帶來的性能問題,我們首先運行一個不用 NAT 的 Nginx 服務,并用 ab 測試它的性能。 在終端一中,執行下面的命令,啟動 Nginx,注意選項 --network=host ,表示容器使用 Host 網絡模式,即不使用 NAT: docker run --name nginx-hostnet --privileged --network=host -itd feisky/nginx:80 然后到終端二中,執行 curl 命令,確認 Nginx 正常啟動: curl http://192.168.0.30/ ... <p><em>Thank you for using nginx.</em></p> </body> </html> 繼續在終端二中,執行 ab 命令,對 Nginx 進行壓力測試。不過在測試前要注意,Linux 默認允許打開的文件描述數比較小,比如在我的機器中,這個值只有 1024: # open files ulimit -n 1024 所以,執行 ab 前,先要把這個選項調大,比如調成 65536: # 臨時增大當前會話的最大文件描述符數 ulimit -n 65536 接下來,再去執行 ab 命令,進行壓力測試: # -c 表示并發請求數為 5000,-n 表示總的請求數為 10 萬 # -r 表示套接字接收錯誤時仍然繼續執行,-s 表示設置每個請求的超時時間為 2s ab -c 5000 -n 100000 -r -s 2 http://192.168.0.30/ ... Requests per second: 6576.21 [#/sec] (mean) Time per request: 760.317 [ms] (mean) Time per request: 0.152 [ms] (mean, across all concurrent requests) Transfer rate: 5390.19 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median max Connect: 0 177 714.3 9 7338 Processing: 0 27 39.8 19 961 Waiting: 0 23 39.5 16 951 Total: 1 204 716.3 28 7349 ... 關于 ab 輸出界面的含義,我已經在 怎么評估系統的網絡性能 文章中介紹過,忘了的話自己先去復習。從這次的界面,你可以看出:- 每秒請求數(Requests per second)為 6576;
- 每個請求的平均延遲(Time per request)為 760ms;
- 建立連接的平均延遲(Connect)為 177ms。
- 每秒請求數(Requests per second)為 76;
- 每個請求的延遲(Time per request)為 65s;
- 建立連接的延遲(Connect)為 1300ms。
- 第一,利用 Netfilter 中的鉤子函數(Hook),修改源地址或者目的地址。
- 第二,利用連接跟蹤模塊 conntrack ,關聯同一個連接的請求和響應。
- 第一,接收網絡包時,在連接跟蹤表中查找連接,并為新的連接分配跟蹤對象(Bucket)。
- 第二,在 Linux 網橋中轉發包。這是因為案例 Nginx 是一個 Docker 容器,而容器的網絡通過網橋來實現;
- 第三,接收網絡包時,執行 DNAT,即把 8080 端口收到的包轉發給容器。
- net.netfilter.nf_conntrack_count,表示當前連接跟蹤數;
- net.netfilter.nf_conntrack_max,表示最大連接跟蹤數;
- net.netfilter.nf_conntrack_buckets,表示連接跟蹤表的大小。
- 每秒請求數(Requests per second)為 6315(不用 NAT 時為 6576);
- 每個請求的延遲(Time per request)為 791ms(不用 NAT 時為 760ms);
- 建立連接的延遲(Connect)為 355ms(不用 NAT 時為 177ms)。
小結
今天,我帶你一起學習了,如何排查和優化 NAT 帶來的性能問題。 由于 NAT 基于 Linux 內核的連接跟蹤機制來實現。所以,在分析 NAT 性能問題時,我們可以先從 conntrack 角度來分析,比如用 systemtap、perf 等,分析內核中 conntrack 的行文;然后,通過調整 netfilter 內核選項的參數,來進行優化。 其實,Linux 這種通過連接跟蹤機制實現的 NAT,也常被稱為有狀態的 NAT,而維護狀態,也帶來了很高的性能成本。 所以,除了調整內核行為外,在不需要狀態跟蹤的場景下(比如只需要按預定的 IP 和端口進行映射,而不需要動態映射),我們也可以使用無狀態的 NAT (比如用 tc 或基于 DPDK 開發),來進一步提升性能。 思考 最后,給你留一個思考題。你有沒有碰到過 NAT 帶來的性能問題?你是怎么定位和分析它的根源的?最后,又是通過什么方法來優化解決的?你可以結合今天的案例,總結自己的思路。總結
以上是生活随笔為你收集整理的42 | 案例篇:如何优化 NAT 性能?(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 41 | 案例篇:如何优化 NAT 性能
- 下一篇: 43 | 套路篇:网络性能优化的几个思路