Django Python垃圾收集困境

Tal*_*iss 6 python django garbage-collection

经过2天的调试,我确定了我的时间:Python垃圾收集器.
我的应用程序在内存中保存了很多对象.它运作良好.
GC执行常规轮次(我没有使用默认阈值(700,10,10)).
偶尔,在重要交易的中间,第二代扫描开始并审查我的~1.5M第2代对象.
这需要2秒! 名义交易需要不到0.1秒.

我的问题是我该怎么办?
我可以关闭第2代扫描(通过设置一个非常高的阈值 - 这是正确的方法吗?)并且GC是顺从的.
我该什么时候打开它们?
我们使用Django实现了一个Web服务,每个用户请求大约需要0.1秒.
最理想的是,我将用户API请求之间运行这些GC gen 2循环.但是我该怎么做?
我的观点结束了return HttpResponse(),之后我想进行第二代GC扫描.
我怎么做?这种方法是否有意义?

我可以标记永远不需要进行垃圾收集的对象,这样GC就不会在每个第二代循环中对它们进行测试吗?
当Django服务器相对空闲时,如何配置GC以运行完全扫描?

多平台上的Python 2.6.6(Windows/Linux).

dal*_*ore 6

我们为 gunicorn 做了类似的事情。根据您使用的 wsgi 服务器,您需要在响应之后而不是之前找到正确的钩子。Django 有一个request_finished信号,但该信号仍然是预响应。

对于 gunicorn,在配置中您需要定义 2 个方法,如下所示:

def pre_request(worker, req):
    # disable gc until end of request
    gc.disable()


def post_request(worker, req, environ, resp):
    # enable gc after a request
    gc.enable()
Run Code Online (Sandbox Code Playgroud)

post_request这里运行的HTTP响应已交付后,所以是垃圾收集的好时机。