2011-08-18 20 views
6

我在mysqld進程中有很高的CPU峯值(大於100%,甚至在一個點上看到了300%)。我的平均負載是:.25,.34,.28。MySQL高CPU使用率和持久鏈接

我讀到這個問題這個偉大的職位:MySQL high CPU usage

一個主要的事情做的是禁用持久連接。所以我檢查了我的php.ini和mysql.allow_persistent = onmysql.max_persistent = -1 - 這意味着沒有限制。

這就提出任何更改只是要確定之前,我幾個問題:

  1. 如果我的mysqld進程中扣球超過100%,每兩秒鐘不應該我的負荷平均是高於他們是誰?
  2. 什麼將禁用永久鏈接 - 我的腳本將繼續按原樣運行?
  3. 如果我關閉並重新加載php,這對我的當前用戶意味着什麼,因爲會有很多活動用戶。

編輯:

CPU信息:Core2Quad Q9400 2.6GHz的

回答

8

持久連接本身不會使用任何CPU - 如果沒有使用連接,它只是處於空閒狀態,只佔用一點內存並佔用一個套接字。

加載平均數就是 - 平均值。如果你有一個每秒鐘在0%和100%之間交替的過程,你會得到0.5的平均載荷。它們對於計算長期持續高CPU的性能很有好處,但由於其本性隱藏/消除了尖峯的跡象。

通常不需要與mysql保持連接。 MySQL具有相對較快的連接協議,並且使用持久連接節省的時間非常少。缺點是一旦連接持續,它可能會處於不一致的狀態。例如如果使用連接的應用程序意外死亡,MySQL將無法看到並開始清理。這意味着應用程序創建的任何服務器端變量,任何鎖,任何事務等等都將保持它們在應用程序崩潰時的狀態。

當連接被另一個應用程序重新使用時,您將首先看到水槽中的髒盤子和未刷新的廁所。由於懸掛的交易/鎖定,它很容易造成死鎖 - 新應用程序不會知道它們,而舊應用程序不再放棄這些鎖定。

+0

感謝廁所比喻:)所以在我的PHP持久鏈接選項。ini很好,但不要使用mysql_pconnect - 知道了。 – bMon

+0

在什麼時候(數字)應該開始擔心負載平均值?超過1.0,5.0,20.0? – bMon

+2

持久連接沒有問題,只要你有適當的「zomg我只是裝了我的褲子」的錯誤處理,以防萬一你的腳本 - 如果腳本死了,然後發出一個關閉連接,所以MySQL可以清理。 –

0

尖峯是罰款。這是MySQL的工作。你的平均負載似乎是合適的

禁用持久鏈接僅僅意味着腳本不能使用到數據庫的現有連接。我不會建議禁用此功能。至少,如果你想禁用它們,稍後在應用程序上執行它,而不是在MySQL上。這可能會稍微增加負載,具體取決於條件。

最後,DB持久性與您網站上的用戶(通常)無關。用戶發出請求,一旦加載完所有頁面資源,就是這樣,直到下一個請求。 (除少數特定情況外)。無論如何,在請求發生時,腳本仍將連接到數據庫。