簡體   English   中英

如何找到MySQL / PHP中“太多連接”錯誤的根本原因

[英]How to find root cause for “too many connections” error in MySQL/PHP

我正在運行一個Web服務,它運行的算法每天為數百萬個調用提供服務,並運行一些后台處理。 現在每次都看到“太多連接”錯誤嘗試連接到MySQL框“幾秒鍾。然而,這不一定歸因於高流量時間或任何我可以把手指放在上面。

我想找到導致它的瓶頸。 除了在特定時間發生這種情況之外,服務器在CPU和內存方面沒有太多負載,並且有2-3個連接(線程)打開,一切運行順利。 (我使用Zabbix進行監控)

關於如何追蹤它的任何創意?

嘗試在發生這種情況時打開一個mysql控制台並發出一個

SHOW PROCESSLIST;
查看正在執行的查詢。 或者,您可以啟用日志記錄慢查詢(在my.cnf中插入此行:

 log-slow-queries=/var/log/mysql-log-slow-queries.log 

在[mysqld]部分並使用

  設置變量= long_query_time時間= 1 
定義查詢應該采取的最短時間是什么,以便被認為是緩慢的。 (記得重新啟動mysql以使更改生效)

你使用什么MySQL表類型? MyISAM或InnoDB(或另一個)? MyISAM將使用表級鎖定,因此您可能會遇到運行繁重的選擇,然后在同一個表和許多選擇查詢上進行更新的情況。 然后,最后的選擇查詢必須等到更新完成(這反過來必須等到第一個 - 重 - 選擇完成)。

對於InnoDB,像innotop這樣的工具可以幫助找到死鎖的原因(參見http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/ )。

BTW導致鎖定發生的查詢應該是未處於鎖定狀態的查詢之一。

SHOW OPEN TABLES命令將顯示MySQL中所有表的鎖定狀態。 如果您的一個或多個查詢導致連接反向鎖定,則組合SHOW PROCESSLIST和打開的表應縮小范圍,以確切地確定哪個查詢阻止了工作。

老話題。 但是,我剛剛遇到這個問題,因為我每天安排3次mysqldump腳本。 在這些時候,如果我的Web應用程序也獲得了相當多的使用量,那么當mysqldump鎖定數據庫中的所有表時,所有Web應用程序查詢都將自己排在彼此之上。 最好的選擇是在單獨的計算機上設置復制從站,並從從站而不是從生產服務器獲取備份。

可能與MySQL中針對FULLTEXT搜索的這個錯誤有關: http ://bugs.mysql.com/bug.php?id = 37067

在這種情況下,FULLTEXT初始化實際上會掛起MySQL。 不幸的是,似乎沒有解決方案。

在不了解您的實現和PHP的情況下,您確定不會遇到任何延遲數據庫連接的問題嗎? 例如,即使在處理請求后仍保持打開狀態的連接?

在PHP中,當腳本結束或調用mysql_close($conn);時,通常會自動mysql_close($conn); 但如果您使用任何類型的本地連接池,可能會引入問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM