提高服務(wù)器的負(fù)載能力,是一個(gè)永恒的話題。在一臺(tái)服務(wù)器CPU和內(nèi)存資源額定有限的情況下,最大的壓榨服務(wù)器的性能,是最終的目的。要提高Linux系統(tǒng)下的負(fù)載能力,可以先啟用Apache的Worker模式(參考我寫(xiě)的《Ubuntu下配置Apache的Worker模式》一文),來(lái)提高單位時(shí)間內(nèi)的并發(fā)量。但是即使這么做了,當(dāng)網(wǎng)站發(fā)展起來(lái)之后,連接數(shù)過(guò)多的問(wèn)題就會(huì)日益明顯。在節(jié)省成本的情況下,可以考慮修改Linux的內(nèi)核TCP/IP參數(shù),來(lái)最大的壓榨服務(wù)器的性能。當(dāng)然,如果通過(guò)修改內(nèi)核參數(shù)也無(wú)法解決的負(fù)載問(wèn)題,也只能考慮升級(jí)服務(wù)器了,這是硬件所限,沒(méi)有辦法的事。 Linux系統(tǒng)下,TCP/IP連接斷開(kāi)后,會(huì)以TIME_WAIT狀態(tài)保留一定的時(shí)間,然后才會(huì)釋放端口。當(dāng)并發(fā)請(qǐng)求過(guò)多的時(shí)候,就會(huì)產(chǎn)生大量的TIME_WAIT狀態(tài)的連接,無(wú)法及時(shí)斷開(kāi)的話,會(huì)占用大量的端口資源和服務(wù)器資源(因?yàn)殛P(guān)閉后進(jìn)程才會(huì)退出)。這個(gè)時(shí)候我們可以考慮優(yōu)化TCP/IP的內(nèi)核參數(shù),來(lái)及時(shí)將TIME_WAIT狀態(tài)的端口清理掉。 本文介紹的方法只對(duì)擁有大量TIME_WAIT狀態(tài)的連接導(dǎo)致系統(tǒng)資源消耗有效,不是這個(gè)原因的情況下,效果可能不明顯。那么,到哪兒去查T(mén)IME_WAIT狀態(tài)的連接呢?那就是使用netstat命令。我們可以輸入一個(gè)復(fù)核命令,去查看當(dāng)前TCP/IP連接的狀態(tài)和對(duì)應(yīng)的個(gè)數(shù):
這個(gè)命令會(huì)顯示出類似下面的結(jié)果:
我們只用關(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打開(kāi)配置文件:
然后,在這個(gè)文件中,加入下面的幾行內(nèi)容:
最后輸入下面的命令,讓內(nèi)核參數(shù)生效:
簡(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)閉; 在經(jīng)過(guò)這樣的調(diào)整之后,除了會(huì)進(jìn)一步提升服務(wù)器的負(fù)載能力之外,還能夠防御一定程度的DDoS、CC和SYN攻擊,是個(gè)一舉兩得的做法。 此外,如果你的連接數(shù)本身就很多,我們可以再優(yōu)化一下TCP/IP的可使用端口范圍,進(jìn)一步提升服務(wù)器的并發(fā)能力。依然是往上面的參數(shù)文件中,加入下面這些配置:
這幾個(gè)參數(shù),建議只在流量非常大的服務(wù)器上開(kāi)啟,會(huì)有顯著的效果。一般的流量小的服務(wù)器上,沒(méi)有必要去設(shè)置這幾個(gè)參數(shù)。這幾個(gè)參數(shù)的含義如下:
net.ipv4.tcp_keepalive_time = 1200 表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。 經(jīng)過(guò)這樣的配置之后,你的服務(wù)器的TCP/IP并發(fā)能力又會(huì)上一個(gè)新臺(tái)階。 |
|
來(lái)自: bylele > 《網(wǎng)絡(luò)并發(fā)》