Приложению Flask WSGI не хватает памяти - PullRequest
1 голос
/ 19 февраля 2012

У меня есть довольно простое приложение на Python Flask, работающее как процесс WSGI под Apache2. У приложения есть прослушиватель, использующий SQLAlchemy для извлечения нескольких строк данных из БД и отправки их обратно в виде JSON

Для соединения MySql у меня есть один глобальный движок, который используется повторно.

Используя JMeter для генерирования некоторой нагрузки, процесс Apache2 увеличивает использование ОЗУ на 0,5% за каждые 5 секунд и очень быстро исчерпывает ОЗУ. При остановке 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 ]

5 голосов
/ 19 февраля 2012

Использование Flask-SQLAlchemy.Он заботится о правильной обработке соединения и очистке вещей.

Кроме того, он дает вам много сахара, например Modelclass.query вместо db.session.query(Modelclass)

2 голосов
/ 19 августа 2013

Вы не удалили объект сеанса SQLAlchemy в конце запроса. Это должно быть сделано в teardown_request обработчике вашего приложения (см. Пример в документации Flask). Flask-SQLAlchemy делает это за вас, но переключение на Flask-SQLAlchemy пока не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...