如何对Django Channels进行性能分析?

18

我的技术栈是Redis作为通道后端,Postgresql作为数据库,Daphne作为ASGI服务器,Nginx在整个应用程序前面。所有内容都使用Docker Swarm部署,仅Redis和数据库位于外部。我大约有20个虚拟主机,带有20个接口服务器、40个HTTP工作进程和20个WebSocket工作进程。负载均衡使用Ingress覆盖Docker网络进行。

问题是,有时候性能方面会发生非常奇怪的事情。大部分请求在400毫秒内处理完,但有时请求可能需要2-3秒甚至在很小的负载下也是如此。使用Django Debug Toolbar或基于中间件的分析器对工作进程进行分析并未发现任何异常(时间为0.01秒左右)

我的问题是:有没有好的方法来使用django-channels分析整个请求路径?我想知道每个阶段需要多长时间,例如当请求由Daphne处理时,工作进程何时开始处理,何时完成,接口服务器何时向客户端发送响应。目前,我不知道该如何解决这个问题。


2
如果有人感到好奇,似乎这篇文章的作者去问了谷歌小组:https://groups.google.com/forum/#!topic/django-users/_aG8Py_r2QY - raiderrobert
1
是的,这是我的问题。我找到了一些有用的方法,其中之一是Redis监控。我很快会在这里发布详细描述。 - Valar
期待听到你的成功经验。 - jaywhy13
2个回答

1
Django-silk可能对您在请求和数据库搜索时间方面进行性能分析很有帮助,原因如下:
  1. 只需在Django项目的settings.py中添加配置即可轻松设置。
  2. 可自定义:使用提供的装饰器,可以对函数或方法进行性能分析。
  3. 动态设置:您可以选择在运行时动态分配silk到方法,并设置所需的分析速率。
正如文档所述:

Silk是Django框架的实时分析和检查工具。Silk在呈现HTTP请求和数据库查询之前拦截并存储它们,以供进一步检查。

注意:silk可能会使您的数据库搜索时间翻倍,因此如果在生产环境中设置可能会导致一些问题。但是,增加的时间将在仪表板上单独显示。

https://github.com/jazzband/django-silk


虽然这可以回答问题,但提供有关如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Tiago Martins Peres

0
为什么不使用像Kibana或New Relic这样的监控工具,监控小负载响应所花费的时间和原因。它可以告诉你Python、PostgreSQL和Memcache(Redis)所花费的时间。

据我所知,New Relic目前还不支持ASGI。 - doniyor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接