内存泄漏与Django + Django Rest Framework + mod_wsgi

时间:2016-12-01 11:37:36

标签: django memory-leaks django-rest-framework mod-wsgi guppy

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

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

由于我没有在DEBUG模式下运行,因此排除了DEBUG = True的常见嫌疑。我甚至试图用孔雀鱼来看看发生了什么,但我无法用孔雀鱼做得很远。有人可以请求帮助为什么在请求完成后内存使用率没有下降以及如何调试它?

更新:我正在使用默认的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)

1 个答案:

答案 0 :(得分:3)

虽然我不能肯定地说,但我会将此作为一个答案添加,以便对其进行评判......

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

您可以在上述文档中找到:

  

请注意,每个进程都有自己的私有缓存实例

而且我认为这就是你所看到的。内存中的跳转只是查询的存储。我认为你只需要担心这个内存使用量是否继续超出常态。

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