網(wǎng)上購(gòu)買(mǎi)的VPS普遍內(nèi)存少达布,如何用有限的資源支持最多的網(wǎng)絡(luò)連接,這就需要修改Linux內(nèi)核參數(shù)欣尼。
用vim打開(kāi)配置文件:#vim /etc/sysctl.conf`
在這個(gè)文件中宙彪,加入下面的幾行內(nèi)容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30`
輸入下面的命令,讓內(nèi)核參數(shù)生效:#sysctl -p
簡(jiǎn)單的說(shuō)明上面的參數(shù)的含義:
net.ipv4.tcp_syncookies = 1
#表示開(kāi)啟SYN Cookies撑刺。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理握玛,可防范少量SYN攻擊猜煮,默認(rèn)為0次员,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1
#表示開(kāi)啟重用王带。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0市殷,表示關(guān)閉愕撰;
net.ipv4.tcp_tw_recycle = 1
#表示開(kāi)啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0醋寝,表示關(guān)閉搞挣;
net.ipv4.tcp_fin_timeout
#修改系統(tǒng)默認(rèn)的 TIMEOUT 時(shí)間。
在經(jīng)過(guò)這樣的調(diào)整之后音羞,除了會(huì)進(jìn)一步提升服務(wù)器的負(fù)載能力之外囱桨,還能夠防御小流量程度的DoS、CC和SYN攻擊嗅绰。
此外舍肠,如果你的連接數(shù)本身就很多,我們可以再優(yōu)化一下TCP的可使用端口范圍窘面,進(jìn)一步提升服務(wù)器的并發(fā)能力翠语。依然是往上面的參數(shù)文件中,加入下面這些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
這幾個(gè)參數(shù)财边,建議只在流量非常大的服務(wù)器上開(kāi)啟肌括,會(huì)有顯著的效果。一般的流量小的服務(wù)器上酣难,沒(méi)有必要去設(shè)置這幾個(gè)參數(shù)谍夭。
net.ipv4.tcp_keepalive_time = 1200
#表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度憨募。缺省是2小時(shí)紧索,改為20分鐘。
net.ipv4.ip_local_port_range = 10000 65000
#表示用于向外連接的端口范圍馋嗜。缺省情況下很衅氚濉:32768到61000,改為10000到65000葛菇。(注意:這里不要將最低值設(shè)的太低甘磨,否則可能會(huì)占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊(duì)列的長(zhǎng)度眯停,默認(rèn)為1024济舆,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)莺债。
net.ipv4.tcp_max_tw_buckets = 6000
#表示系統(tǒng)同時(shí)保持TIME_WAIT的最大數(shù)量滋觉,如果超過(guò)這個(gè)數(shù)字签夭,TIME_WAIT將立刻被清除并打印警告信息。默 認(rèn)為180000椎侠,改為6000第租。對(duì)于Apache、Nginx等服務(wù)器我纪,上幾行的參數(shù)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量慎宾,但是對(duì)于 [Squid](http://www.ha97.com/tag/squid),效果卻不大浅悉。此項(xiàng)參數(shù)可以控制TIME_WAIT的最大數(shù)量趟据,避免Squid服務(wù)器被大量的TIME_WAIT拖死。
內(nèi)核其他TCP參數(shù)說(shuō)明:
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值术健。對(duì)于有128M內(nèi)存的系統(tǒng)而言汹碱,缺省值是1024,小內(nèi)存的系統(tǒng)則是128荞估。
net.core.netdev_max_backlog = 32768
#每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí)咳促,允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
net.core.somaxconn = 32768
#web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128泼舱,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511等缀,所以有必要調(diào)整這個(gè)值。
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216 #最大socket讀buffer,可參考的優(yōu)化值:873200
net.core.wmem_max = 16777216 #最大socket寫(xiě)buffer,可參考的優(yōu)化值:873200
net.ipv4.tcp_timestsmps = 0
#時(shí)間戳可以避免序列號(hào)的卷繞娇昙。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過(guò)的序列號(hào)尺迂。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包冒掌。這里需要將其關(guān)掉噪裕。
net.ipv4.tcp_synack_retries = 2
#為了打開(kāi)對(duì)端的連接,內(nèi)核需要發(fā)送一個(gè)SYN并附帶一個(gè)回應(yīng)前面一個(gè)SYN的ACK股毫。也就是所謂三次握手中的第二次握手膳音。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。
net.ipv4.tcp_syn_retries = 2
#在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量铃诬。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 開(kāi)啟重用祭陷。允許將TIME-WAIT sockets重新用于新的TCP連接。
net.ipv4.tcp_wmem = 8192 436600 873200
# TCP寫(xiě)buffer,可參考的優(yōu)化值: 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
# TCP讀buffer,可參考的優(yōu)化值: 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
# 同樣有3個(gè)值,意思是:
#net.ipv4.tcp_mem[0]:低于此值趣席,TCP沒(méi)有內(nèi)存壓力兵志。
#net.ipv4.tcp_mem[1]:在此值下,進(jìn)入內(nèi)存壓力階段宣肚。
#net.ipv4.tcp_mem[2]:高于此值想罕,TCP拒絕分配socket。
#上述內(nèi)存單位是頁(yè)霉涨,而不是字節(jié)按价〔咽剩可參考的優(yōu)化值是:786432 1048576 1572864
net.ipv4.tcp_max_orphans = 3276800
#系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上。
#如果超過(guò)這個(gè)數(shù)字楼镐,連接將即刻被復(fù)位并打印出警告信息癞志。
#這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(gè)值框产,
#更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)今阳。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間茅信。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外當(dāng)機(jī)墓臭。缺省值是60秒蘸鲸。2.2 內(nèi)核的通常值是180秒,你可以按這個(gè)設(shè)置窿锉,但要記住的是酌摇,即使你的機(jī)器是一個(gè)輕載的WEB服務(wù)器,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn)嗡载,F(xiàn)IN- WAIT-2的危險(xiǎn)性比FIN-WAIT-1要小,因?yàn)樗疃嘀荒艹缘?.5K內(nèi)存,但是它們的生存期長(zhǎng)些统诺。
經(jīng)過(guò)上述調(diào)整后皮璧,linux系統(tǒng)支持的網(wǎng)絡(luò)并發(fā)會(huì)有顯著增加。