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