优化Linux下的内核TCP参数来提高服务器负载能力
提高服務(wù)器的負(fù)載能力,是一個(gè)永恒的話題。在一臺(tái)服務(wù)器CPU和內(nèi)存資源額定有限的情況下,最大的壓榨服務(wù)器的性能,是最終的目的。要提高Linux系統(tǒng)下的負(fù)載能力,可以先啟用Apache的Worker模式,來提高單位時(shí)間內(nèi)的并發(fā)量。但是即使這么做了,當(dāng)網(wǎng)站發(fā)展起來之后,連接數(shù)過多的問題就會(huì)日益明顯。在節(jié)省成本的情況下,可以考慮修改Linux的內(nèi)核TCP/IP參數(shù),來最大的壓榨服務(wù)器的性能。當(dāng)然,如果通過修改內(nèi)核參數(shù)也無法解決的負(fù)載問題,也只能考慮升級(jí)服務(wù)器了,這是硬件所限,沒有辦法的事。
Linux系統(tǒng)下,TCP/IP連接斷開后,會(huì)以TIME_WAIT狀態(tài)保留一定的時(shí)間,然后才會(huì)釋放端口。當(dāng)并發(fā)請(qǐng)求過多的時(shí)候,就會(huì)產(chǎn)生大量的TIME_WAIT狀態(tài)的連接,無法及時(shí)斷開的話,會(huì)占用大量的端口資源和服務(wù)器資源(因?yàn)殛P(guān)閉后進(jìn)程才會(huì)退出)。這個(gè)時(shí)候我們可以考慮優(yōu)化TCP/IP的內(nèi)核參數(shù),來及時(shí)將TIME_WAIT狀態(tài)的端口清理掉。
本文介紹的方法只對(duì)擁有大量TIME_WAIT狀態(tài)的連接導(dǎo)致系統(tǒng)資源消耗有效,不是這個(gè)原因的情況下,效果可能不明顯。那么,到哪兒去查TIME_WAIT狀態(tài)的連接呢?那就是使用netstat命令。我們可以輸入一個(gè)復(fù)核命令,去查看當(dāng)前TCP/IP連接的狀態(tài)和對(duì)應(yīng)的個(gè)數(shù):
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
這個(gè)命令會(huì)顯示出類似下面的結(jié)果:
LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
我們只用關(guān)心TIME_WAIT的個(gè)數(shù),在這里可以看到,有18000多個(gè)TIME_WAIT,這樣就占用了18000多個(gè)端口。要知道端口的數(shù)量只有65535個(gè),占用一個(gè)少一個(gè),會(huì)嚴(yán)重的影響到后繼的新連接。這種情況下,我們就有必要調(diào)整下Linux的TCP/IP內(nèi)核參數(shù),讓系統(tǒng)更快的釋放TIME_WAIT連接。
我們用vim打開配置文件:
#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ù)生效:
#/sbin/sysctl -p
簡單的說明下,上面的參數(shù)的含義:
net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_fin_timeout 修改系統(tǒng)默認(rèn)的 TIMEOUT 時(shí)間。
在經(jīng)過這樣的調(diào)整之后,除了會(huì)進(jìn)一步提升服務(wù)器的負(fù)載能力之外,還能夠防御一定程度的DDoS、CC和SYN攻擊,是個(gè)一舉兩得的做法。
此外,如果你的連接數(shù)本身就很多,我們可以再優(yōu)化一下TCP/IP的可使用端口范圍,進(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ù)器上開啟,會(huì)有顯著的效果。一般的流量小的服務(wù)器上,沒有必要去設(shè)置這幾個(gè)參數(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ì)列的長度,默認(rèn)為1024,加大隊(duì)列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 5000 表示系統(tǒng)同時(shí)保持TIME_WAIT的最大數(shù)量,如果超過這個(gè)數(shù)字,TIME_WAIT將立刻被清除并打印警告信息。默 認(rèn)為180000,改為5000。對(duì)于Apache、Nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對(duì)于 Squid,效果卻不大。此項(xiàng)參數(shù)可以控制TIME_WAIT的最大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT拖死。
經(jīng)過這樣的配置之后,你的服務(wù)器的TCP/IP并發(fā)能力又會(huì)上一個(gè)新臺(tái)階。
總結(jié)
以上是生活随笔為你收集整理的优化Linux下的内核TCP参数来提高服务器负载能力的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch线程池介绍
- 下一篇: Linux nginx 会话保持(ses