最近有2臺web機器連接mysql有時會出現Can’t connect to MySQL server的狀況,查看exception日誌: mysql
以下: web
[message:protected] => SQLSTATE[HY000] [2003] Can’t connect to MySQL server on ‘192.168.1.248′(99)
1):問題描述: sql
2臺web機器,只有其中一臺出現該exception,另一臺無此問題; 緩存
exception logs: Can’t connect to MySQL server on ‘*.*.*.*’ (99) cookie
2):問題排查: 網絡
一、查看mysql的variables,status: socket
max_user_connections = 200 tcp
max_connect_errors = 50000 spa
max_connections = 1000 日誌
max_user_connections = 200
二、ulimit -a:
三、查看netstat -anp
查看問題機器的netstat -anp,發現大部分都是TIME_WAIT,懷疑是tcp的問題;
將近有3萬的網絡套接字,此時CPU也耗盡,致使這麼多的TCP/IP鏈接CPU處理不過來,而使部分TCP/IP鏈接超時或處理失敗
三、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了