2009-07-07 73 views
1

權人,MySQL的防止雙重負荷

我有一個MySQL數據庫,使用的是InnoDB表上,每隔一段時間我必須進行大的cron作業,做了大批量查詢和插入的。當我運行這個cron作業時,5分鐘左右它正在運行,沒有其他頁面可以加載。一旦完成,查詢就會執行並加載頁面。

實際上已將所有這些數據添加到其中的表甚至沒有被主站點查詢。簡而言之,當MySQL處於大量工作中時,網站的其他部分是不可接觸的。這肯定是不對的,可能會導致這種情況發生? MySQLD火箭的CPU使用率達到120%(!!!!!)等巨大數字,並且所有MySQL查詢都被鎖定。

什麼可能導致/解決這個問題?

+0

myslqd是多線程的,所以如果你有多個核心的話,可以輕鬆超過100%。例如,對於8核機器,120%聽起來不是很大。 – Javier 2009-07-07 17:13:35

+0

我從來不知道,非常感謝。 – James 2009-07-08 01:41:31

回答

0

您可以讓腳本在每個查詢之間延遲1/10秒左右。這將需要更長的時間,但允許在後臺進行活動。

sleep(0.1); 

您可能只需要爲寫操作完成此操作,讀取操作非常便宜。

1

不,這顯然是錯誤的。這可能與配置錯誤有關。看一下innodb緩衝池的大小,看看它是否可以增加。這聽起來像是一場典型的公羊短缺案例。健康的設置幾乎不受CPU限制,當然不是在進行批量插入時。

1

有了InnoDB,其他的東西仍然應該可以訪問數據庫。你準備展示架構(或其相關部分)和應用程序的相關部分嗎?

也許是硬件爭用。

您的「cron」工作正在使用的交易有多大?使用小事務將無用地創建大量的IO。

你的數據庫服務器是否有電池供電的RAID控制器(假設你的服務器使用硬盤而不是SSD)?否則,提交將非常緩慢。

你的數據庫服務器有多少ram?如果可能的話,確保它比你的數據庫大一點,並將innodb_buffer_pool設置爲>數據大小 - 這意味着讀取的工作負載無論如何都來自ram,這應該使它們更快。

您可以在生產級硬件的測試系統中重現問題嗎?

1

我想你可能需要重新考慮你是如何構建你的查詢的。 InnoDB具有頁面級鎖定,但有了大量更新,您仍然可以鎖定相當多的查詢。

發佈您的實際查詢,然後重試..我不認爲有像這樣的通用問題的通用解決方案,因此請研究優化今天的工作。