2012-02-19 2 views
1

Apache2에서 WSGI 프로세스로 실행되는 상당히 간단한 Python Flask 응용 프로그램을 사용하고 있습니다. 응용 프로그램은 SQLAlchemy를 사용하여 DB에서 몇 줄의 데이터를 검색하여 JSON으로 다시 전송합니다.Flask WSGI 응용 프로그램 메모리가 부족합니다.

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:[email protected]/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) 

누구든지 내가 뭔가를 놓친 경우 말 또는 I가 충전되는 것을 볼 수있는 방법을 예를 들어, 나에게 문제에 메모리 사용량을 촬영하는 방법에 대한 몇 가지 도움말을 제공 할 수 있습니다 아파치 2 프로세스?

도움 주셔서 감사합니다.

+2

[Flask-SQLAlchemy] (http://packages.python.org/Flask-SQLAlchemy/)를 사용하는 대신 sqlalchemy를 직접 처리하는 이유가 있습니까? – ThiefMaster

+0

나는 그 하나를 놓쳤다, 팁에 감사드립니다! – StefanE

+0

@ThiefMaster 그건 내 문제를 실제로 해결했습니다! 초당 250 건의 요청과 1.5 % 이상의 RAM 사용량이 아닙니다. 당신이 글을 쓰면 답을 해줘서 기쁩니다! – StefanE

답변

5

Flask-SQLAlchemy을 사용하십시오. 그것은 적절한 연결 처리 및 정리 작업을 처리합니다. 게다가

, 그것은 당신에게 같은 Modelclass.query 대신 db.session.query(Modelclass)

2

당신은 요청이 끝날 때 SQLAlchemy의 세션 개체를 제거하지 않은 등의 설탕을 많이 제공합니다. 이것은 애플리케이션의 teardown_request 핸들러에서 수행되어야합니다 (Flask 문서의 예제 참조). Flask-SQLAlchemy는이 작업을 수행하지만 Flask-SQLAlchemy 로의 전환은 필요하지 않습니다.

관련 문제