Apache 和 MySql 数据库与 Django 的内存消耗问题

Apache 和 MySql 数据库与 Django 的内存消耗问题

我正在编写一个相对简单的 Web 应用程序作为学习项目,以在实践中学习 Django、Apache、Mysql 等。它由一个 Web Flash/HTML5 客户端组成,每秒对 Django Rest-Framework API 进行两次 API 调用。一个获取对象的状态,另一个增加 Django 模型中的计数器。除此之外,我还有一个 Celery 任务,它每秒执行修改其中一个模型的代码。

在我的 VPS 上,我设置了一个在 Apache 上运行的 Django,以 MySql 作为数据库。在我启动所有相关进程并且客户端开始发出请求后,内存使用量急剧上升,很快达到 512Mb,这是我的 VPS 的限制,Apache/MySql 崩溃了。目前,三个同时运行的客户端足以导致崩溃,这是不可接受的。

我今天做了一些研究,并尝试使用这个http://wiki.vpslink.com/Low_memory_MySQL_/_Apache_configurations和这个https://serverfault.com/questions/21106/how-to-reduce-memory-usage-on-a-unix-webserver作为限制我服务器的 MPM 设置的指南。我将值从默认值改为后一个链接中的值,但没有明显效果。我还尝试了 skip-innodb 技巧,但将其添加到我的 mysql conf 后,我根本无法启动我的 mysql 服务器。

作为一个初学者,我现在有点不知所措,因为我对 Apache 配置还不太了解。因此我想问一下我现在应该怎么做,以及考虑到我的技术堆栈,我应该做哪些配置?

最后,这是我当前的 Apache 配置:http://pastebin.com/0agashnT 由于我总有可能在 Django 代码中犯一些愚蠢的错误,因此这里是在客户端访问 API 和执行 Celery 任务时调用的相关代码片段:

芹菜任务:

    @periodic_task(run_every=timedelta(seconds=1))
def update_RocketModel():
    pushmodel = PushModel.objects.get()  #get amount of the latest pushes
    rocket = Rocket.objects.get()
    rocket.pushes = pushmodel.amount
    rocket.velocity += (pushmodel.force / rocket.mass) / 1000.0    #F=ma, m/s to km/s
    logger.debug("Velocity boost: result = %i" % ((pushmodel.force / rocket.mass) / 1000.0))

    rocket.distanceTraveled = rocket.distanceTraveled + rocket.velocity
    rocket.distanceFromSun = rocket.distanceFromSun + rocket.velocity

    #calculate ETA to the target
    try:
        target = CelestialObjectModel.objects.get(name=rocket.nextDestination)
        dist = target.distanceFromSun - rocket.distanceFromSun   #distance to the target
        rocket.estimatedTravelTime = dist / rocket.velocity

    except CelestialObjectModel.DoesNotExist:
        #we couldn't find the target Celestial-body, lets not modify the ETA
        pass

    #reset push model
    pushmodel.amount = 0
    pushmodel.force = 0
    pushmodel.save()

    rocket.save()
    #logger.info("Rocket updated")

处理修改数据库中模型的一个请求的 RestAPI 视图:

class PushesView(APIView):
    permission_classes = (permissions.AllowAny,)

    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        return super(PushesView, self).dispatch(request, *args, **kwargs)

    @csrf_exempt
    def get(self, request, format=None):
        pushes = PushModel.objects.first()
        serializer = PushSerializer(pushes, many=False)
        return Response(serializer.data) #headers={'Access-Control-Allow-Origin':'*'}

    @csrf_exempt
    def post(self, request, format=None):
        entries = []
        entries.append(request.DATA)

        #take json-array of the pushes and take the forces:   
        pushList = request.DATA["pushes"]
        forceCount = 0
        for x in pushList:
            forceCount += x["push"]

        PushModel.objects.filter().update(amount=(F('amount')+len(pushList)))
        PushModel.objects.filter().update(force=(F('force')+forceCount))
        return Response("SUCCESS")

相关内容