LINUX TCP連線最佳化

2jfly發表於2009-04-14

轉發,謝謝原創者

新增的一組Apache伺服器上線以來,我用netstat -an命令發現伺服器中有大量狀態為TIME-WAIT的TCP連線,於是用/sbin/sysctl -a檢視了一下Linux的各項核心引數,並翻閱有關資料,決定修改其中的兩項引數,以達到減少TCP連線中TIME-WAIT sockets的目的。
  vi /etc/sysctl.conf
  編輯/etc/sysctl.conf檔案,增加三行:
  引用
  net.ipv4.tcp_syncookies = 1
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_tw_recycle = 1
  說明:
  net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待佇列溢位時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
  net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
  net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
  再執行以下命令,讓修改結果立即生效:
  /sbin/sysctl -p
  用以下語句看了一下伺服器的TCP狀態:
  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  返回結果如下:
  ESTABLISHED 1423
  FIN_WAIT1 1
  FIN_WAIT2 262
  SYN_SENT 1
  TIME_WAIT 962
  效果:處於TIME_WAIT狀態的sockets從原來的10000多減少到1000左右。處於SYN_RECV等待處理狀態的sockets為0,原來的為50~300。

這裡解決問題的關鍵是如何能夠重複利用time_wait的值,我們可以設定時檢查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21100044/viewspace-1020501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章