Nginx配置和Linux核心引數的學習與驗證

济南小老虎發表於2024-06-15

Nginx配置和Linux核心引數的學習與驗證


背景結論

前幾天給客戶遷移機房
發現nginx在銀河麒麟上面Worker不均衡. 
突然想到最開始的那個一個應用伺服器能夠支援多少個客戶端.
然後想到之前自己學習過的一些核心引數. 
所以就想到徹底的理清一下 引數配置檔案的關係. 

關於核心引數的說明:
1. net.ipv4.tcp_max_syn_backlog  
半連結丟列長度. 

2. net.core.somaxconn
全連線還沒有徹底進行資料互動的佇列長度. 

3. nofile 
一個程序能夠開啟的最多的檔案描述符的數量. 
nofile會決定nginx 能夠同事多少個 tcp連結. 是一個上線. 

4. net.ipv4.ip_local_port_range
tcp四元組, 本機同一個埠與其他同一個ip地址進行tcp連結的己方埠範圍.
需要說明, 這個是一個很嚴格的限定範圍
四元組裡面肯定是 三方都確定才會用到這一個範圍
己方ip:對方ip: 必須固定的情況下才會進行埠範圍的限定. 

5. net.ipv4.tcp_max_tw_buckets
等待安全釋放的已經四步揮手了的tcp連結的數量. 
因為tcp 在四步揮手之後, 一般要避免機房埠被立即服用. 
需要有一個類似於離婚冷靜期的時間 就是 timewait buckets的時間
如果設定的太小, 有機率讓應用出現關閉的連結繼續發資料
會讓 應用進行包的判斷影響效能. 

6. net.ipv4.tcp_tw_reuse
time_wait的埠號能不能直接進行復用
不服用提示:Cannot assign requested address
複用存在一定的安全隱患. 

7. ningx裡面的 worker_processes worker_connections  
nginx定義的 工作程序數量以及每個工作程序能夠建立的連線數. 

8. 如果對端ip地址足夠多, 並且機器記憶體足夠的情況下
理論上可以建議超過100萬個TCP連結. 

總結 : 
1. backlog somaxconn
主要是跟排隊相關. 不建議太小, 避免排隊都排不上. 

2. nofile 和 worker_connections
兩者的最小值來決定 一個worker能夠支援的最大連結數. 

3. net.ipv4.ip_local_port_range
決定針對特定IP地址, 己方有多少個埠可以用來建立連線
可以理解為 針對特定IP地址, 最多建立範圍之內的連結
更多的無法建立. 
tcp_max_tw_buckets
短連線的情況下, 最多多少個連結會等待自己的安全釋放. 

4. worker_processes * min( worker_connections or nofile)
在埠和ip 不受限的情況下來決定最大可以支撐的TCP網路連線數量

5. nofile 會嚴格限制不能超過自己. 
worker_connections  檔案描述符開啟數量會比這個限制少100 

Nginx的部署

yum install -y gcc-c++

./configure --prefix=/opt/nginx \
--sbin-path=/opt/nginx/nginx \
--conf-path=/opt/nginx/nginx.conf \
--pid-path=/opt/nginx/nginx.pid \
--with-http_stub_status_module  \
--with-http_ssl_module \
--with-http_realip_module  \
--with-http_gzip_static_module  \
--with-stream --with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-http_ssl_module \
--with-pcre=../pcre-8.45 \
--with-zlib=../zlib-1.2.13 \
--with-openssl=../openssl-1.1.1u

對應的檔案為:
nginx-1.24.0.tar.gz
nginx-1.25.1.tar.gz
nginx-1.26.0.tar.gz
openssl-1.1.1u.tar.gz
pcre-8.45.tar.gz
zlib-1.2.13.tar.gz

time make 

安裝ab

yum install httpd-tools -y 

nginx的和核心的引數設定

sysctl -w net.ipv4.ip_local_port_range="1025 65530"
sysctl -w net.ipv4.tcp_max_tw_buckets=100
sysctl -w net.ipv4.tcp_tw_reuse=1
nohup  ab -n 10000000 -c 20000 http://172.24.110.201:80/ &

因為ab 有20000 的限制可以使用如下指令碼:
cat >/deploy/ab.sh <<EOF
nohup ab -k -n 10000000 -c 20000 http://172.24.110.201:80/ &
nohup ab -k -n 10000000 -c 20000 http://172.24.110.201:80/ &
nohup ab -k -n 10000000 -c 20000 http://172.24.110.201:80/ &
EOF
chmod 777 /deploy/ab.sh
/deploy/ab.sh

測試結果-最大值檢視:

[root@kylinv10gaussdb nginx]# for i in `ps -ef |grep nginx |grep -v grep |grep -v nginx.conf  |awk '{print $2}'` ; do echo -n $i ; echo -n ": " ; ll /proc/${i}/fd |wc -l ; done
330387: 22096
330388: 22971
330389: 21716
330390: 22587
330391: 22642
330392: 22516
330393: 22742
330394: 22636

系統資訊為: 

[root@kylinv10gaussdb nginx]# cat /proc/net/sockstat
sockets: used 187917
TCP: inuse 186994 orphan 16 tw 141 alloc 186999 mem 22
UDP: inuse 4 mem 1
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
[root@kylinv10gaussdb nginx]# nkvers
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Lance)

Kernel:
4.19.90-52.15.v2207.ky10.x86_64

Build:
Kylin Linux Advanced Server
release V10 (SP3) /(Lance)-x86_64-Build20/20221125
#################################################

驗證 worker_connections 和 nofile引數

ulimit -HSn 100000
修改 worker_connections 為 12345 
重啟nginx
大部分結果為: 
26878: 1154
26879: 1164
26880: 1153
26881: 1148
26882: 1169
26883: 1147
26884: 1164
26885: 1165

修改 worker_connections 為 2048
31925: 1937
31926: 1933
31927: 1915
31928: 1913
31929: 1916
31930: 1927
31931: 1910
31932: 1930

修改 worker_connections 為 102400
ulimit -HSn 1536
32900: 1537
32901: 1537
32902: 1537
32903: 1537
32904: 1537
32905: 1537
32906: 1537
32907: 1537

需要注意 我的指令碼里面需要 -2 因為有兩個是檔案目錄的. 和 .. 

相關文章