Возможно утечка памяти в Pyramid на Appengine Flexible with MemoryStore - PullRequest
0 голосов
/ 11 февраля 2020

Мы работаем над переносом нашего бэкенда из стандартного appengine (и фреймворка "webapp2") в гибкий с использованием пирамиды. У нас есть доказательство того, что сорта работают без особых проблем. Все, что он делает на этом раннем этапе, это принимает запросы от третьей стороны ("pings"), а затем go запускает задачу в другой внутренний сервис для go извлечения некоторых данных. Он подключается к GoogleStore Google Store, чтобы кэшировать идентификатор пользователя, чтобы указать, что мы уже загрузили данные пользователей (или попытались) за последние 6 часов.

Говоря о 6 часах, кажется, что каждые 6 часов или около того, использование памяти на экземпляре Flexible кажется переломным, а затем, вероятно, сбрасывается, и все снова в порядке. Для этого экземпляра установлено 512 МБ памяти, но, как по маслу, он делает это на 800 МБ (что-то вроде льготного использования? Или, может быть, их нельзя установить ниже 1 ГБ)

gcp

По тому, как постепенно он движется, становится ясно, что память очищается не так часто, как следовало бы. Когда это происходит, задержка в экземпляре также резко возрастает.

gcp2

Я не уверен, что полезно для отладки чего-то подобного, поэтому я попытаюсь показать, что я могу.

Appengine YAML file:

runtime: custom
env: flex
service: ping
runtime_config:
  python_version: 3.7

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

Dockerfile (как требуется для гибкого пользовательского интерфейса)

FROM gcr.io/google-appengine/python

RUN virtualenv /env

ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

ADD . /app

RUN pip install -e .
CMD gunicorn -b :$PORT main:app

Почему заказной? Я не мог заставить это работать при стандартной Python среде выполнения. pip install -e . был тем, что казалось необходимым.

Затем, в root __init__ у меня есть:

from pyramid.config import Configurator
from externalping.memcache import CacheStore

cachestore = CacheStore()

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """

    with Configurator(settings=settings) as config:
        config.include('.routes')
        config.scan()
    return config.make_wsgi_app()

Возможно, так рано было определено соединение с MemoryStore, возникает проблема ? Cachestore:

class CacheStore(object):
    redis_host = os.environ.get('REDISHOST', 'localhost')
    redis_port = int(os.environ.get('REDISPORT', 6379))
    client = None

    def __init__(self):
        self.client = redis.StrictRedis(host=self.redis_host, port=self.redis_port)

    def set_json(self, key, value):
        self.client.set(key, json.dumps(value))
        return True

    def get_json(self, key):
        return json.loads(self.client.get(key))

На самом запросе, после импорта from externalping import cachestore, я просто вызываю методы, показанные выше: cachestore.client.get(user['ownerId'])

Это похоже на то, как Google документация говорит, чтобы реализовать это, насколько я могу судить. Разница лишь в том, что я надеваю обертку.

...