gpt4 book ai didi

Django 1.11 PostgreSQL - 每个 session 上的 "SET TIME ZONE"命令

转载 作者:行者123 更新时间:2023-11-29 14:14:04 25 4
gpt4 key购买 nike

我们正在我们的一个网站上解决几个性能问题,我们注意到命令“SET TIME ZONE 'America/Chicago'”被执行得如此频繁,以至于在 24 小时内,只有运行该命令的时间不到 1 小时(或大约 DB CPU 资源总量的 4%)。

请注意,“USE_TZ”设置为 False,因此根据我的理解,所有内容都应以 UTC 格式存储在数据库中,并且仅在必要时在 UI 中转换为本地时区。

对于我们如何消除数据库服务器上的这种压力,您有什么想法吗?

最佳答案

对于 postgres,Django 始终设置时区:服务器的本地时区(当 USE_TZ = False 时)或 UTC(当 USE_TZ = True 时)。这样,django 支持 postgreSQL 数据库后端的 settings.USE_TZ 的“实时切换”。

您实际上是如何确定这是瓶颈的?

通常 SET TIME ZONE 仅在创建与 DB 的连接期间调用。也许您应该使用 settings.DATABASES[...]['CONN_MAX_AGE'] = GREATER_THAN_ZERO ( docs ) 来使用持久连接。这样连接将被重用,您将减少对 SET TIME ZONE 的调用。但是如果您使用这种方法,您还应该仔细查看您的 PostgreSQL 配置:

  • max_connections 应该大于 1+wsgi 服务器的最大并发数 + 使用 django 的同时 cron 作业的最大数量(如果有的话)+ celery worker 的最大并发数(如果有的话) + 与 postgres 的任何其他潜在连接来源
  • 如果您正在运行 cron 作业来调用 pg_terminate_backend然后确保 CONN_MAX_AGE 大于“空闲超时”
  • 如果你在 VPS 上运行 postgres,那么在某些情况下可能会有打开套接字数量的限制)
  • 如果你使用类似 pgbouncer 的东西那么它可能已经在重用连接
  • 如果您使用sigkill (kill -9) 终止为您的django 项目服务的服务器,那么它可能会留下一些未关闭的数据库连接(但我不确定)

我认为如果您使用 django.utils.timezone.activate 也可能会发生这种情况。但我不确定...如果您在代码中手动调用它或者当您是 using middleware to do this 时,可能会发生这种情况。

其他可能的解释:您“分析”您的请求的方式实际上向您显示了整个交易的时间

关于Django 1.11 PostgreSQL - 每个 session 上的 "SET TIME ZONE"命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com