簡體   English   中英

rails和phusion乘客的內存泄漏問題

[英]memory leak issue in rails and phusion passenger

rails網站運行速度很慢,我不得不重新啟動操作系統,但是在重新啟動ubuntu后僅1小時,系統再次出現了令人難以置信的緩慢,所以我檢查了乘客內存統計信息:

------ Passenger processes ------
PID    VMSize     Private   Name
---------------------------------
1076   215.8 MB   0.3 MB    PassengerWatchdog
1085   2022.3 MB  4.4 MB    PassengerHelperAgent
1089   109.4 MB   6.4 MB    Passenger spawn server
1093   159.2 MB   0.8 MB    PassengerLoggingAgent
1883   398.1 MB   110.1 MB  Rack: /home/guarddog/public_html/guarddog.com/current
1906   1174.6 MB  885.9 MB  Rack: /home/guarddog/public_html/guarddog.com/current
3648   370.1 MB   131.9 MB  Rack: /home/guarddog/public_html/guarddog.com/current
14830  370.6 MB   83.0 MB   Rack: /home/guarddog/public_html/guarddog.com/current
15124  401.2 MB   113.9 MB  Rack: /home/guarddog/public_html/guarddog.com/current
15239  413.5 MB   127.7 MB  Rack: /home/guarddog/public_html/guarddog.com/current
15277  400.5 MB   113.6 MB  Rack: /home/guarddog/public_html/guarddog.com/current
15285  357.1 MB   70.1 MB   Rack: /home/guarddog/public_html/guarddog.com/current
### Processes: 12
### Total private dirty RSS: 1648.10 MB

令人難以置信的是,當一次使用總量減少到100 MB時,一個機架進程在重新啟動操作系統一小時后使用了885.9 MB的私有臟RSS內存。 現在一小時后,它的速度為1648.10 mb。 網站速度太慢,頁面甚至無法加載。

我認為這是一個內存泄漏所以我在整個應用程序中添加了這行代碼:

puts "Object count: #{ObjectSpace.count_objects}"  

但我不知道如何解釋它給我的數據:

Object count: {:TOTAL=>2379635, :FREE=>318247, :T_OBJECT=>35074, :T_CLASS=>6707, :T_MODULE=>1760, :T_FLOAT=>174, :T_STRING=>1777046, :T_REGEXP=>2821, :T_ARRAY=>75160, :T_HASH=>64227, :T_STRUCT=>774, :T_BIGNUM=>7, :T_FILE=>7, :T_DATA=>55075, :T_MATCH=>10, :T_COMPLEX=>1, :T_RATIONAL=>63, :T_NODE=>37652, :T_ICLASS=>4830}

注意我只在我的本地計算機上運行ObjectSpace.count_objects,因為我的ubuntu服務器太慢,甚至無法加載頁面。

以下是其他一些操作系統統計信息:

$ cat /proc/meminfo                                                        
MemTotal:        6113156 kB
MemFree:         3027204 kB
Buffers:          103540 kB
Cached:           261544 kB
SwapCached:            0 kB
Active:          2641168 kB
Inactive:         248316 kB
Active(anon):    2524652 kB
Inactive(anon):      328 kB
Active(file):     116516 kB
Inactive(file):   247988 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       6287356 kB
SwapFree:        6287356 kB
Dirty:                36 kB
Writeback:             0 kB
AnonPages:       2524444 kB
Mapped:            30108 kB
Shmem:               568 kB
Slab:              77268 kB
SReclaimable:      48528 kB
SUnreclaim:        28740 kB
KernelStack:        4648 kB
PageTables:        43044 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     9343932 kB
Committed_AS:    5179468 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      293056 kB
VmallocChunk:   34359442172 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       46848 kB
DirectMap2M:     5195776 kB

df
Filesystem                  1K-blocks     Used Available Use% Mounted on
/dev/mapper/roadrunner-root 134821120 22277596 105695012  18% /
udev                          3047064        4   3047060   1% /dev
tmpfs                         1222632      252   1222380   1% /run
none                             5120        0      5120   0% /run/lock
none                          3056576       88   3056488   1% /run/shm
none                           102400        0    102400   0% /run/user
/dev/sda1                      233191    29079    191671  14% /boot

另外,如果我運行“kill -9 1906”來殺死那個占用大量內存的機架進程,那會有幫助嗎?

  1. 首先,熱點解決眼前的生產問題,實施看門狗 - http://dev.mensfeld.pl/2012/08/simple-rubyrails-passenger-memory-consumption-limit-monitoring/然后尋找泄漏,或臃腫( https://blog.engineyard.com/2009/thats-not-a-memory-leak-its-bloat
  2. 你展示的那個過程看起來像一個普通的工人,試着在受控條件下殺死違規的過程,看看會發生什么,可能沒什么不好。
  3. 看看你是否可以將這種情況與某個(通常是長時間運行的)控制器操作相關聯,或者apache重新啟動/重新加載(定期出現此問題,20個進程中的1個在重啟后變為瘋狂)。
  4. 擴展rails日志,使它們包含PID(例如https://gist.github.com/krutten/1091611 )並創建一個簡單的腳本,每隔一分鍾就將內存使用轉儲到一個文件中(確保你沒有填滿你的磁盤) - 這將使您能夠確切地知道進程何時開始膨脹,然后在日志中跟蹤它之前發生的事情/因為這發生了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM