我正在编写一个相对简单的 Web 应用程序作为学习项目,以在实践中学习 Django、Apache、Mysql 等。它由一个 Web Flash/HTML5 客户端组成,每秒对 Django Rest-Framework API 进行两次 API 调用。一个获取对象的状态,另一个增加 Django 模型中的计数器。除此之外,我还有一个 Celery 任务,它每秒执行修改其中一个模型的代码。
在我的 VPS 上,我设置了一个在 Apache 上运行的 Django,以 MySql 作为数据库。在我启动所有相关进程并且客户端开始发出请求后,内存使用量急剧上升,很快达到 512Mb,这是我的 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 和执行 Celery 任务时调用的相关代码片段:
芹菜任务:
@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")