2014-05-03 7 views
6

我有一個Ruby on Rails應用程序非常接近彈藥大小限制(300mb)。我已儘可能減小尺寸.slugignore,但沒有得到我想要的結果。Heroku多次部署後的彈頭大小

一時興起,我試着創建一個新的Heroku應用程序並部署了相同的git存儲庫。請看它遠遠低於(只有80mb vs 208mb)。當訪問bash並檢查每臺服務器上的大小時,我注意到服務器之間存在一些差異:

du -hs * 
130M (old) vs 1.4M (new) public 
23M (old) vs 5.3M (new) tmp 
... 

什麼給出了?在Heroku上,用戶希望在足夠的部署通過後銷燬和重新創建應用程序?我瀏覽了公共目錄,並且保留了各種舊的移除資產和垃圾。我怎樣才能清理我的現有應用程序,而不會破壞它並從頭開始?

回答

10

這可能與Rail在部署期間避免問題的嘗試有些相關。目標是避免部署期間的停機和/或錯誤。您的代碼不會立即部署到所有服務器。 Rails解決方案是允許多個版本的資產同時存在。典型的過程是:

%> rake assets:precompile # To build new assets 
%> rake assets:clean  # Remove old assets 

導軌keeps 2 previous versions的資產(默認情況下)。取決於應用程序,您可能需要一段時間的舊資產。例如,如果你有一個繁重的JavaScript應用程序獲取資源一次,然後通過XHR動態更新。運行在客戶端的舊代碼可能會引用其他舊資源。即使是非客戶端的應用程序,您可能會有幾秒鐘的時間,其中一些節點指的是舊資產,一些指的是新資產。

這會解釋一些原因公衆在您的舊應用程序中較大的原因。它基本上有三個版本的所有資產,而你的新部署只有一個版本。這聽起來像是你的構建環境必須搞砸了,因爲即使你的新應用中所有的資產都佔用了1.4MB,那麼這個大小的三倍應該只有5MB左右,而不是舊應用中的130MB。

除了有三個版本的資產之外,tmp目錄中還有一些積累。資產編譯過程在tmp目錄中緩存一些信息。 Rails有一個rake tmp:cache:clear,你可以定期運行,去除那裏的垃圾。

Heroku automatically runs rake assets:clean。所以這應該只保留三個版本的資產。但Heroku實際上並沒有運行rake tmp:cache:clear。相反,他們have some custom code刪除緩存文件,直到緩存的數據低於50MB。我假設他們這樣做是爲了儘可能多地保留緩存信息,同時仍然限制事物。保持儘可能多的緩存數據可能確保資產編譯運行速度很快。這意味着您的tmp目錄將繼續增長,直到達到50MB。

如果您的公共/資產目錄超過3個版本或50MB在您的tmp目錄中增長過多,那麼創建新應用程序是清除問題的好方法。你也可以create a custom slug。在heroku控制檯上運行rake assets:cleanrake tmp:cache:clear將不起作用。這隻會清理測功機上的東西,而不是你的slu。子。因此,當創建新的測功機時,您的清潔工作將會被拋棄。