Я пытаюсь найти утечку памяти в REST-API моей фляги в течение нескольких дней без какого-либо существенного прогресса.
У меня есть REST-API фляги, использующий базу данных mysql (пакеты типаSQLAlchemy, связь и зефир).Он доступен через докер-контейнер, у которого есть базовый образ от alpine: latest.
Основная проблема, которая у меня есть: с каждым запросом к REST-API использование памяти док-контейнера увеличивается, а память невыпущенный.API не кеширует результаты.
Вот код из server.py (основная программа RESt-API):
"""
Main module of the server file
"""
# 3rd party moudles
# local modules
import config
# Get the application instance
connex_app = config.connex_app
# Read the swagger.yml file to configure the endpoints
connex_app.add_api("swagger_2.0.yml")
# create a URL route in our application for "/"
@connex_app.route("/")
def home():
return None
if __name__ == "__main__":
connex_app.run(debug=True)
и файл конфигурации:
import os
import connexion
from flask_cors import CORS
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
from memory_profiler import memory_usage
basedir = os.path.abspath(os.path.dirname(__file__))
# Create the Connexion application instance
connex_app = connexion.App(__name__, specification_dir=basedir)
# Get the underlying Flask app instance
app = connex_app.app
CORS(app)
# Configure the SQLAlchemy part of the app instance
app.config['SQLALCHEMY_ECHO'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:somepassword@someHostId/sponge"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
@app.after_request
def add_header(response):
#response.cache_control.no_store = True
if 'Cache-Control' not in response.headers:
response.headers['Cache-Control'] = 'max-age=0'
print(memory_usage(-1, interval=.2, timeout=1), "after request")
return response
# Create the SQLAlchemy db instance
db = SQLAlchemy(app)
# Initialize Marshmallow
ma = Marshmallow(app)
Пример для конечной точки вы можете увидеть здесь:
from flask import abort
import models
def read(disease_name=None):
"""
This function responds to a request for /sponge/dataset/?disease_name={disease_name}
with one matching entry to the specifed diesease_name
:param disease_name: name of the dataset to find (if not given, all available datasets will be shown)
:return: dataset matching ID
"""
if disease_name is None:
# Create the list of people from our data
data = models.Dataset.query \
.all()
else:
# Get the dataset requested
data = models.Dataset.query \
.filter(models.Dataset.disease_name.like("%" + disease_name + "%")) \
.all()
# Did we find a dataset?
if len(data) > 0:
# Serialize the data for the response
return models.DatasetSchema(many=True).dump(data).data
else:
abort(404, 'No data found for name: {disease_name}'.format(disease_name=disease_name))
Я попытался найти утечку памяти в коде с помощью инструмента memory_profiler, но так же, как и при увеличении использования памятиконтейнера docker при каждом запросе) можно наблюдать на каждой конечной точке REST-API.
Может кто-нибудь объяснить, что происходит, или иметь представление о том, как я могу решить проблему с кэшированием.