我Exceeded soft private memory limit在app引擎中的各种请求处理程序中偶尔会遇到错误.我知道这个错误意味着实例使用的RAM超过了分配的数量,以及它如何导致实例关闭.
我想了解可能导致错误的原因,并且首先,我想了解app引擎python实例应该如何管理内存.我的基本假设是:
这就是我认为这是可行的,但考虑到我偶尔会穿过一个相当看到此错误广集请求处理的,现在我不那么肯定.我的问题是:
a)第4步会发生吗?
b)什么可能导致它不发生?还是不完全发生?例如,请求之间的内存如何泄漏?
c)模块级变量中的存储是否会导致内存使用泄漏?(我不是故意以这种方式使用模块级变量)
d)我可以使用哪些工具/技术来获取更多数据?例如,在请求处理程序的入口处测量内存使
在答案/评论中,如果可能,请链接到gae文档.
[编辑]额外信息:我的应用程序被统一为threadsafe: false.如果这与答案有关,请说明它是什么.我计划threadsafe: true很快改变.
[编辑] 澄清:这个问题是关于gae对内存管理的预期行为.因此,虽然像"呼叫gc.collect()" 这样的建议可能是相关问题的部分解决方案,但它们并没有完全回答这个问题.直到我理解gae预计会如何表现为止,使用gc.collect()对我来说就像伏都教编程一样.
最后:如果我把这一切都倒退了然后我提前道歉 - 我真的找不到有用的信息,所以我大多猜测..
我正在尝试从运行在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.
我正在评估使用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
我有一个配置的本地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
我正在尝试部署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
所以我的目录结构看起来像这样:
\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.
我可以通过调用获得正在运行的进程的短整数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?
渠道API已被弃用并被拒绝,我觉得非常令人沮丧.
套接字API在测试版中是(并且已经过十年的大部分时间),其政策规定如下:
这是Sockets API的Beta版本.任何SLA或弃用策略都不涵盖此API,并且可能会受到向后不兼容的更改.
令人不安的是,套接字API演示的Python版本不包括import socket- 它只是使用了Channel API,因此这个问题:
由于Sockets API的官方演示纯粹使用了Channel API(它被拒绝了),这是否意味着Sockets API也被拒绝,但由于缺乏弃用策略而没有这样说明?
当我跑步
gcloud app deploy app.yaml
Run Code Online (Sandbox Code Playgroud)
实际上传了哪些文件?
项目文件夹包含文件夹和文件,如.git,.git_ignore,Makefile或venv不相关的部署的应用程序。
如何gcloud app deploy确定上传哪些文件?
将 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