标签: google-app-engine-python

app引擎(python)如何跨请求管理内存(超出软私有内存限制)

Exceeded soft private memory limit在app引擎中的各种请求处理程序中偶尔会遇到错误.我知道这个错误意味着实例使用的RAM超过了分配的数量,以及它如何导致实例关闭.

我想了解可能导致错误的原因,并且首先,我想了解app引擎python实例应该如何管理内存.我的基本假设是:

  1. F2实例以256 MB开头
  2. 启动时,它会加载我的应用程序代码 - 比方说30 MB
  3. 当它处理请求时,它有226 MB可用
    • 只要该请求不超过226 MB(+误差范围),请求就完成无错误
    • 如果它确实超过226 MB + margin,实例完成请求,记录'Exceeded soft private memory limit'错误,然后终止 - 现在返回步骤1
  4. 当该请求返回时,它所使用的任何内存都被释放 - 即.未使用的RAM回到226 MB
  5. 对于传递给实例的每个请求,无限期地重复步骤3-4

这就是我认为这是可行的,但考虑到我偶尔会穿过一个相当看到此错误广集请求处理的,现在我不那么肯定.我的问题是:

a)第4步会发生吗?

b)什么可能导致它不发生?还是不完全发生?例如,请求之间的内存如何泄漏?

c)模块级变量中的存储是否会导致内存使用泄漏?(我不是故意以这种方式使用模块级变量)

d)我可以使用哪些工具/技术来获取更多数据?例如,在请求处理程序的入口处测量内存使

在答案/评论中,如果可能,请链接到gae文档.

[编辑]额外信息:我的应用程序被统一为threadsafe: false.如果这与答案有关,请说明它是什么.我计划threadsafe: true很快改变.

[编辑] 澄清:这个问题是关于gae对内存管理的预期行为.因此,虽然像"呼叫gc.collect()" 这样的建议可能是相关问题的部分解决方案,但它们并没有完全回答这个问题.直到我理解gae预计会如何表现为止,使用gc.collect()对我来说就像伏都教编程一样.

最后:如果我把这一切都倒退了然后我提前道歉 - 我真的找不到有用的信息,所以我大多猜测..

python memory google-app-engine google-app-engine-python

7
推荐指数
2
解决办法
1110
查看次数

无法使用PyMySQL连接到Cloud SQL

我正在尝试从运行在Google App Engine之上的Python应用程序(使用PyMySQL 0.7.9)连接到Cloud SQL.

我的连接字符串看起来像这样(凭证当然是假的):

pymysql.connect(unix_socket='/cloudsql/gae_project_name:cloudsql_instance_name', 
                user='user', password='', db='database_name')
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息是:

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 97] Address family not supported by protocol)")

这就像PyMySQL没有意识到我正在尝试通过Unix套接字连接并尝试使用host参数的默认值(我认为是localhost)

我能够使用相同的连接字符串连接MySQLdb.

python google-cloud-sql pymysql google-app-engine-python

7
推荐指数
1
解决办法
1485
查看次数

将Django连接到Google App Engine中的Google CloudSQL Postgres数据库时出错

我正在评估使用Google Cloud和Google App Engine来购买我们公司的新产品.我正在尝试修改本教程以使用Postgres而不是MySQL:

https://cloud.google.com/python/django/flexible-environment

虽然我能够在本地成功连接到数据库,但是当我尝试生产时,我收到以下500错误:

OperationalError at /admin/login/
    could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/cloudsql/<project_name_hidden>:us-central1:<database_id_hidden>/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)

为了连接到Postgres,我对示例项目进行了三处更改.我在app.yaml中有这个片段:

beta_settings:
  cloud_sql_instances: <project_name_hidden>:us-central1:<database_id_hidden>
Run Code Online (Sandbox Code Playgroud)

我在settings.py中有这个片段:

# [START dbconfig]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'polls',
        'USER': '<db_user_name_hidden>',
        'PASSWORD': '<db_password_hidden>',
        'PORT': '5432',
    }
}
# In the flexible environment, you connect to CloudSQL using a unix socket.
# Locally, you can use the CloudSQL proxy to proxy …
Run Code Online (Sandbox Code Playgroud)

python postgresql google-app-engine google-cloud-sql google-app-engine-python

7
推荐指数
1
解决办法
1483
查看次数

如何将Python 3与Google App Engine的本地开发服务器一起使用

我有一个配置的本地Python应用程序

runtime: python
Run Code Online (Sandbox Code Playgroud)

在它的app.yaml文件中.使用时启动本地开发服务器

dev_appserver.py app.yaml
Run Code Online (Sandbox Code Playgroud)

一切都很好.

由于GAE的Local Development Server默认使用Python2.7,我现在想要使用Python3.x.根据Google的文档,我们必须使用灵活的环境.因此我app.yaml改为:

runtime: python
env: flex

runtime_config:
  python_version: 3
Run Code Online (Sandbox Code Playgroud)

现在dev_appserver.py app.yaml吐出:

Under dev_appserver, runtime:python is not supported for Flexible environment.
Run Code Online (Sandbox Code Playgroud)

Google的Hello World应用程序也可以使用灵活的环境重现该问题.

那么本地我们不能使用Python3?在上传之前,我们如何在本地运行我的Python3代码?

python google-app-engine python-3.x google-app-engine-python

7
推荐指数
1
解决办法
2250
查看次数

ImportError:没有名为flask_restful的模块

我正在尝试部署appengine flex python应用程序,但在部署后在Stackdriver日志stderr中获取以下内容

  File "/env/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
    worker.init_process()
  File "/env/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/env/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/env/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/env/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/env/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/env/local/lib/python2.7/site-packages/gunicorn/util.py", line 352, in import_app
    __import__(module)
  File "/home/vmagent/app/my_service/entry_point.py", line 5, in <module>
    import flask_restful as restful
ImportError: No module named flask_restful
Run Code Online (Sandbox Code Playgroud)

第5行的entry_point.py有

import flask_restful as restful
Run Code Online (Sandbox Code Playgroud)

而我的requirements.txt有

Flask-RESTful==0.3.6 …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine google-app-engine-python app-engine-flexible

7
推荐指数
2
解决办法
8744
查看次数

Google App Engine从父文件夹导入库

所以我的目录结构看起来像这样:

\Project-Dir\
|- lib\
|  |- flask\
|  |- ...
|- module1_dir\
|  |- __init__.py
|  |- app.yaml
|  |- app.py
|  |- ...
|- module2_dir\
|  |- __init__.py
|  |- app.yaml
|  |- app.py
|  |- ...
|- ...
Run Code Online (Sandbox Code Playgroud)

app.py

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
Run Code Online (Sandbox Code Playgroud)

我在同一个根目录下有两个模块.它们一起部署到App Engine.他们也共享相同的库.这些库都非常强大,所以我试图将它们放在共享目录(lib)中.

我正在dev_appserver.py\Project-Dir\和传球两个.yamls.我sys.path的设置很好,包括lib\目录.然而沙盒似乎固执地坚持认为图书馆lib\ 不存在.

我确定我只是遗漏了一些像配置改变一样的东西.或者App Engine真的只是不支持这样的设置?

编辑:当我在外面运行它时,导入工作正常dev_appserver.py.

google-app-engine python-import google-app-engine-python

6
推荐指数
1
解决办法
550
查看次数

如何(在Python中)获取App Engine实例的长格式instance_id?

我可以通过调用获得正在运行的进程的短整数instance_id modules.get_current_instance_id(),但这会将整数索引返回到当前版本的应用程序的实例列表中.我可以创建一个rpc来获取完整的十六进制instance_id,如下所示:

from google.appengine.api.app_identity import app_identity
from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()
service = build('appengine', 'v1', credentials=credentials)
appsId = app_identity.get_application_id()

rpc_result = service.apps().services().versions().instances().list(versionsId='23', servicesId='default', appsId=appsId).execute()

print rpc_result['instances'][int(modules.get_current_instance_id())]
Run Code Online (Sandbox Code Playgroud)

这给了我一个dict,其中包含一个'id'键值对,其中值看起来像这样:00c61b117cb3c50973d6a73225b3d807eb8e873e96abc59c46ebba168897b8dbd9a443af962df5

这就是我需要的.

这种方法有两个明显的缺点.首先是我正在做RPC以获得必须在本地可用的东西 - 某处.第二个是存在竞争条件的事实.如果modules.get_current_instance_id()返回,比如说3,但实例#2在为该进程分配索引之间关闭,当我得到rpc响应时,我将在我的索引中关闭rpc_result.

如何在应用引擎中获取此ID?

python google-app-engine google-app-engine-python

6
推荐指数
1
解决办法
139
查看次数

套接字API是否被拒绝了?

渠道API已被弃用并被拒绝,我觉得非常令人沮丧.

套接字API在测试版中是(并且已经过十年的大部分时间),其政策规定如下:

这是Sockets API的Beta版本.任何SLA或弃用策略都不涵盖此API,并且可能会受到向后不兼容的更改.

令人不安的是,套接字API演示的Python版本不包括import socket- 它只是使用了Channel API,因此这个问题:

由于Sockets API的官方演示纯粹使用了Channel API(它被拒绝了),这是否意味着Sockets API也被拒绝,但由于缺乏弃用策略而没有这样说明?

google-app-engine google-app-engine-python

6
推荐指数
1
解决办法
130
查看次数

运行`gcloud app deploy`时如何忽略文件?

当我跑步

gcloud app deploy app.yaml
Run Code Online (Sandbox Code Playgroud)

实际上传了哪些文件?

项目文件夹包含文件夹和文件,如.git.git_ignoreMakefilevenv不相关的部署的应用程序。

如何gcloud app deploy确定上传哪些文件?

python google-app-engine google-app-engine-python

6
推荐指数
2
解决办法
4473
查看次数

您如何对 Google Cloud NDB 代码进行单元测试?

将 Python 2 AppEngine 应用升级到新运行时的推荐路径是将数据存储区代码切换到 Google Cloud NDB。但是,我找不到任何关于使用 Cloud NDB 的单元测试代码(以前可以使用 Python 2 测试平台库)。

如何对 Cloud NDB 代码进行单元测试?(除了自己抽象 Cloud NDB 依赖项的标准)

python google-app-engine app-engine-ndb google-cloud-datastore google-app-engine-python

6
推荐指数
1
解决办法
340
查看次数