TCP內核參數與Nginx配置的簡單測試

背景

昨天晚上整理了下幾個TCP內核的參數.
學習到了一點內核參數的影響.
但是因爲時間比較晚了沒有繼續鑽研與nginx的關係
今天想着繼續研究一下TCP的部分參數與nginx的關係 
每個系統都不一樣. 結果可能跟內核版本和內核參數強相關.
我這裏用的是基於ARM的銀河麒麟
還有基於x86的OpenEuler
內核版本都比較高

測試機器信息

1. 域名站點
aarch64  
銀河麒麟V10SP3
8c 64g
內核: 4.19.90-52.15.v2207.ky10.aarch64

2. 微服務方向代理節點
x86_64
OpenEuler 2203 LTS
16c 96g
內核: 5.10.0-60.18.0.50.oe2203.x86_64

測試點

1. keepalive對域名和應用服務器的影響.
2. 內核參數 ip_local_port_range 對nginx的response code 的影響

Nginx的keepalive的設置

Nginx最常用的是兩種模式:
1. Nginx作爲web服務器進行使用
   是一個純粹的Server服務.只需要關注他與客戶端的連接就可以了. 
2. Nginx作爲反向代理的實現
   此時Nginx不僅是一個Server服務, 對於upstream的服務器還是
   一個client. 
基於如上兩個配置:
Nginx的keepalive 的設置也分爲兩個地方
一個是http時的keepalive設置
另外一個是 upstream 上面的keepalive的設置

Nginx的測試

http的keepalive的設置效果
Nginx的http配置節下面可以使用如下命令進行設置
keepalive_timeout 0;
單位是秒鐘, 設置爲0 表示禁用長連接. 

進行測試:
注意每次測試都至少間隔 1min 保證上一次測試的 time_wait 都進行了釋放. 
先禁用爲0 
打開 界面:https://10.110.136.50/
查看TCP鏈接的情況:
[root@KylinV10SP3ARM64 nginx]#  netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22  |grep 10.110.81.124
tcp        0      0 10.110.136.50:443       10.110.81.124:57491     TIME_WAIT   -                    timewait (57.65/0/0)
tcp        0      0 10.110.136.50:443       10.110.81.124:57492     TIME_WAIT   -                    timewait (57.45/0/0)
# 發現只有兩個 time_wait的連接
打開登錄界面: https://10.110.136.50/login.html
# 至少會有 20個time_wait的連接. 
# 如果是刷新 產生20個time_wait的連接, 如果是全新打開, 產生73個time_wait的連接. 
# 數量太多就不在一一展示了. 


Nginx的測試

修改爲: keepalive_timeout 10;
然後再次進行測試
注意需要重啓nginx 不要使用 -s reload的模式. 

發現打開登錄:https://10.110.136.50/ 還有 https://10.110.136.50/login.html
都是兩個 established 的連接. 

但是很快就變成了FIN_WAIT 然後TCP連接很快就消失了.
而且明顯感覺 10秒鐘最後就已經全部沒有了. 
[root@KylinV10SP3ARM64 nginx]#  netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22  |grep 10.110.81.124  
tcp        0      0 10.110.136.50:443       10.110.81.124:59809     ESTABLISHED 2532685/nginx: work  off (0.00/0/0)
tcp        0      0 10.110.136.50:443       10.110.81.124:59810     ESTABLISHED 2532685/nginx: work  off (0.00/0/0)
[root@KylinV10SP3ARM64 nginx]#  netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22  |grep 10.110.81.124  
tcp        0      0 10.110.136.50:443       10.110.81.124:59809     FIN_WAIT2   -                    timewait (39.81/0/0)
tcp        0      0 10.110.136.50:443       10.110.81.124:59810     FIN_WAIT2   -                    timewait (39.59/0/0)

Upstream 的 keepalive 的測試

Upstream 不設置 keepalive的測試
域名層的nginx 會沒次刷新多一個 TIME_WAIT的連接. 
[root@CentOS7MINI nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep -v 127.0.0.1 |grep 10.110.139.230
tcp        0      0 10.110.139.181:65176    10.110.139.230:5200     TIME_WAIT   -                    timewait (58.09/0/0)
tcp        0      0 10.110.139.181:64752    10.110.139.230:5200     TIME_WAIT   -                    timewait (55.55/0/0)
tcp        0      0 10.110.139.181:23646    10.110.139.230:5200     TIME_WAIT   -                    timewait (42.51/0/0)
tcp        0      0 10.110.139.181:64984    10.110.139.230:5200     TIME_WAIT   -                    timewait (56.86/0/0)
tcp        0      0 10.110.139.181:65142    10.110.139.230:5200     TIME_WAIT   -                    timewait (57.37/0/0)
tcp        0      0 10.110.139.181:65374    10.110.139.230:5200     ESTABLISHED 2340/nginx: worker   off (0.00/0/0)

第二層方向代理會產生更多的TIME_WAIT的連接
一次登錄和退出會生產非常多的time_wait的信息:
打開登錄界面 10個time_wait
登錄成功:    17個time_wait
退出登錄:    13個time_wait
[root@openeuler2203 ~]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep 10.110.139.181
tcp        0      0 10.110.139.230:5200     10.110.139.181:28270    TIME_WAIT   -                    timewait (43.00/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28502    TIME_WAIT   -                    timewait (44.91/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:26174    TIME_WAIT   -                    timewait (57.03/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28506    TIME_WAIT   -                    timewait (44.93/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28452    TIME_WAIT   -                    timewait (44.71/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28478    TIME_WAIT   -                    timewait (44.91/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:26158    TIME_WAIT   -                    timewait (57.02/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28440    TIME_WAIT   -                    timewait (44.70/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28268    TIME_WAIT   -                    timewait (42.99/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:51306    TIME_WAIT   -                    timewait (36.06/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28514    TIME_WAIT   -                    timewait (44.99/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28564    TIME_WAIT   -                    timewait (45.20/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:26148    TIME_WAIT   -                    timewait (56.93/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:28466    TIME_WAIT   -                    timewait (44.74/0/0)
tcp        0      0 10.110.139.230:5200     10.110.139.181:26186    TIME_WAIT   -                    timewait (57.06/0/0)

Upstream 的 keepalive 的測試

在upstream裏面增加設置
keepalive  32; 
並且在 location 裏面設置 
proxy_http_version 1.1;

然後重啓nginx

需要注意的是:
在當前服務器只會看到一個 tcp 對中間層nginx的連接
但是中間nginx的連接
會產生 20個time-wait 的連接. 

TCP內核的驗證

image


TCP內核驗證出現502錯誤的過程

sysctl -w "net.ipv4.ip_local_port_range=6000 6001"

然後登錄nginx 所在的服務器
使用兩個客戶端打開 或者是打開具體個功能
F12會立即發現有很多的502 badgates 的提示信息. 

也就驗證出 如果time_wait+eslabished 的連接數大於 ip_local_port_range 
的範圍的話 有極大的概率出現 502的問題. 

注意這個修改完之後 需要立即改回來 不然會出現嚴重的問題. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章