大数据集的 Graphene-python 性能问题

tec*_*ile 11 django graphql graphene-python graphene-django

目前使用graphene-python 和graphene-django(和graphene-django-optimizer)。

收到GraphQL查询后,数据库查询在几分之一秒内成功完成;然而,石墨烯在另外 10 多秒内不会发送响应。如果我增加响应中发送的数据,响应时间会线性增加(三倍数据 = 三倍响应时间)。

正在检索的数据由嵌套对象组成,最多 7 层深,但使用优化的查询,这不会影响从数据库检索数据所需的时间,因此我假设延迟与 graphene-python 有关将结果解析为 GraphQL 响应。

我无法弄清楚如何分析执行以确定花费这么长时间的时间——在 Django 上运行 cProfiler 似乎没有跟踪石墨烯的执行。

SQL Query 响应时间是使用 graphene-django-debugger 中间件确定的,结果如下所示:

    "_debug": {
  "sql": [
    {
      "duration": 0.0016078948974609375,
      "isSlow": false,
      "rawSql": "SELECT SYSDATETIME()"
    },
    {
      "duration": 0.0014908313751220703,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014371871948242188,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.001291036605834961,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0013201236724853516,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0015559196472167969,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0016672611236572266,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014820098876953125,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014810562133789062,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.001667022705078125,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014202594757080078,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0027959346771240234,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.002704143524169922,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0030939579010009766,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

下面的屏幕截图显示了服务器对同一请求的相应响应时间: Chrome DevTool Network 帖子响应时间的屏幕截图

如果有人知道为什么石墨烯需要这么长时间才能产生响应,或者可以帮助我分析石墨烯的执行情况,我将不胜感激!

Jur*_*dil 0

尝试使用更好的分析器,例如Silk,它将根据 Django 向数据库发出的查询向您显示细分,以及简洁的 cProfiler 概述。我怀疑无关的数据库调用存在问题。石墨烯往往会让 Django 在构建响应时执行大量的每个字段调用,并且它们可能不会显示在调试器响应中。

如果没有有关设置的更多信息 - 模型、解析器和 graphql 查询 - 很难判断。

编辑:现在从问题中可以清楚地看出数据库不是问题