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时间过长

更多文章
  • 2023年终总结
  • VueJS 总结
  • Linux 自动挂载 alist 提供的webdav
  • FreeBSD 使用 vm-bhyve 安装Debian虚拟机
  • FreeBSD 和 Linux 网卡聚合实现提速
  • GPT 帮我搞定了时区转换问题
  • 长任务系统如何处理?
  • macOS/Linux 编译 InputLeap
  • 使用开源软KVM - synergy-core
  • 解决 macOS 终端hostname一直变化问题
  • KVM 共享 Intel 集成显卡
  • PromQL 备忘
  • 读《格鲁夫给经理人的第一课》
  • 读《打开心智》
  • 为什么要把复杂的联表操作拆成多个单表查询?