1

Я пишу относительно простое веб-приложение в качестве учебного проекта для изучения Django, Apache, Mysql и т.д. На практике. Он состоит из клиента web flash/html5, который выполняет два API-вызова к API Django Rest-Framework раз в секунду. Один получает статус объекта, а другой увеличивает счетчики в модели Django. В дополнение к этому у меня есть задача Celery, которая выполняет код, который изменяет одну из моделей каждую секунду.

На моем VPS я настроил Django, обслуживаемый на Apache, с MySql в качестве базы данных. После того, как я запускаю все соответствующие процессы, и клиенты начинают делать запросы, использование памяти выходит из-под контроля и быстро достигает 512 МБ, что является пределом для моего 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 и курица сельдерея задача выполнена:

Задача сельдерея:

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

0