2010-03-09 40 views
44

我想問一個關於php/mysql連接長期問題的幫助。MySql Proccesslist中充滿了導致「連接太多」的「睡眠」條目?

每次執行「SHOW PROCESSLIST」命令時,它都會向我顯示從我們的5個Web服務器出現的數據庫服務器的大約400個閒置(狀態:睡眠)連接。

從來沒有太多的問題(我沒有找到一個快速的解決方案),直到最近流量數量增加,從那以後,MySQL反覆報告「到多個連接」問題,即使這些連接超過350個「睡眠」狀態。即使有到同一臺服務器的睡眠連接,服務器也無法獲得MySQL連接。

當apache服務器重新啓動時,所有這些連接都會消失。

用於創建數據庫連接的PHP代碼使用普通的「mysql」模塊,「mysqli」模塊,PEAR :: DB和Zend Framework Db Adapter。 (不同的項目)。沒有任何項目使用持續連接。

提高連接限制是可能的,但似乎不是一個好的解決方案,因爲現在是450,而且每次只有20-100個「真實」連接。

我的問題:

爲什麼有這麼多的連接處於休眠狀態,我該如何預防呢?

- 更新:

同時運行Apache的請求數不超過50個的併發請求,所以我想有一個問題,關閉連接或Apache保持端口開放沒有附加phpscript什麼(?)

my.cnf中的情況下,這是有幫助的:

innodb_buffer_pool_size = 1024M 

max_allowed_packet = 5M 
net_buffer_length = 8K 

read_buffer_size = 2M 
read_rnd_buffer_size = 8M 

query_cache_size = 512M 
myisam_sort_buffer_size = 128M 

max_connections = 450 
thread_cache = 50 
key_buffer_size = 1280M 
join_buffer_size = 16M 

table_cache = 2048 
sort_buffer_size = 64M 
tmp_table_size = 512M 
max_heap_table_size = 512M 

thread_concurrency = 8 

log-slow-queries = /daten/mysql-log/slow-log 
long_query_time = 1 
log_queries_not_using_indexes 

innodb_additional_mem_pool_size = 64M 
innodb_log_file_size = 64M 
innodb_log_buffer_size = 8M 
innodb_flush_log_at_trx_commit = 2 
innodb_file_per_table 

回答

50

基本上,你在睡眠狀態下連接時:

  • 一個PHP腳本連接到MySQL
  • 某些查詢執行
  • 然後,PHP腳本做一些事情,需要時間
    • 沒有從DB
  • 和斷開,最後, PHP腳本結束
    • 這意味着它從MySQL服務器斷開連接

所以,你通常最終在睡眠狀態的許多過程,當你有很多是保持連接PHP程序的,實際上並沒有這樣做對數據庫方面的東西。

一個基本的想法是,確保你沒有運行時間過長的PHP進程 - 或者一旦他們不再需要訪問數據庫就迫使它們斷開連接。


另一件事,我經常看到當在服務器上的一些負載:

  • 有越來越多的要求來阿帕奇
    • 這意味着許多網頁生成
  • 每個PHP腳本,爲了生成頁面,連接到數據庫並執行一些查詢
  • 這些查詢花費的時間越來越多,因爲在DB服務器增加
  • 這意味着更多的處理負荷不斷疊加起來

一個解決方案,可以幫助就是減少你的查詢需要的時間 - 優化最長的。

+0

非常感謝評論!然而,問題在於,即使所有的網絡服務器組合在一起,也無法運行近400個請求。在創建連接的請求完成後,「睡眠」狀態繼續。例如。在每秒不超過1次綜合瀏覽量的午夜,問題也會出現。 – edorian 2010-03-09 12:04:41

+3

這很奇怪......哦,也許是一個想法:你使用永久連接? (例如,使用'mysql_pconnect'函數) – 2010-03-09 12:10:01

+0

不,我們對此進行了詳細檢查並殺死了所有甚至可能使用「* pconnect *」或類似內容的代碼。 – edorian 2010-03-09 12:35:25

-1

好的,所以在嘗試了所有解決方案以解決WordPress博客上的這些確切問題之後,我可能做了一些非常愚蠢的事情或天才......不知道爲什麼Mysql連接有所增加,我使用了php下面的腳本在我的頭,殺死所有睡眠過程..

所以每一位遊客到我的網站可以幫助殺死熟睡的過程..

<?php 
$result = mysql_query("SHOW processlist"); 
while ($myrow = mysql_fetch_assoc($result)) { 
if ($myrow['Command'] == "Sleep") { 
mysql_query("KILL {$myrow['Id']}");} 
} 
?> 
+5

這是一個糟糕的主意 - 你怎麼知道php腳本已經完成了使用mysql連接?它可能做了一個查詢,進入睡眠做一些PHP,然後需要其他查詢 – 2015-09-09 09:23:13

+0

你測試過嗎?因爲它不是插件那麼wordpress不需要任何睡眠過程......測試它並讓我知道。 – 2015-09-18 12:51:30

+2

Shell版本:'mysql -e「顯示完整進程列表;」 -ss | grep睡眠| awk'{print「KILL」$ 1「;」}'| mysql' – 2016-06-01 17:44:18

0

所以我simulatenously運行300個PHP程序,並得到一個速度每秒60-90(我的過程涉及3x查詢)。我把它提高到了400,並且每秒鐘下降到了40-50。我把它降到了200,並回到了60到90之間!

所以我對任何人有這個問題的建議是試驗運行比更多,看看它是否有所改善。將使用更少的內存和CPU,因此運行的進程將具有更大的能力,並且速度可能會提高。