带有Django的Google Cloud SQL-极慢的连接

时间:2019-01-03 13:36:13

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

编辑:

经过进一步调查后,延迟似乎比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通道,但此后删除了所有对此的引用。

中间件和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进行授权,看来效果很好。

1 个答案:

答案 0 :(得分:0)

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