- Linux集群和自動化運維
- 余洪春
- 1522字
- 2019-01-04 00:48:43
1.4.2 優(yōu)化Linux下的內核TCP參數以提高系統性能
內核的優(yōu)化跟服務器的優(yōu)化一樣,應本著穩(wěn)定安全的原則。下面以Squid服務器為例來說明,待客戶端與服務器端建立TCP/IP連接后就會關閉Socket,服務器端連接的端口狀態(tài)也就變?yōu)門IME_WAIT了。那是不是所有執(zhí)行主動關閉的Socket都會進入TIME_WAIT狀態(tài)呢?有沒有什么情況可使主動關閉的Socket直接進入CLOSED狀態(tài)呢?答案是主動關閉的一方在發(fā)送最后一個ACK后就會進入TIME_WAIT狀態(tài),并停留2MSL(報文最大生存)時間,這是TCP/IP必不可少的,也就是說這一點是“解決”不了的。
TCP/IP設計者如此設計,主要原因有兩個:
·防止上一次連接中的包迷路后重新出現,影響新的連接(經過2MSL時間后,上一次連接中所有重復的包都會消失)。
·為了可靠地關閉TCP連接。主動關閉方發(fā)送的最后一個ACK(FIN)有可能會丟失,如果丟失,被動方會重新發(fā)送FIN,這時如果主動方處于CLOSED狀態(tài),就會響應RST而不是ACK。所以主動方要處于TIME_WAIT狀態(tài),而不能是CLOSED狀態(tài)。另外,TIME_WAIT并不會占用很大的資源,除非受到攻擊。
在Squid服務器中可輸入如下命令查看當前連接統計數:
netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S) print a, S[a]}'
命令顯示結果如下所示:
LAST_ACK 14 SYN_RECV 348 ESTABLISHED 70 FIN_WAIT1 229 FIN_WAIT2 30 CLOSING 33 TIME_WAIT 18122
命令中的含義分別如下。
·CLOSED:無活動的或正在進行的連接。
·LISTEN:服務器正在等待進入呼叫。
·SYN_RECV:一個連接請求已經到達,等待確認。
·SYN_SENT:應用已經開始,打開一個連接。
·ESTABLISHED:正常數據傳輸狀態(tài)。
·FIN_WAIT1:應用說它已經完成。
·FIN_WAIT2:另一邊已同意釋放。
·ITMED_WAIT:等待所有分組死掉。
·CLOSING:兩邊嘗試同時關閉。
·TIME_WAIT:另一邊已初始化一個釋放。
·LAST_ACK:等待所有分組死掉。
也就是說,這條命令可以把當前系統的網絡連接狀態(tài)分類匯總。
在Linux下高并發(fā)的Squid服務器中,TCP TIME_WAIT套接字的數量經常可達到兩三萬,服務器很容易就會被拖死。不過,可以通過修改Linux內核參數來減少Squid服務器的TIME_WAIT套接字數量,命令如下:
vim /etc/sysctl.conf
然后,增加以下參數:
net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000
以下將簡單說明上面各個參數的含義:
·net.ipv4.tcp_syncookies=1表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用Cookie來處理,可防范少量的SYN攻擊。該參數默認為0,表示關閉。
·net.ipv4.tcp_tw_reuse=1表示開啟重用,即允許將TIME-WAIT套接字重新用于新的TCP連接。該參數默認為0,表示關閉。
·net.ipv4.tcp_tw_recycle=1表示開啟TCP連接中TIME-WAIT套接字的快速回收,該參數默認為0,表示關閉。
·net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求關閉,那么這個參數將決定它保持在FIN-WAIT-2狀態(tài)的時間。
·net.ipv4.tcp_keepalive_time=1200表示當Keepalived啟用時,TCP發(fā)送Keepalived消息的頻度改為20分鐘,默認值是2小時。
·net.ipv4.ip_local_port_range=1000065000表示CentOS系統向外連接的端口范圍。其默認值很小,這里改為10000到65000。建議不要將這里的最低值設得太低,否則可能會占用正常的端口。
·net.ipv4.tcp_max_syn_backlog=8192表示SYN隊列的長度,默認值為1024,此處加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
·net.ipv4.tcp_max_tw_buckets=5000表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除并打印警告信息,默認值為180000,此處改為5000。對于Apache、Nginx等服務器,前面介紹的幾個參數已經可以很好地減少TIME_WAIT套接字的數量,但是對于Squid來說,效果卻不大,有了此參數就可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
執(zhí)行以下命令使內核配置立馬生效:
/sbin/sysctl –p
如果是用于Apache或Nginx等Web服務器,則只需要更改以下幾項即可:
net.ipv4.tcp_syncookies=1 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 10000 65000
執(zhí)行以下命令使內核配置立馬生效:
/sbin/sysctl –p
如果是Postfix郵件服務器,則建議內核優(yōu)化方案如下:
net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 10000 65000 kernel.shmmax = 134217728
執(zhí)行以下命令使內核配置立馬生效:
/sbin/sysctl –p
當然這些都只是最基本的更改,大家還可以根據自己的需求來更改內核的設置,比如我們的線上機器在高并發(fā)的情況下,經常會出現“TCP:too many orpharned sockets”的報錯盡量也要本著服務器穩(wěn)定的最高原則。如果服務器不穩(wěn)定的話,一切工作和努力就都會白費。如果以上優(yōu)化仍無法滿足工作要求,則有可能需要定制你的服務器內核或升級服務器硬件。
- 零起點學Linux系統管理
- 鴻蒙生態(tài):開啟萬物互聯的智慧新時代
- 網絡操作系統:Windows Server 2003管理與應用
- Instant Handlebars.js
- PLC控制系統應用與維護
- 奔跑吧 Linux內核(入門篇)
- Linux使用和管理指南:從云原生到可觀測性
- AutoCAD 2014中文版從入門到精通
- 計算機應用基礎(Windows 7+Office 2016)
- Linux基礎使用與案例
- Learning BeagleBone
- Learning Continuous Integration with Jenkins(Second Edition)
- 統信UOS應用開發(fā)進階教程
- Linux從入門到精通(視頻教學版)
- Java EE 8 High Performance