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).
我们为 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响应已交付后,所以是垃圾收集的好时机。
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |