Problema no consumo de memória do Apache e MySql datbase com o Django


1

Estou escrevendo um aplicativo da 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 do Django Rest-Framework uma vez por segundo. Um obtém o status de um objeto e outro incrementa um contador no 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, montei um Django servido no Apache com o MySql como um db. Depois que eu inicio todo o processo relevante e os clientes começam a fazer a solicitação, o uso da memória fica fora de controle e rapidamente alcança 512Mb, que é o limite do meu VPS e o Apache / MySql trava. No momento, três clientes simultâneos são suficientes para causar a falha que não é aceitável.

Eu fiz algumas pesquisas hoje e tentei usar este http://wiki.vpslink.com/Low_memory_MySQL_/_Apache_configurations e este https://serverfault.com/questions/21106/how-to-reduce-memory-usage-on-a -unix-webserver como um guia para limitar as configurações do MPM do meu servidor. Larguei os valores dos padrões para os do último link, sem nenhum efeito claro. Eu também tentei o truque skip-innodb, mas depois de adicionar isso ao meu mysql conf, não consegui iniciar meu servidor mysql.

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

Finalmente, aqui está minha configuração atual do Apache: http://pastebin.com/0agashnT 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 o A tarefa API e galinha Aipo é 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 exibição RestAPI que lida com 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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.