客戶端網站的管理部分有一個動作,例如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(分析)或類似的解決方案這一功能,但我需要繼續之前解決這個問題。)
您使用InnoDB或MyISAM的存儲引擎是哪個? InnoDB使用行級別的表鎖,當你的大型查詢運行時,它應該允許你的其他查詢仍然工作。 MyISAM使用表級鎖,這似乎是你的查詢發生的事情。你對這個從其他頁面插入的統計表做了一個大的查詢,而這個大的查詢正在運行,其餘的網站將鎖定,直到查詢完成,如果你在MyISAM – 2010-07-30 20:00:16
喬納森, 偉大的領導。我不確定,但是運行「展示引擎」在mysql中顯示MyISAM顯然被設置爲「DEFAULT」,而InnoDB(和其他3個引擎)顯然被支持。你知道如何確定這一點嗎?到目前爲止,我的谷歌搜索幾乎沒有幫助... – 2010-07-30 21:53:33
看看應用程序生成的SQL語句。這可能會讓人大開眼界某些ActiveRecord生成的查詢可能會很糟糕。你可能需要識別一些需要手動操作的東西。 – seand 2010-07-31 18:18:26