nginx 优化Gunicorn配置以实现高并发I/O密集型任务,同时降低CPU和内存使用率

ajsxfq5m  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(80)

我目前正在管理一个托管在16核服务器上的Django应用程序。尽管有25%的最大CPU和内存使用率,但根据Nginx的统计数据,性能在大约400个活动连接时开始下降。目前,我们有12个Gunicorn worker,低于推荐的(2 * CPU) + 1。然而,根据Gunicorn的文档,4-12 worker每秒应该处理数百到数千个请求。
1.**关于Worker配置的问题:**是否有人成功使用了超过12个worker,特别是在CPU和内存使用率较低的场景中?对于这种情况下高并发场景的最佳配置有何见解?
1.**性能优化:**我们的应用程序主要涉及I/O任务。尽管优化了数据库查询,CPU和内存使用率较低,但性能仍然是一个问题。在I/O受限且资源似乎未得到充分利用的情况下,增加worker数量或引入线程(总计为(2 * CPU) + 1)是否是提高性能的可行解决方案?这意味着如果我使用(2 * CPU) + 1,则将worker设置为33,或者将10 worker设置为3线程?
1.**其他注意事项:**我们正在考虑调整Gunicorn配置,但希望确保我们在CPU和内存使用率较低的情况下走在正确的轨道上。在资源使用率未得到充分利用的情况下,针对I/O密集型工作负载优化Gunicorn是否有任何其他注意事项或最佳实践?
任何意见,经验,或建议将不胜感激.谢谢!

bwitn5fc

bwitn5fc1#

  • 首先你的观点是:你的应用程序运行I/O任务,所以它是一个I/O绑定,你的服务器不会占用太多的CPU。大量的工作者不一定更好。对于一个I/O绑定的应用程序,你可以使用gevent工作者。当你需要并发性并且你的大部分工作都是I/O绑定的(网络调用,文件访问,数据库等)时,gevent是最好的选择。
  • 第二:服务器的大部分工作都是查询数据库,所以数据库是处理发生的地方,需要CPU而不是你的django应用程序。你可以检查你的驱动程序数据库是否可以使用async mode,而不是增加工人的数量。
  • 最终:你只需要注意三个参数:工作模式,工作数量,线程数量来服务数量请求。

相关问题