8

gunicorn max-requests 选项的作用

 4 years ago
source link: https://jiajunhuang.com/articles/2020_03_25-gunicorn_max_requests.md.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

Go语言性能优化实战

那些年开发的时候踩过的坑

(关系型)数据库优化总结

动态规划民科教程

Golang 分布式异步任务队列 Machinery 教程

使用geohash完成地理距离计算

2018年就要到了,这一年都做了什么呢?

算法导论阅读笔记 --- 排序算法

Git HTTPS 如何保存密码

短链系统的实现

程序员修炼之道 阅读笔记

Python开发实践经验

Golang实现平滑重启(优雅重启)

traefik 教程

Nginx作为TCP/UDP的负载均衡




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK