1

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

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

通常怀疑 DEBUG=True 被排除,因为我没有在 DEBUG 模式下运行。我什至尝试使用 guppy 来查看发生了什么,但我无法使用 guppy。有人可以帮忙为什么请求完成后内存使用量没有下降以及如何调试它?

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

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)
4

1 回答 1

3

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

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

在上述文档中,您会发现:

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

我认为这就是你所看到的。内存中的跳转只是您的查询的存储。我认为您只需要担心这种内存使用量是否继续增长超出正常水平。

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

于 2016-12-01T12:05:51.477 回答