2012-11-22 78 views
0

我嘗試了一段時間來檢測cherrypy的內存問題。任何網頁調用功能使用的內存,當我運行這個命令:cherrypy/apache服務器在函數調用結束後不釋放內存

ps -u djotjog -o pid,rss,command | awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}' 

似乎永久用完。我試圖在退出之前'刪除'函數中的每個對象。沒有效果。我想知道我的類實例是否存在大量數據 - 可能是問題所在。我使用類似:

class Data: 
    pass 
ref_data = Data() 

... do stuff... make a stories_dict ... 

ref_data.stories = stories_dict #dictionary 'id':'story' pairs 
del stories_dict 

最後,我看到每個350MB我運行網絡通話時間仍在使用,並且它達到500MB後,它似乎產生另一個CherryPy的實例!

PID RSS COMMAND 
10492 960 ps -u globamh1 -o pid,rss,command 
10493 784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
29833 1708 -bash 
Total 3.37109 MB 

後...

PID RSS COMMAND 
12811 1164 /bin/sh cherryd.fcgi 
12817 293788 /home4/globamh1/python-2.7.2/bin/python2.7  /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
13195 984 ps -u globamh1 -o pid,rss,command 
13196 16 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
29833 1708 -bash 
Total 308 MB 

後來還是...

PID RSS COMMAND 
4053 5216 /home/globamh1/python-2.7.2/bin/python /home/globamh1/python- 2.7.2/ngo_prompter_2.py 
4091 988 ps -u globamh1 -o pid,rss,command 
4092 784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
12817 1111616 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
29833 1716 -bash 
32413 1168 /bin/sh cherryd.fcgi 
32414 576792 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
Total 1658.48 MB 

所以來包裝這個成一些具體的問題:

  • 如何迅速應Python的垃圾收集器工作?
  • cherrypy或apache做些奇怪的事情來保持數據的持久性?
  • 如何使用cherrypy來響應多個請求?我已經看到它忽略了一些請求。
  • 這是服務器配置問題嗎?

這是同樣的問題嗎? Memory not released by python cherrypy application on linux

如果是,我該如何在共享託管站點上配置該解決方案?

回答

1

從您顯示的示例代碼中,很少收集到。特別是:

ref_data.stories = stories_dict 

這使得ref_data.stories和stories_dict都引用相同的大數據集。即使你刪除stories_dict,因爲ref_data.stories仍然是相同的字典的參考,它不會被垃圾收集,直到ref_data.stories被刪除(或ref_data被刪除):

del ref_data.stories # remove the attribute 
del ref_data # delete the instance and all of its attributes 

否則,只當stories_dict被刪除時留下來被垃圾收集的東西是指向該字典的指針(可能只有幾個字節)。

python的垃圾收集器應該多快?

我不確定是否有保證,但以我的經驗,當任何對象被del ed或函數退出時立即運行垃圾收集器。

cherrypy或apache做一些奇怪的事情來保持數據的持久性?

我懷疑沒有。如果直接從解釋器運行相同的例程,您是否看不到這種行爲?

如何讓cherrypy響應多個請求,如果它使用如此多的內存?我已經看到它忽略了一些請求。 這是服務器配置問題嗎?

如果您的應用程序從根本上使用的內存多於系統在並行處理請求時可用的內存,則需要找到一些方法來跨請求同步響應。另一種選擇是將apache/cherrypy配置爲一次只能提供一個請求。我相信這是WSGI配置的一部分(分配多少個進程/線程)。如果將進程/線程的數量限制爲1,那麼CherryPy一次只能提供一個請求。

+0

從服務器bash命令行 - 運行python [filename] .py時沒有任何內容持續存在...刪除ref_data對持久內存使用情況沒有任何影響。 –

+0

我將內存問題縮小到涉及mysqldb的內容 - 並在此處發佈了更簡潔的說明:http://stackoverflow.com/questions/13612050/mysqldb-usage-in-cherrpy-app-leads-to-massive-服務器上的持久性內存使用情況 –

+0

有沒有一種系統的方式來查看程序結束時內存中所有數據對象的列表及其大小,以便我可以找出持久數據使用的來源?可能是因爲cherrypy停留在內存中而留在內存中。 –

相關問題