我會盡量簡短並且仍然完整。 Thx提前爲那些花費寶貴的時間指出我一個可能的解決方案。LAMP max_connections,睡眠進程,鎖定進程,等待超時,內存不足
在Ubuntu環境下的PHP/Mysql應用程序。
原始發行日期:
Keep getting error 'to_many_connections'.
當我檢查:
show processlist;
有很多睡眠過程。所以我想這些是to_many_connections錯誤的原因,因爲他們阻止任何新的傳入連接。
改變MySQL的設置:
Raise max_connections from 250 to 400;
lower wait_timeout from 60 to 15;
連接似乎工作,但現在我的Apache是內存霸佔。 只需更改這2個設置即可從11G變爲25G以上。 我無法想象150個額外的mysql_connections佔用14G的額外內存? 我也不希望wait_timeout設置較低,以增加apache的內存使用量。它應該在內存中使用較少的內存少連接?我期望過程使用量上升,但不是記憶。當然不是那麼多。
試圖realtering MySQL的設置:
keep max_connections at 400
raise wait_timeout to 30 sec
內存使用率下降,約5分鐘,但之後再次上升。
其他說明:
我注意到有很多鎖定過程一定 表。 (mysql:show processlist;) 更新:表是MyISSAM表。
我也改變了一些數據庫實現,這並不理想,有些頁面使用2個連接到數據庫,因爲我們正在經歷一個代碼重構階段。 從功能的mysql_query切換到PDO功能
更新:
新PDO功能已專門設置爲false(即使它默認爲false) 舊版本的MySQL功能不使用持久連接持久連接無論是。
public function __construct($dbname, $username, $password) { parent::__construct('mysql:hostname=localhost;dbname=' . $dbname . ';', $username, $password, array( PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;" )); }
我很清楚地知道,使該數據庫中的幾個連接遠非最佳實踐,但我們目前的應用程序丟失的設計模式了很多,一切仍是程序性的,沒有MVC,沒有OOP 。 我有責任做這些實踐,因爲我的僱主想要結果,並且此時並沒有打算對我們的應用程序進行完全重寫,以使用應該早已實施LOONG的設計/編碼標準。 無論如何我會很驚訝,如果這個代碼將是真正的原因,因爲它已經運行完美了一個多星期,並且由於討價還價的期限(在1個月的巨大的一個月的巨大訪問量在我們的商店討價還價/優惠)。
任何有關此事的見解將不勝感激。至於這一點,我不知道下一步可能會解決這個問題。
update2 已關閉,因爲已發現該問題,但與原始帖子無關。
我不是一個服務器專家,但我知道我已經安裝服務器緩存前一段時間。但我不認爲這與連接問題有什麼關係?緩存不足意味着頁面加載速度較慢。但我沒有加載頁面,因爲我無法連接到數據庫。還更新了原始主題以更好地指定信息。 – Bodybag
upvoted for nice info。雖然顯然這個問題是由同事僱員實施的一些代碼造成的(最初的高峯期,與數據庫連接無關)。仍然需要找出實際泄漏/錯誤,但至少找到了原因。感謝您花時間閱讀我的問題! – Bodybag
不客氣,雖然我不得不承認自己已經被騙了,並且把它從頭頂拉了下來;) – CodeMonkey