Flask WSGI应用程序内存不足

时间:2012-02-19 12:05:12

标签: python apache sqlalchemy flask

我有一个相当简单的python Flask应用程序在Apache2下作为WSGI进程运行。 应用程序有一个监听器,使用SQLAlchemy从数据库中检索几行数据并将其作为JSON发送回来

对于MySql连接,我确实有一个全局引擎被重用。

使用JMeter生成一些负载,Apache2进程每5秒钟将RAM使用量增加0.5%,并且很快就会耗尽RAM。如果停止生成负载的JMeter,则内存不会被清除。

的httpd.conf

<VirtualHost *:80>
ServerName xxxxxxxxxx.com

<Directory /var/www/xxxxxxxxxx>
    Order allow,deny
Allow from all
</Directory>

WSGIDaemonProcess BiddingPractice user=www-data group=www-data threads=5
WSGIScriptAlias /flask /var/www/xxxxxxxx/xxxxxxxxxxx.wsgi

<Directory /var/www/BiddingPractice>
    WSGIProcessGroup BiddingPractice
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

WSGI文件

import sys
sys.path.insert(0, '/home/stefan/Code/xxxxxx')
from BiddingPractice import app as application

_ init.py _

    # -*- coding: utf-8 *-*
from flask import Flask
from sqlalchemy import *

app = Flask(__name__)
db = create_engine('mysql://root:xxxxxx@localhost/xxxxxxx')

import BiddingPractice.main

main.py

    # -*- coding: utf-8 *-*
from flask import render_template
from flask import request
from flask import make_response
from flask import jsonify
from BiddingPractice import app, db
from Data.users import getUsers
import random

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('temp.html', name=name)

@app.route('/getData')
def getData():

    un, psw, gids = getUsers()

    random.shuffle(un)
    random.shuffle(gids)

    usernames = ','.join(map(str, un))
    passwords = ','.join(map(str, psw))
    guids = ','.join(map(str, gids))

    return jsonify(usernames=usernames, passwords=passwords, guids=guids)

任何人都可以判断我是否遗漏了某些内容或者给我一些关于如何解决内存使用问题的提示,例如我怎么能看到填补Apache2进程的内容?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

使用Flask-SQLAlchemy。它需要妥善处理连接和清理物品。

除此之外,它会为您提供大量的糖,例如Modelclass.query而不是db.session.query(Modelclass)

答案 1 :(得分:2)

您未在请求结束时删除SQLAlchemy会话对象。这应该在应用程序的teardown_request处理程序中完成(请参阅Flask文档中的示例)。 Flask-SQLAlchemy为您完成此任务,但到目前为止还不需要切换到Flask-SQLAlchemy。