Flask REST-API в утечке памяти контейнера Alpine Docker - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь найти утечку памяти в 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.

Может кто-нибудь объяснить, что происходит, или иметь представление о том, как я могу решить проблему с кэшированием.

1 Ответ

0 голосов
/ 25 сентября 2019

Проблема исправлена.На самом деле это не было проблемой.Использование памяти статистики докера увеличивается из-за внедрения python.Если запрос rest-api имеет размер несколько ГБ, то python выделяет определенный процент используемой памяти и не освобождает ее немедленно.Таким образом, пики в 500 ГБ были после действительно отличного ответа.Я добавил к конечным точкам API фиксированный лимит и подсказывал пользователю, что если он превысит этот лимит, он должен загрузить всю базу данных в виде почтового индекса и работать с ним локально.

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