2019年8月2日 星期五

大量Time_wait的改善紀錄

因為AP架構設計的緣故,做了個Agent處理在Listen伺服器上檢查是否有需要處理的作業,頻繁的連線>檢查>關閉的作業,在客戶端Agent多的狀況下在伺服器端就會發現有許多Time_wait紀錄,這樣會造成WEB服務上的效能變差。

編輯 vim /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

然後執行  /sbin/sysctl -p 套用
  • 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,表示關閉。
  • net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間
若是卡點在對資料庫的連線,那麼寫個shell script來kill process才能改善,單純結束連線解決不了問題。

define('MAX_SLEEP_TIME', 120);  

$hostname = "xxx";  
$username = "xxx";  
$password = "xxx";  

$err_level = error_reporting(0);
$connect = mysql_connect($hostname,$username,$password);
error_reporting($err_level); 
$result = mysql_query("SHOW PROCESSLIST", $connect);  
while ($proc = mysql_fetch_assoc($result)) {  
  if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {  
    @mysql_query("KILL " . $proc["Id"], $connect);  
  }  
}   
mysql_close($connect);  

沒有留言: