0

我们正在使用金字塔将我们的后端从 appengine 标准(和“webapp2”框架)迁移到灵活。我们有一个看似没有很多问题的概念证明。它在这个早期阶段所做的只是接受来自第三方的请求(“ping”),然后将任务启动到另一个内部服务以获取一些数据。它与谷歌的 MemoryStore 连接以缓存用户 ID,以表明我们已经在过去 6 小时内获取(或尝试获取)该用户数据。

说到 6 小时,似乎每 6 小时左右,Flexible 实例上的内存使用量似乎达到了一个临界点,然后可能会刷新,一切又恢复正常。此实例设置为具有 512MB 内存,但就像发条一样,它在大约 800MB 时执行此操作(某种宽限使用?或者这些不能设置为低于 1GB)

gcp

很明显,它的移动是多么缓慢,记忆并没有像应该的那样经常被清除。发生这种情况时,实例上的延迟也会激增。

gcp2

我不确定调试这样的东西有什么用,所以我会尽力展示我能做的。

Appengine YAML 文件:

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 .似乎是需要的。

然后,在根__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 的连接是问题所在?缓存存储:

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))

在实际请求本身上,在 import 之后from externalping import cachestore,我只是调用上面显示的那些方法:cachestore.client.get(user['ownerId'])

据我所知,这似乎是谷歌文档所说的实现这一点的方式。唯一的区别是我在它周围放了一个包装器。

4

0 回答 0