MySQL連線超時

2021-09-01 14:23:46 字數 1077 閱讀 6744

在負載較重的mysql伺服器上,有時你偶爾會看到一些連線超時的錯誤,諸如: can』t connect to mysql server on 『mydb』(110)。如果當時你有多個連線請求,你會發現其它連線卻沒問題。這類問題開始時很不顯眼,且長時間來看幾乎可以忽略不計(注:次數不 多),類似於百萬分之一的發生率,但是在伺服器負載不斷加重時,可能出現的頻率將有所上公升。

如果你對連線進行計時你會發現,連線一般都接近3-9秒。這個時長有時也很詭異,多年前我就曾遇到過一次,當時資料庫請求連線被重置,syn包一直被丟 棄。3秒就有乙個syn包被拋棄,9秒有兩被拋棄。如果你也碰到了類似情況,則有可能是你的網路存在問題或你的資料庫伺服器請求偵聽佇列溢位,你可以通過 執行netstat -s命令進行檢查,可能會返回類似於:偵聽佇列的socket發生了38409次溢位,38409個syn包被丟棄,這就意味著偵聽socket的核心緩 存溢位了,syn包將不得不被丟棄 -- mysql並不是在需要時就盡快接受連線。

如果發生了這種情況,有2個調優的地方你可以考慮。

1. linux核心:net.ipv4.tcp_max_syn_backlog,這引數是用來設定所有socket核心快取大小的。我的系統預設值為2048,其它版本可能不盡相同,如果你的連線併發較大則你可能需要將此值提高到8192左右。具體匹配情況我會在下面介紹。

2.mysql引數:back_log,預設值為50。你可能需將此值設定為1000或更高。同時,你可能提高net.core.somaxconn核心引數值,這個引數是用來設定偵聽佇列的最大深度。我本人核心中此引數設定的是128,這在很多情況下會偏低。

我建議將tcp_max_syn_backlog和back_log的值調整到足夠支撐2秒的連線請求(注:連線請求2秒未超時)。比方說,正常情況下每 秒有100個連線,假設峰值為3倍正常情況,則為300連線/秒,這意味著前面提到的引數至少需設到600。(注:300連線/秒 * 2秒 = 600連線/秒)

將引數設到支援2秒以上請求的意義不大,因為客戶端在3秒內未收到應答後將發出新的連線請求。

另外,如果你每秒建立了1000個mysql連線,你可能有點過了,畢竟建立和銷毀1000個連線需使用大量的資源。考慮下使用長連線或連線池吧,至少是那種大部分連線是由應用建立的情況。

MySQL連線超時

1.無論是my.ini還是my.cnf,在 mysqld 下面有兩個配置項 wait timeout 28800 interactive timeout 28800 預設值都是28800秒.乙個連線,預設持續時間是wait timemout,如果連線中mysql real connect引數採用了c...

MYSQL 連線超時問題

前不久維護了乙個 專案,專案的後台設計是 管理者進入 後台連線,第一步就是建立資料庫,只需按照提示輸入 ip 位址 即在那個ip 位址的主機上建立資料庫 使用者名稱 密碼 埠號 即所在ip 位址的主機上安裝的mysql 的使用者名稱 密碼和埠號 資料庫的名字這5項內容,然後就開始自動建立資料庫,建立...

mysql連線超時 wait timeout

服務本身沒有掛掉,檢視日誌是資料庫連線異常,等待超時。解決 有2種方法 1.wait timeout和interactive timeout引數mysql預設是28800,即8小時 將等待時間預設值調成24小時。重啟一下服務即可 2.autoreconnect true,在資料庫鏈結後面新增引數值。...