2012-04-12 141 views
9

我看到在一些這些錯誤的高負荷時間:MySQL的資源暫時不可用

mysql_connect() [<a 
href='function.mysql-connect'>function.mysql-connect</a>]: [2002] Resource 
temporarily unavailable (trying to connect via 
unix:///var/lib/mysql/mysql.sock) 

從我可以告訴MySQL服務器不打它的最大連接數的限制,但還有別的停止它從服務查詢。 MySQL會受到什麼其他限制?

我運行RHEL 6.2 64位的MySQL 21年5月5日

+0

它可能是在MySQL服務器中的錯誤?這也可能是由於MySQL服務器如何處理有大量問題的請求的結果,例如根據某種時鐘度量幾乎同時發生請求時。 – 2012-04-12 20:53:28

+0

您是重用連接還是隻打開新連接?如果沒有一些代碼,很難做出有教育的猜測。 – stevebot 2012-04-12 20:56:22

+0

連接在PHP請求中不是持久的。我讀了一些關於mysql耗盡文件描述符的地方,但我不確定如何檢查。 – Noodles 2012-04-12 23:56:12

回答

2

我還沒有找到它正在打的限制,但我確實設法解決了這個問題。使用MEMORY引擎的會話表(在vbulletin中)存在問題。該表的索引是HASH,因此當vbulletin每小時清除一次該表時,它會鎖定該表足夠長的時間以阻止其他查詢並將mysql推到其資源的限制。

通過將索引更改爲BTREE,這使MySQL可以更快地從會話表中刪除行,並避免之前達到的任何限制。這些錯誤僅在我們將主數據庫服務器升級到MySQL 5.5時纔開始,因此我猜測MEMORY表在最新版本中的處理方式不同。

請參閱http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables/瞭解有關使用BTREE索引超過HASH的速度增加信息MEMORY。

21

讓我們假設你的系統是目前基於Unix的(如您的問題聲明中給出)。如果這是正確的,這裏是您可能正在運行到一系列問題:

  1. 你已經用完了memory可到MySQL。

    這是您最可能遇到的問題。 MySQL連接池中的每個連接都需要內存才能運行,並且如果此資源耗盡,則無法建立進一步的連接。當然,如果您發現這是一個問題,則可以在your equivalent to my.cnf中調整各種操作的內存佔用空間和最大數據包大小。

    Here's an additional thread that can help there,但您也可以考慮使用更簡單的分析工具(如top)來獲得良好的估計結果。

  2. 您的MySQL用戶帳戶已用盡file descriptors

    另一個常見問題:如果您嘗試服務的請求需要文件IO高於1,024邊界(默認情況下),則會遇到操作失敗的情況。這是因爲大多數系統對每個用戶一次可用的打開文件描述符的數量指定了軟限制和硬限制,並且越過此閾值可能會導致問題。

    這通常會在您的日誌文件中表達一系列明顯的標誌。檢查/var/log/messages和你媲美目錄(例如,/var/log/mysql,看看是否能找到什麼有趣的事。

  3. 你碰上livelock or deadlock場景,你的線程是不可滿足的。

    推論內存和文件描述符耗盡,如果你超出了系統能夠處理的計算負載,線程可能會超時,但它不會拋出這個錯誤信息,但這是將來需要注意的事情。從PID中可用到fork

    另一種常見的情況:fork在任何給定時間只有很多PID可用。如果你的系統只是overforked,它將不再能夠處理請求。

    最簡單的檢查方法是查看是否有其他服務可以連接到機器。例如,試圖SSH進入盒子,發現你不能是一個很大的線索。

  4. 上游代理或連接管理器用盡了資源並停止了服務請求。

    如果你的客戶端和MySQL之間有任何服務層,它會檢查它是否崩潰,掛起或者變得不穩定。上述建議適用。

  5. 您的端口映射器已經耗盡after 65,536 connections

    不太可能,但也是可能的用盡情況。如上所述,檢查瑣碎的服務連接,ehm也是這裏最好的通話端口。

簡而言之:這是一個資源枯竭的情況下,包括服務器僅僅是「下降」。你將不得不進一步剖析你的系統,看看你阻止了什麼。在這種情況下,所有錯誤消息都告訴我們客戶端無法使用資源 - 我們需要查看更多關於服務器的信息,以確定更充分的補救措施。

+0

謝謝,非常有幫助,但你能指出我在正確的地方去測試每一個嗎?我懷疑我的內存不足(每臺服務器都有12GB內存),但我需要查看其他內存。 – Noodles 2012-04-16 00:12:43

+1

@Noodles會做。我需要首先處理一些事情,但是我希望能夠在接下來的一個小時內回覆更多的文檔。 :) – MrGomez 2012-04-16 00:29:52

+1

我的答案已更新。我的時間估計有點小,但這應該足以幫助解決問題。如果您需要更有說服力的具體建議,請告訴我。我很樂意通過SO聊天提供自己的服務。 – MrGomez 2012-04-16 01:56:04

1

哎呀,這可能是那麼多事情。這可能是套接字緩衝區空間耗盡。這可能是因爲mysql沒有像他們進來一樣快地接受連接,並且達到了積壓限制(雖然我期望給你一個「連接被拒絕」的錯誤,但我不確定這是什麼,會得到一個Unix域套接字)。這可能是@MrGomez指出的任何事情。

由於您在同一臺服務器上運行Apache和MySQL,並且這是高負載下的問題,所以Apache很可能會餓死某些資源的系統,而您只是沒有看到(注意到)丟棄/日誌中的傳入連接/請求失敗。

您使用連接池嗎?如果沒有,我會從那裏開始。

我還會在mysql_connect錯誤的同一時間查找Apache日誌和syslog中的錯誤,並查看還會發生什麼。我特別建議讓MySQL移到它自己的專用服務器上。

相關問題