Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 可能是Appengine上的金字塔内存泄漏灵活使用MemoryStore_Google App Engine_Pyramid_App Engine Flexible_Google Cloud Memorystore - Fatal编程技术网

Google app engine 可能是Appengine上的金字塔内存泄漏灵活使用MemoryStore

Google app engine 可能是Appengine上的金字塔内存泄漏灵活使用MemoryStore,google-app-engine,pyramid,app-engine-flexible,google-cloud-memorystore,Google App Engine,Pyramid,App Engine Flexible,Google Cloud Memorystore,我们正在努力将后端从appengine标准(和“webapp2”框架)迁移到灵活使用金字塔。我们有各种各样的概念证明,似乎没有很多问题。在这个早期阶段,它所做的只是接收来自第三方(“pings”)的请求,然后向另一个内部服务启动一个任务,以获取一些数据。它与谷歌MemoryStore连接以缓存一个用户id,表明我们已经在过去6小时内获取(或试图获取)了该用户的数据 说到6小时,似乎每隔6小时左右,Flexible实例上的内存使用量就会达到一个临界点,然后可能会刷新,一切都会恢复正常。该实例的内存

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

说到6小时,似乎每隔6小时左右,Flexible实例上的内存使用量就会达到一个临界点,然后可能会刷新,一切都会恢复正常。该实例的内存设置为512MB,但与时钟一样,它的内存设置为800MB左右(某种宽限使用?或者不能设置为1GB以下)

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

我不确定在调试这样的东西时什么有用,所以我将尝试展示我所能做的

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(根据自定义运行时需要)

为什么是习俗?在默认的Python运行时下,我无法使其正常工作。
pip安装-e.
似乎是需要的

然后,在root
\uuuu init\uuuu
中,我有:

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))
在实际请求本身上,从外部导入导入缓存存储后,我只需调用上面显示的方法:
cachestore.client.get(user['ownerId'])


正如我所能说的那样,这似乎是谷歌为实现这一点所说的。唯一的区别是我在它周围放了一个包装器。

这些模式建议每6小时重新启动或刷新一次资源。您是否检查了相应的日志?也许您需要添加一些日志记录?能否添加在内存图突然减少的时间戳处发生的日志?现在很难说是什么原因导致了这些问题。相信我已经将其与云任务联系在一起,并在这里产生了一个问题
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))