Я пишу относительно простое веб-приложение в качестве учебного проекта для изучения 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")