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

更多文章
  • Golang context源码阅读与分析
  • Golang中的并发控制
  • 善用闭包(closure)让Go代码更优雅
  • Golang的可选参数实践
  • FreeBSD ipfw使用教程
  • Golang expvar库源码阅读
  • Golang SQL生成库 Squirrel 教程及源码阅读
  • Golang validator使用教程
  • 使用Redis的Stream模块实现群聊功能
  • 价值编程与职业发展
  • 解决k8s cron无法读取环境变量的问题
  • 应用内购的坑
  • 两种常见的访问控制模型
  • gunicorn max-requests 选项的作用
  • Redis使用中的几点注意事项