Problema de consumo de memória do banco de dados Apache e MySql com o Django

1

Eu estou escrevendo uma aplicação web relativamente simples como um projeto de aprendizado para aprender Django, Apache, MySQL etc. na prática. Ele consiste em um cliente web flash / html5 que faz duas chamadas de API para a API Django Rest-Framework uma vez por segundo. Um obtém o status de um objeto e outro incrementa um contador em um modelo do Django. Além disso, tenho uma tarefa do Celery que executa um código que modifica um dos modelos a cada segundo.

No meu VPS eu configurei um Django servido no Apache com o MySql como um banco de dados. Depois de iniciar todo o processo relevante e os clientes começarem a fazer pedidos, as espirais de uso de memória ficam fora de controle e rapidamente atingem 512Mb, que é o limite do meu VPS e o Apache / MySql falha. No momento, três clientes simultâneos são suficientes para causar a falha, o que não é aceitável.

Eu fiz algumas pesquisas hoje e tentei usar este link e esse link como um guia para limitar as configurações de MPM do meu servidor. Eu deixei cair os valores dos padrões para aqueles no último link sem nenhum efeito claro. Eu também tentei o truque skip-innodb mas depois de adicionar isso ao meu mysql conf eu não pude iniciar meu servidor mysql.

Sendo relativamente iniciante, estou um pouco em perda agora, já que ainda não tenho muito conhecimento das configurações do Apache. Portanto, gostaria de perguntar como devo proceder agora e quais configurações devo fazer considerando minha pilha de tecnologia?

Por fim, aqui está minha configuração atual do Apache: link E como é sempre possível que eu tenha cometido erros estúpidos no meu código do Django, aqui estão os bits de código relevantes que são chamados quando o cliente acessa a API e quando a tarefa do Celery é executada:

Tarefa de aipo:

    @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")

Uma RestAPI-view que manipula uma solicitação que modifica um modelo no db:

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")
    
por Tumetsu 11.06.2014 / 23:38

0 respostas