我正在 AWS EC2 实例上运行 python Django 应用程序。它使用gunicorn和nginx为应用程序提供服务,EC2位于应用程序负载均衡器后面。有时我会收到 504 错误,每个人都无法访问整个 EC2 实例(包括通过我一直使用的 SSH)。然后我需要重新启动所有需要时间的事情。
我可以通过重载应用程序来复制错误(例如上传和处理非常大的图像),在这种情况下,gunicorn工作线程超时(我在日志中看到超时消息),出现504错误并且实例变得无法访问。我将枪角兽设置为 5 分钟(300 秒)后超时,但它倒下的速度比这要快。 CloudWatch 日志中没有任何真正有用的内容。
我正在寻找解决所有当前和 future 案例的方法。也就是说,我希望出现这样的情况:如果网站过载,它会返回错误消息,而不是每个人都完全无法访问。有办法做到这一点吗?
最佳答案
为了找出原因,这里有很多事情需要考虑和测试,但我认为这是 OOM(内存不足),主要是因为你甚至必须重新启动才能登录 SSH。
Nginx uses "event‑driven" approach to handle requests so a single worker of nginx can handle 1000s of req simultaneously. But Gunicorn on the other hand mostly(by default) uses sync worker which means a request will remain with a worker till it is processed.
当您提出一个大请求时,您的计算机会尝试处理该请求,直到发生溢出,大多数情况下它不会被计算机内运行的任何服务检测到。只需尝试通过 AWS 中的任何监控工具或仅使用 SSH 来监控内存,并在调用 API 之前使用 htop
即可。
在大多数情况下,Django/gunicorn 的罪魁祸首是 oom。
编辑:
据我所知,您无法捕获(缓存)oom,您唯一能做的就是事后处理,即系统重新启动后看到/var/logs/syslogs ...正如我所说的在AWS内存监视器中进行监视(我没有太多AWS 经验)。
关于解决方案,
您首先增加 EC2 的内存,直到不再出现错误为止,看看问题有多大。
然后,您可以通过分析哪个部分实际占用了这么多内存来优化您的应用程序。我没有使用过任何内存分析,所以也许你可以告诉我哪个更好。 您唯一能做的就是优化您的应用程序,了解常见问题、最佳实践、查询优化等。
https://haydenjames.io/how-to-diagnose-oom-errors-on-linux-systems/ https://www.pluralsight.com/blog/tutorials/how-to-profile-memory-usage-in-python
关于django - AWS 上的 nginx 和 Gunicorn 出现 504 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63777057/