【问题标题】:Google Cloud SQL w/ Django - Extremely Slow Connection带有 Django 的 Google Cloud SQL - 连接速度极慢
【发布时间】:2019-05-30 02:33:30
【问题描述】:

编辑:

经过进一步调查,延迟似乎更多是 Django 而不是 Cloud SQL 代理。

我在视图的开头和结尾添加了几个打印语句,它们会在发出请求时立即打印,但页面加载需要另外 60 秒。

我已经剥离了模板文件以仅包含基本框架,删除了大多数脚本和静态资源,但它仍然非常相似。

改变我的观点以返回一个简单的HttpResponse('Done') 大大缩短了时间。

在本地开发时,我使用 Django 来提供 docs 中描述的静态文件。同样,我在其他项目中没有这个问题。

原帖:

我最近注意到在本地开发环境中使用 Cloud SQL 代理时,我的 Django 应用程序连接到我的 Google Cloud SQL 数据库的速度非常慢。

初始连接需要 2-3 分钟,之后每个请求需要 60 秒。这适用于执行迁移或运行开发服务器时。最终请求完成。

我尝试过扩展数据库但没有效果(无论如何它相对较小)。数据库版本为 MySQL 5.7,机器类型为 db-n1-standard-1。以前我使用过 Django Channels,但后来删除了对它的所有引用。

中间件和settings.py相对标准,与另一个即时连接的Django应用相同。

实时站点的连接速度也非常快,没有任何问题。

Python 版本是 3.6,带有 Django 2.1.4 和 mysqlclient 1.3.14。

我的数据库设置定义为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'PORT': '3306',
    }
}

DATABASES['default']['HOST'] = os.getenv('DB_HOST')
if os.getenv('GAE_INSTANCE'):
    pass
else:
    DATABASES['default']['HOST'] = '127.0.0.1'

是否使用环境变量似乎没有什么区别。

我正在通过 ./cloud_sql_proxy -instances="my-project:europe-west1:my-project-instance"=tcp:3306 启动 Cloud SQL 代理。

通过命令行调用代理后,我看到了Ready for new connections。运行python manage.py runserver 会显示New connection for "my-project:europe-west1:my-project-instance",但在我看到Starting development server at http://127.0.0.1:8000/ 之前需要一段时间。

我还注意到 Stackdriver 中有几个错误:

  • _mysql_exceptions.OperationalError: (2006, "Lost connection to MySQL server at 'reading initial communication packet', system error: 95")
  • django.db.utils.OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 95")
  • AttributeError: 'SessionStore' object has no attribute '_session_cache'

这些在不更改任何设置的情况下不时出现(或不出现)。

我已经读到它们可能是访问权限问题,但最终会建立连接,但速度非常慢。我正在通过 Google Cloud SDK 进行授权,这似乎工作正常。

【问题讨论】:

  • 这可能是您本地网络连接的问题吗?您是在防火墙后面还是在使用 VPN?您可以从其他网络尝试吗?
  • 我不能说。我不知道有任何限制会阻碍它,而且其他具有类似设置的项目似乎可以正常加载。

标签: python mysql django google-cloud-platform google-cloud-sql


【解决方案1】:

最终我发现延迟的主要来源是在我的一个管理表单(延迟初始启动)和上下文处理器(延迟每次加载)中调用的递归函数。删除它后,页面加载没有问题。但是,在部署到 App Engine 或使用测试/本地 SQLite 数据库时,它运行良好,这使调试变得更加困难。

【讨论】:

  • 那/那些设置是什么?你能分享一些关于这方面的信息吗?我今天有这个问题。
  • 这不是一个特定的设置,而是一种结构化代码的方式,例如一个函数可能会重复调用自身以构建嵌套的层次结构,从而导致许多数据库调用。
猜你喜欢
  • 2023-02-05
  • 2013-01-13
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多