Can’t connect to MySQL server有關linux tcp連接優化 最近有2台web機器鏈接mysql有時會出現Can’t connect to MySQL server的情況,查看exception日志: 如下:
[message:protected] => SQLSTATE[HY000] [2003] Can’t connect to MySQL server on ‘192.168.1.248′(99)
1):問題描述: 2台web機器,只有其中一台出現該exception,另外一台無此問題; exception logs: Can’t connect to MySQL server on ‘*.*.*.*’ (99) 2):問題排查: 1、查看mysql的variables,status:
max_connect_errors = 50000 max_connections = 1000 max_user_connections = 200 max_connect_errors = 50000 max_connections = 1000 max_user_connections = 200
2、ulimit -a: 3、查看netstat -anp 查看問題機器的netstat -anp,發現大部分都是TIME_WAIT,懷疑是tcp的問題; 將近有3萬的網絡套接字,此時CPU也耗盡,導致這麼多的TCP/IP連接CPU處理不過來,而使部分TCP/IP連接超時或處理失敗 3、OS: more /etc/sysctl.conf: net.ipv4.tcp_syncookies = 1 新的連接可以重新使用TIME-WAIT套接字 net.ipv4.tcp_tw_reuse=1 啟動TIME-WAIT套接字狀態的快速循環功能 net.ipv4.tcp_tw_recycle=1 套接字關閉時,保持FIN-WAIT-2狀態的時間 net.ipv4.tcp_fin_timeout=30 對於所有協議的隊列,設置最大系統發送緩存(wmen)和接收緩存(rmem)到8M net.core.wmem_max=8388608 net.core.rmem_max=8388608 讓參數生效。 3):問題原因: 報錯”Can’t connect to MySQL server on ‘*.*.*.*’ (99) ” 參考MySQL Client端錯誤代碼說明:錯誤代碼為99,99的含義:$perror 99 OS error code 99: Cannot assign requested address 這是一個本地OS的拋錯,表示無法分配本地地址資源(應該是端口),socket無法創建 ” Cannot assign requested address”,多半是由於客戶端請求過於頻繁,而Server端練級關閉後本地暫時處於TIME_WAIT,所以暫時端口都不可用導致。因此修改下OS參數就ok了