原文地址: https://blog.csdn.net/just_shunjian/article/details/78288229
一、tcp 概述
1做修、服務(wù)器如何標(biāo)識tcp連接沐扳?
在tcp應(yīng)用中莉掂,server事先在某個固定端口監(jiān)聽皇型,client主動發(fā)起連接,經(jīng)過三路握手后建立tcp連接型檀。
在確定最大連接數(shù)之前冗尤,先來看看系統(tǒng)如何標(biāo)識一個tcp連接。系統(tǒng)用一個4四元組來唯一標(biāo)識一個TCP連接:{local ip, local port,remote ip,remote port}胀溺。
(1)裂七、client最大tcp連接數(shù)
client每次發(fā)起tcp連接請求時,除非綁定端口仓坞,通常會讓系統(tǒng)選取一個空閑的本地端口(local port)背零,該端口是獨占的,不能和其他tcp連接共享无埃。
tcp端口的數(shù)據(jù)類型是unsigned short徙瓶,因此本地端口個數(shù)最大只有65536,端口0有特殊含義嫉称,不能使用侦镇,這樣可用端口最多只有65535,所以在全部作為client端的情況下澎埠,最大tcp連接數(shù)為65535虽缕,這些連接可以連到不同的server ip始藕。
(2)蒲稳、server最大tcp連接數(shù)
server通常固定在某個本地端口上監(jiān)聽氮趋,等待client的連接請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下江耀,即使server端有多個ip剩胁,本地監(jiān)聽端口也是獨占的,
因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的祥国,因此最大tcp連接為客戶端ip數(shù)×客戶端port數(shù)昵观,對IPV4,不考慮ip地址分類等因素舌稀,
最大tcp連接數(shù)約為2的32次方(ip數(shù))×2的16次方(port數(shù))啊犬,也就是server端單機最大tcp連接數(shù)約為2的48次方。
而tcp連接受到文件句柄和端口限制壁查,這直接限制tcp服務(wù)器對服務(wù)器的連接數(shù)量
二觉至、文件限制
1、用戶級別
(1)睡腿、查看Linux系統(tǒng)用戶最大打開的文件限制
#ulimit -n
65535
(2)语御、修改打開文件限制
vim /etc/security/limits.conf
root soft nofile 102400
root hard nofile 102400
其中root指定了要修改哪個用戶的打開文件數(shù)限制。
可用'*'號表示修改所有用戶的限制席怪;soft或hard指定要修改軟限制還是硬限制应闯;
102400則指定了想要修改的新的限制值,即最大打開文件數(shù)(請注意軟限制值要小于或等于硬限制)
(3)挂捻、修改/etc/pam.d/login
session required /lib/security/pam_limits.so
這是告訴Linux在用戶完成系統(tǒng)登錄后碉纺,應(yīng)該調(diào)用pam_limits.so模塊來設(shè)置系統(tǒng)對該用戶可使用的各種資源數(shù)量的最大限制(包括用戶可打開的最大文件數(shù)限制)。
而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設(shè)置這些限制值细层。
2惜辑、Linux系統(tǒng)級別
查看Linux系統(tǒng)對同時打開文件數(shù)的硬限制:
# sysctl -a|grep file-max
fs.file-max = 65535
這表明這臺Linux系統(tǒng)最多允許同時打開(即包含所有用戶打開文件數(shù)總和)65535個文件,是Linux系統(tǒng)級硬限制疫赎,所有用戶級的打開文件數(shù)限制都不會超過這個數(shù)值盛撑。
通常這個系統(tǒng)級硬限制是Linux系統(tǒng)在啟動時根據(jù)系統(tǒng)硬件資源狀況計算出來的最佳的最大同時打開文件數(shù)限制。
(1)捧搞、修改file-max限制
vim /etc/sysctl.conf
fs.file-max = 1000000
立即生效:
# sysctl -p
三抵卫、網(wǎng)絡(luò)端口限制修改
查看Linux系統(tǒng)最大追蹤TCP連接數(shù)量:
# sysctl -a | grep ipv4.ip_conntrack_max
net.ipv4.ip_conntrack_max = 20000
這表明系統(tǒng)將對最大跟蹤的TCP連接數(shù)限制默認(rèn)為20000。
查看Linux系統(tǒng)端口范圍:
# sysctl -a | grep ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1024 30000
注意:
每個TCP客戶端連接都要占用一個唯一的本地端口號(此端口號在系統(tǒng)的本地端口號范圍限制中)胎撇,如果現(xiàn)有的TCP客戶端連接已將所有的本地端口號占滿介粘。將不能創(chuàng)建新的TCP連接。
(1) vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_conntrack_max = 20000
如果按上述端口范圍進(jìn)行設(shè)置晚树,則理論上單獨一個進(jìn)程最多可以同時建立60000多個TCP客戶端連接姻采。
如果按上述參數(shù)進(jìn)行設(shè)置,則理論上單獨一個進(jìn)程最多可以同時建立20000多個TCP客戶端連接爵憎。
備注:
(1)對mysql用戶可同時打開文件數(shù)設(shè)置為10240個慨亲;
(2)將Linux系統(tǒng)可同時打開文件數(shù)設(shè)置為1000000個(一定要大于對用戶的同時打開文件數(shù)限制)婚瓜;
(3)將Linux系統(tǒng)對最大追蹤的TCP連接數(shù)限制為20000個(但是,建議設(shè)置為10240刑棵;因為對mysql用戶的同時打開文件數(shù)已經(jīng)限制在10240個巴刻;且較小的值可以節(jié)省內(nèi)存);
(4)將linux系統(tǒng)端口范圍配置為1024~30000(可以支持60000個以上連接蛉签,不建議修改胡陪;默認(rèn)已經(jīng)支持20000個以上連接);
綜合上述四點碍舍,TCP連接數(shù)限制在10140個柠座。
這10240個文件中還得除去每個進(jìn)程必然打開的標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出片橡,標(biāo)準(zhǔn)錯誤愚隧,服務(wù)器監(jiān)聽 socket,進(jìn)程間通訊的unix域socket等文件锻全。
因此狂塘,當(dāng)需要對TCP連接數(shù)進(jìn)行調(diào)整時只需要調(diào)整ulimit參數(shù)。
Linux下查看tcp連接數(shù)及狀態(tài)命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
三鳄厌、Linux下TCP最大連接數(shù)限制修改
1荞胡、修改
打開文件 /etc/sysctl.conf,增加以下設(shè)置
該參數(shù)設(shè)置系統(tǒng)的TIME_WAIT的數(shù)量了嚎,如果超過默認(rèn)值則會被立即清除
net.ipv4.tcp_max_tw_buckets = 20000
定義了系統(tǒng)中每一個端口最大的監(jiān)聽隊列的長度泪漂,這是個全局的參數(shù)
net.core.somaxconn = 65535
對于還未獲得對方確認(rèn)的連接請求,可保存在隊列中的最大數(shù)目
net.ipv4.tcp_max_syn_backlog = 262144
在每個網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時歪泳,允許送到隊列的數(shù)據(jù)包的最大數(shù)目
net.core.netdev_max_backlog = 30000
能夠更快地回收TIME-WAIT套接字萝勤。此選項會導(dǎo)致處于NAT網(wǎng)絡(luò)的客戶端超時,建議為0
net.ipv4.tcp_tw_recycle = 0
系統(tǒng)所有進(jìn)程一共可以打開的文件數(shù)量
fs.file-max = 6815744
防火墻跟蹤表的大小呐伞。注意:如果防火墻沒開則會提示error: "net.netfilter.nf_conntrack_max" is an unknown key敌卓,忽略即可
net.netfilter.nf_conntrack_max = 2621440
運行 sysctl -p即可生效。
2伶氢、修改打開文件限制
(1)ulimit -HSn 102400
這只是在當(dāng)前終端有效趟径,退出之后,open files 又變?yōu)槟J(rèn)值癣防。
(2)將ulimit -HSn 102400寫到/etc/profile中蜗巧,這樣每次登錄終端時,都會自動執(zhí)行/etc/profile蕾盯。
(3)令修改open files的數(shù)值永久生效幕屹,則必須修改配置文件:/etc/security/limits.conf. 在這個文件后加上:
- soft nofile 1024000
- hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000