gunicorn max-requests 选项的作用

gunicorn 是Python中常见的一个服务网关,它有这么一个特性就是,处理完一定量的请求之后,就会把那个worker重启,用一个新的 worker来替代之。但是,这样做的目的是什么呢?

我翻了以下官网的文档,有如下描述:

* Implement max-requests feature to prevent memory leaks.

但是除此之外,是否还有其它好处呢?在翻阅DDIA的时候,我看到了一个好处:避免GC。

可以说的上一句,与Go、Java等语言的GC来比,Python的GC性能并不高,与前两者相比可以说的上是糟糕,定量重启可以避免GC,因为 随着进程运行,对象可能会越来越多,当对象多起来之后,GC的 Stop The World 的时间就会变长,因此当请求数量达到一定程度 之后,对worker进行重启处理是一个比较好的方案,同时结合 graceful restart,对用户来说并没有特别大的影响。

参见 DDIA 英文版 299页。

但是这么做是否有坏处呢?是有的。当应用大起来之后,启动一个Python进程,就会比较耗时,因为要加载很多东西。因为CPython没有 JIT,因此对着一方面影响倒是不大,但是如果有JIT,会影响先前预热的结果,如果JIT没有对先前预热的结果进行保存,那么当worker 重启之后,就需要重新预热。


最后总结以下,gunicorn定量对worker进行重启,有如下好处:

  • 定期清理资源,防止内存泄漏
  • 避免对象存活时间太久,从而导致GC时间过长

更多文章
  • 编程语言中的 context 是什么?
  • flutter macOS 构建出错
  • Flatpak 使用小记
  • Golang CAS 操作是怎么实现的
  • PostgreSQL 当MQ来使用
  • Clash 结合 工作VPN 的网络设计
  • 使用 PostgreSQL 搭建 JuiceFS
  • PostgreSQL 配置优化和日志分析
  • 有GitHub Copilot?那就可以搭建你的ChatGPT4服务
  • 窗口函数的使用(以PG为例)
  • 读《为什么学生不喜欢上学》
  • OpenAI Prompt Engineering 摘录和总结
  • 读《打造真正的新产品》
  • 2023年终总结
  • VueJS 总结