簡體   English   中英

如何根據請求記錄Django應用程序的內存使用情況

[英]How to log memory usage of an Django app per request

您是否了解了根據請求記錄django應用程序內存使用情況的有效方法?

我有一個apache / mod_wsgi / django堆棧,它通常運行良好,但有時一個進程最終會占用大量內存。 服務器最終缺少內存,交換很多,服務大大減慢。

這種情況很難修復,因為我不知道哪個請求會被歸咎於此行為,我無法重現它。

我希望在生產中部署一些內容,在每次請求之前和之后記錄進程的內存使用情況,並且開銷最小。


在我開始重新發明輪子之前,我的同伴們的社區是否知道解決這個問題的任何現有解決方案? 建議,中間件,片段或apache日志配置贊賞。

(我認為)我不需要的是:

  • 一組dev-stage分析/調試工具,我已經知道了一些,如果我知道要分析/調試什么,我會使用它們,看起來有點太多,無法永遠監視生產中運行的服務。 最重要的是,那些tol通常顯示的是代碼碎片的內存使用情況報告,只是查明錯誤的請求真的很有幫助。
  • 關於如何優化django應用程序的mem使用的通用建議,總是很好閱讀,但這里的想法是“如何有效地追蹤需要優化的請求”。

我最接近的搜索結果:

用於跟蹤內存使用情況並立即生成可用結果的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.

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