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时间过长
更多文章
本站热门
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- frp 源码阅读与分析(一):流程和概念
- 用peewee代替SQLAlchemy
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(一):runc和containerd
- Docker组件介绍(二):shim, docker-init和docker-proxy
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程