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

微信公众号
关注公众号,获得及时更新

更多文章
  • 为啥Redis使用pipelining会更快?
  • 通过阳台种菜实现蔬菜自由
  • 从GORM里学习到的panic处理方式
  • Go使用闭包简化数据库操作代码
  • TCMalloc设计文档学习
  • Flask和requests做一个简单的请求代理
  • Linux常用命令(四):xargs
  • Linux常用命令(二):htop
  • Linux常用命令(三):watch
  • Linux常用命令(一):netcat
  • 结合Flask 与 marshmallow快速进行参数校验
  • 规整数据的重要性
  • apt安装特定包以及忽略升级某个包
  • Goroutine是如何处理栈的?
  • StackGuard的作用