[英]Django / WSGI - How to profile partial request? My profiling tools are per-request but app runs out of memory before then
[英]How to log memory usage of an Django app per request
您是否了解了根據請求記錄django應用程序內存使用情況的有效方法?
我有一個apache / mod_wsgi / django堆棧,它通常運行良好,但有時一個進程最終會占用大量內存。 服務器最終缺少內存,交換很多,服務大大減慢。
這種情況很難修復,因為我不知道哪個請求會被歸咎於此行為,我無法重現它。
我希望在生產中部署一些內容,在每次請求之前和之后記錄進程的內存使用情況,並且開銷最小。
在我開始重新發明輪子之前,我的同伴們的社區是否知道解決這個問題的任何現有解決方案? 建議,中間件,片段或apache日志配置贊賞。
(我認為)我不需要的是:
我最接近的搜索結果:
用於跟蹤內存使用情況並立即生成可用結果的Django中間件需要掛鈎進程請求和進程響應。 換句話說,查看請求的開始和結束之間的差異,並在超過某個閾值時記錄警告。
一個完整的中間件示例是:
import os
import psutil
import sys
THRESHOLD = 2*1024*1024
class MemoryUsageMiddleware(object):
def process_request(self, request):
request._mem = psutil.Process(os.getpid()).memory_info()
def process_response(self, request, response):
mem = psutil.Process(os.getpid()).memory_info()
diff = mem.rss - request._mem.rss
if diff > THRESHOLD:
print >> sys.stderr, 'MEMORY USAGE %r' % ((diff, request.path),)
return response
這需要安裝'psutil'模塊進行內存計算。
蠻力並且可能導致多線程系統中的誤報。 由於延遲加載,您還會看到它會因為內容加載而觸發針對新進程的前幾個請求。
這可能不完全涵蓋您的問題,但我建議嘗試使用nginx + uwsgi而不是apache2 + mod_wsgi。 在我的測試中,它變得更加穩定(mod_wsgi在某些時候完全被阻塞),速度更快,並且使用更少的內存(它可能只是完全修復你的所有問題)。
關於跟蹤內存使用情況,您可以創建一個簡單的中間件:
class SaveMemoryUsageMiddleware(object):
def process_response(self, request, response):
# track memory usage here and append to file or db
return response
並將其添加到您的中間件。
對於內存跟蹤代碼,我建議檢出: Python進程使用的總內存?
但是,如果你可以避免在生產中這樣做,那可能會更好。 只是為了開發和測試來追蹤真正的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.