[英]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應用程序查詢都將自己排在彼此之上。 最好的選擇是在單獨的計算機上設置復制從站,並從從站而不是從生產服務器獲取備份。
在不了解您的實現和PHP的情況下,您確定不會遇到任何延遲數據庫連接的問題嗎? 例如,即使在處理請求后仍保持打開狀態的連接?
在PHP中,當腳本結束或調用mysql_close($conn);
時,通常會自動mysql_close($conn);
但如果您使用任何類型的本地連接池,可能會引入問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.