1. 程式人生 > >php連線redis導致系統對外tcp連線埠太多問題

php連線redis導致系統對外tcp連線埠太多問題

這段時間在做一個專案中,大量運用到了redis,用了很多後臺程序跑任務。

後臺指令碼是個死迴圈,由於連線redis的類有問題,導致每次進行操作都會進行一次connect,產生一個新連線。一段時間後連線redis的tcp埠過多,超出了系統的預設限制。使用netstat命令檢視埠連線數,系統對外埠連線數預設是28232個,使用命令cat /proc/sys/net/ipv4/ip_local_port_range 得出結果32768 61000,意思是系統隨機分配埠的範圍,28232=61000-32768.

當時做了臨時解決,及時close掉redis,但是檢視tcp連線,還會保持一定數量的tcp 連線 狀態time_out。為什麼呢?雖然客戶端關閉了連線,但是系統依然會保持這個tcp連線一段時間,時間是msl的2倍,通常是1分鐘。使用命令 cat /proc/sys/net/ipv4/tcp_fin_timeout可檢視系統保持時間.

MSL 是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報文最大生存時間”,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。

2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱為2MSL等待狀態

後來,對redis的連線類做了修改,使用單例,將連線資源存入一個static變數陣列中,注意獲取連線資源時,需要加上ping,判斷該連線資源是否可用。防止redis服務端主動斷開連線或者超時,使該連線失效。