gpt4 book ai didi

django - Django + Django Rest Framework + mod_wsgi 内存泄漏

转载 作者:行者123 更新时间:2023-12-05 04:12:18 26 4
gpt4 key购买 nike

我有以下代码,其中我有一个基于函数的 View ,它使用 ModelSerializer 来序列化数据。我用 apache + mod_wsgi 运行它(为了简单起见,有 1 个工作线程、1 个子线程和 1 个 mod_wsgi 线程)。

有了这个,我的内存使用量显着增加(200M - 1G,具体取决于查询的大小)并保持在那里,甚至在请求完成时也不会下降。在对同一 View /url 的后续请求中,内存每次都会略有增加,但不会有明显的跳跃。为了排除 django-filter 的问题,我修改了我的 View 并自己编写了过滤查询。

通常怀疑 DEBUG=True 已被排除,因为我没有在 DEBUG 模式下运行。我什至尝试使用 guppy 来查看发生了什么,但我无法与 guppy 走得更远。有人能帮忙解释为什么请求完成后内存使用率没有下降,以及如何进行调试吗?

更新:我正在使用默认的 CACHE 设置,即我根本没有定义它,在这种情况下,我假设它将使用本地内存作为文档中提到的缓存。

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}



class MeterData(models.Model):
meter = models.ForeignKey(Meter)
datetime = models.DateTimeField()

# Active Power Total
w_total = models.DecimalField(max_digits=13, decimal_places=2,
null=True)
...


class MeterDataSerializer(serializers.ModelSerializer):
class Meta:
model = MeterData
exclude = ('meter', )


@api_view(['GET', ])
@permission_classes((AllowAny,))
def test(request):
startDate = request.GET.get('startDate', None)
endDate = request.GET.get('endDate', None)
meter_pk = request.GET.get('meter', None)
# Writing query ourself instead of using django-filter to
# to keep things simple.
queryset = MeterData.objects.filter(meter__pk=meter_pk,
datetime__gte=startDate,
datetime__lte=endDate)


logger.info(queryset.query)
kwargs = {}
kwargs['context'] = {
'request': request,
'view': test,
'format': 'format',
}
kwargs['many'] = True

serializer = MeterDataSerializer(queryset, **kwargs)
return Response(serializer.data)

最佳答案

虽然我不能肯定地说,但无论如何我都会将其添加为答案以供判断...

如您所知,django 的默认缓存是LocMemCache

您会在上述文档中找到:

Note that each process will have its own private cache instance

我认为这就是您所看到的。内存中的跳跃只是您查询的存储。我认为您只需要担心这种内存使用量是否继续超出正常范围。

同一个文档还说它在生产中可能不太可行,所以可能是时候超越这个了,这也可以让你看看缓存是否是罪魁祸首。

关于django - Django + Django Rest Framework + mod_wsgi 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com