4

從Ruby 1.8.6升級到Ruby Enterprise 1.8.7 p334時,內存大小几乎翻了一番。這發生在我們升級的五臺Fedora 8服務器的每一臺中。我們使用Passenger 3.0.4運行Rails 1.2.6。轉換爲Ruby Enterprise 1.8.7後內存大小增加

Munin通過總結$ ps axo pid,comm,pmem,vsz,rsz中的vsz和rsz列來獲取每個進程的內存大小。 (虛擬內存大小和駐留內存大小都增加了相同的數量)

我意識到這些列通常會誇大進程實際使用的內存量,但是如果這用於測量1.8.6和1.8。 7稀土元素,他們應該同樣臃腫,因此仍然可以比較。

此外,機器的承諾內存(如/ proc/memstat中列出)現在經常過量使用,這是新增功能。承諾內存的數量顯着增加,看起來我們現在進入交換空間。

我們還沒有調整垃圾收集,但我看不出如何影響整體內存佔用。

我已經打開GC.copy_on_write_friendly變量,如Phusion常見問題解答推薦的那樣。

這是100%增加內存使用情況的解釋,我該如何解決?任何想法如何解決,甚至更好的監測/調試,讚賞。

謝謝。

--- UPDATE

爲了檢查性能,我已經從12中的一個服務器上運行的降低實例(PassengerMaxPoolSize)的數量爲10。另一方面,我已將PassengerPoolIdleTime提升至15分鐘。我有三分之一被用作控制。

我正在考慮在服務器上放置非企業版本1.8.7p334以查看它是否爲1.8.7或企業版。

其他人對此類問題有任何經驗?正如乘客內存統計所表明的那樣,縱觀單個Rails進程,它們在1.8.6中每個進程大約120MB,在REE 1.8.7中大小爲175MB /進程。

---更新2

我把MRI 1.8.7在服務器上進行比較,以REE 1.8.7。結果更糟糕,包括更高的記憶居民人數和乘客記憶狀態。當然,交換開始了。

這讓我相信1.8.7的佔地面積大於1.8.6。

---更新3

我把MRI 1.8.7的服務器上,它是MRI 1.8.6在內存使用方面是差多了,所以我馬上就回MRI 1.86。

我已經運行了平均Rails進程大小,如乘客內存統計所列。 REE 1.8.7過程大73 MB,看起來相當大。

這意味着我需要運行的進程少得多以適應相同的內存佔用空間。

將看到他們如何用更少的進程執行操作。我也開始GC調整。

--- UPDATE 4

似乎紅寶石1.8.7不支持的Rails 1.2.6。第一個正式支持的1.8.7版本是Rails 2.1。升級後我們會知道這是問題的根源。

+0

您是否也在查看[passenger-memory-stats]的輸出(http://www.modrails.com/documentation/Users%20guide%20Apache.html#_inspecting_memory_usage)? – nickgrim 2011-03-09 21:36:29

+0

是的。乘客記憶統計也有所增加,儘管不太顯着。減少PassengerMaxPoolSize和PassengerPoolIdleTime都有助於減少乘客記憶狀態的記憶。居民的記憶也輕微下降,但沒有足夠顯着。 – trimbletodd 2011-03-10 14:00:02

+0

您是否檢查過以確保您現在沒有運行64位版本的Ruby? – 2011-03-21 21:42:54

回答

3

您從一個32位版本的Ruby轉到64位版本的Ruby。這增加了指針的大小,其中運行時有很多指針。