2015-12-02 63 views
2

我使用apache和puma來部署應用程序。我使用PostgreSQL。 Code on github。我的應用程序很慢。當我在一張桌子上生成幾千行時,生產力開始變差,但仍然可以接受。我仍然可以每秒處理5個請求。當我將一百萬行添加到一個表中時,一個查詢在8秒內執行,並且視圖似乎永遠生成。我添加了索引並且多次寫入原始SQL查詢,但生產力仍然非常低。如何調整Rails應用程序

我在哪裏可以開始優化rails應用程序?我怎樣才能達到每秒至少50個請求?

+3

首先,你需要找出根本原因。數據庫查詢是否緩慢 - 如果您在沒有Rails的情況下直接在數據庫上運行查詢,該怎麼辦?請求是否太多(N + 1個查詢)?你是否將太多的物體加載到內存中? – spickermann

+3

我提出這個問題,因爲你提到它是課程項目:你是否在生產環境中測量?因爲默認的開發環境不是爲了擴展而設計的,而是爲了簡化開發。 – Martijn

+0

所有之前我的評論應遵循也我可以添加一個,你可以使用子彈爲n + 1 http://railscasts.com/episodes/372-bullet?view=asciicast讀這也用於計數器緩存和prod增加緩衝區大小用於pg併發性的maxclient –

回答

4

我建議設置Mini Profiler來嘗試識別瓶頸。特別是看看N+1 problem(考慮使用Bullet如果這個的問題)。

避免遍歷所有的行和實例化一個模型,每一個,從而吸乾內存:

User.all.each do # Bad 
User.find_each do # Better 

使用分頁(看看KaminariWillPaginate),以避免渲染頁面的行數過多。

0

優化之前 - 收集統計信息(例如使用請求日誌分析器gem)並確定哪些請求的平均速度最慢。

例如,您可能需要每週執行一次的8秒請求,以及每秒執行一次0.5秒的請求,以便先優化後者,以便讓應用更快。

對於緩慢的請求 - 只需查看它們的日誌並進一步縮小瓶頸 - db/views /等。

然後,在進入原始SQL查詢,編寫C擴展等之前,先去泛型建議 - 「沒有代碼比沒有代碼運行得更快」。首先查看算法的複雜性,寫得不好的O(n) - 優化的O(n^2),O(1)比O(n)更快

更具體到網絡編程 - 每個查詢任何外部(db/webservices/memcache /等)花費時間,數據也會計數,避免單獨查詢集合中的每個元素,如果您可以一次獲取所有元素或獲取較少數量的請求(由於這個原因,導軌已經急切地加載關聯)

首先,我會研究過量的db查詢,刪除Ë不必要的查詢,並考慮執行計劃(又名explain ..)對於那些仍然

第三件事是垃圾回收,但我不認爲這是你的瓶頸,此刻

相關問題