我想問一個關於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
非常感謝評論!然而,問題在於,即使所有的網絡服務器組合在一起,也無法運行近400個請求。在創建連接的請求完成後,「睡眠」狀態繼續。例如。在每秒不超過1次綜合瀏覽量的午夜,問題也會出現。 – edorian 2010-03-09 12:04:41
這很奇怪......哦,也許是一個想法:你使用永久連接? (例如,使用'mysql_pconnect'函數) – 2010-03-09 12:10:01
不,我們對此進行了詳細檢查並殺死了所有甚至可能使用「* pconnect *」或類似內容的代碼。 – edorian 2010-03-09 12:35:25