2010-07-30 36 views
1

客戶端網站的管理部分有一個動作,例如Admin :: Analytics(我沒有構建但必須維護),它通過執行幾十個相當密集的數據庫查詢來編譯網站使用情況分析。無論何時編譯分析報告,此功能一直是應用程序性能的瓶頸。但是,最近這個瓶頸變得非常糟糕,以至於當訪問時,站點會停下來並且無限期地掛起。直到昨天,我從來沒有理由在服務器上運行「top」命令,但是這樣做後,我意識到Admin :: Analytics#索引會導致mysqld在四核上高於350 +%的CPU功率,生產VPS。如何基準和優化真正的數據庫密集型Rails操作?

我已下載生產數據和生產日誌的新副本。但是,當我在開發框中本地訪問Admin :: Analytics#索引時,使用生產數據時,它會在大約10 - 12秒內加載(並使用我的雙核CPU的〜150 +%),這很不正常。我猜想可能會在突然出現的mysql設置中出現差異。此外,數據庫的mysqldump現在是531 MB,而28天前它只有336 MB。無論如何,我在VPS上沒有root訪問權限,因此調整mysqld的性能會很麻煩,而且我真的很想知道這個問題的確切原因。但是,生產日誌不包含信息。在查詢上;他們只是報告了這些請求所花費的時間長度,平均每個分鐘需要幾分鐘(儘管它們似乎導致mysqld拖延了很長的時間,並促使我要求我們的主機重新啓動mysqld,以便讓我們的站點備份在一個例子中)。

我想我可以嘗試提高生產中的日誌級別以徵求信息。關於由Admin :: Analytics#index執行的數據庫查詢,但同時我害怕在生產中複製此行爲,因爲我不想調用我們的主機重新啓動mysqld!此操作在其控制器中包含單個數據庫請求,並在其視圖中嵌入了幾十條準備好的語句!

您將如何進行基準測試/診斷和優化/修復此操作?

(題外話:很顯然,我想完全取代與谷歌Analytics(分析)或類似的解決方案這一功能,但我需要繼續之前解決這個問題。)

+1

您使用InnoDB或MyISAM的存儲引擎是哪個? InnoDB使用行級別的表鎖,當你的大型查詢運行時,它應該允許你的其他查詢仍然工作。 MyISAM使用表級鎖,這似乎是你的查詢發生的事情。你對這個從其他頁面插入的統計表做了一個大的查詢,而這個大的查詢正在運行,其餘的網站將鎖定,直到查詢完成,如果你在MyISAM – 2010-07-30 20:00:16

+0

喬納森, 偉大的領導。我不確定,但是運行「展示引擎」在mysql中顯示MyISAM顯然被設置爲「DEFAULT」,而InnoDB(和其他3個引擎)顯然被支持。你知道如何確定這一點嗎?到目前爲止,我的谷歌搜索幾乎沒有幫助... – 2010-07-30 21:53:33

+0

看看應用程序生成的SQL語句。這可能會讓人大開眼界某些ActiveRecord生成的查詢可能會很糟糕。你可能需要識別一些需要手動操作的東西。 – seand 2010-07-31 18:18:26

回答

0

我非常感謝所有的幫助,但最終解決的辦法是在Analytics表上實現幾個索引以迎合此操作中的查詢。一個簡單的Rails遷移來添加索引和動作現在可以在我的開發盒和產品上不到一秒鐘加載!

+0

我仍然會推薦我在建築/比例上提出的文章。 query_reviewer插件非常適合幫助您找到缺失的索引並正確實施它們。我知道你的問題已經解決,但我想在這裏爲任何可能尋求幫助的人添加這個 – Ryan 2010-08-30 20:17:57