python之gunicorn配置詳解
python之gunicorn配置
- 起因:因?yàn)閏pu利用率低導(dǎo)致我去縮容,雖然縮容之后cpu利用率上升維持在60%左右,但是程序響應(yīng)耗時(shí)增加了。
- 解釋:因?yàn)閏pu干這件活本身不累,但在干這件活的時(shí)候不能去干其他事情,導(dǎo)致并發(fā)的請(qǐng)求不能及時(shí)響應(yīng),導(dǎo)致耗時(shí)增加。比如,sleep1s,此時(shí)cpu利用率為0,但是cpu卻做不了其他的處理。其他任務(wù)就被阻塞。
- 解法:增加cpu的線(xiàn)程數(shù)。
但我任務(wù)的配置其實(shí)是協(xié)程,而不是多線(xiàn)程。

gunicorn當(dāng)worker_class = 'gevent’時(shí),如何增加程序的并發(fā)能力?
在 Gunicorn 中使用 worker_class = 'gevent'(基于協(xié)程的異步 Worker)時(shí),提升并發(fā)能力的關(guān)鍵在于 合理配置協(xié)程并發(fā)數(shù) 和 優(yōu)化資源分配。
以下是具體方法和步驟:
一、gevent 的并發(fā)原理
gevent 通過(guò) 協(xié)程(Coroutine) 和 事件循環(huán)(Event Loop) 實(shí)現(xiàn)高并發(fā),每個(gè)請(qǐng)求由協(xié)程處理而非線(xiàn)程或進(jìn)程。
協(xié)程的切換成本極低,因此適用于 I/O 密集型 場(chǎng)景(如 HTTP API、數(shù)據(jù)庫(kù)查詢(xún)、外部服務(wù)調(diào)用等)。
二、提升并發(fā)能力的核心參數(shù)
1. Worker 進(jìn)程數(shù) (--workers/workers)
- 作用:指定啟動(dòng)的 Worker 進(jìn)程數(shù)量。每個(gè) Worker 是一個(gè)獨(dú)立進(jìn)程,內(nèi)部通過(guò)協(xié)程處理并發(fā)。
- 建議值:通常設(shè)置為
CPU 核心數(shù) × 2 + 1。例如 4 核 CPU 可設(shè)workers = 9。 - 示例:
gunicorn --workers=9 --worker-class=gevent app:app
2. 每個(gè) Worker 的并發(fā)連接數(shù) (--worker-connections/worker_connections)
- 作用:?jiǎn)蝹€(gè) Worker 進(jìn)程能處理的最大并發(fā)連接數(shù)。此參數(shù)直接影響協(xié)程池大小。
- 建議值:默認(rèn)
1000,可調(diào)整為1000~5000(需根據(jù)內(nèi)存和負(fù)載測(cè)試調(diào)整)。 - 示例:
gunicorn --workers=9 --worker-class=gevent --worker-connections=2000 app:app
3. 超時(shí)時(shí)間 (--timeout/timeout)
- 作用:防止單個(gè)請(qǐng)求長(zhǎng)時(shí)間阻塞協(xié)程。
- 建議值:根據(jù)接口響應(yīng)時(shí)間設(shè)定(如
--timeout=30表示 30 秒超時(shí))。
三、完整配置示例
1. 通過(guò)命令行啟動(dòng)
gunicorn \ --workers=9 \ # Worker 進(jìn)程數(shù) = CPU核心數(shù) × 2 + 1 --worker-class=gevent \ # 使用 gevent Worker --worker-connections=2000 \ # 每個(gè) Worker 的協(xié)程并發(fā)數(shù) --timeout=30 \ # 請(qǐng)求超時(shí)時(shí)間 --bind=0.0.0.0:8000 \ # 綁定端口 app:app # 應(yīng)用入口
2. 通過(guò)配置文件 (gunicorn.conf.py)
# gunicorn.conf.py workers = 9 worker_class = "gevent" worker_connections = 2000 timeout = 30 bind = "0.0.0.0:8000"
啟動(dòng)命令:
gunicorn -c gunicorn.conf.py app:app
四、關(guān)鍵優(yōu)化點(diǎn)
1. 內(nèi)存限制
- 每個(gè) Worker 的協(xié)程數(shù) (
worker_connections) 受內(nèi)存限制。協(xié)程越多,內(nèi)存占用越高。 - 監(jiān)控內(nèi)存:使用
top或htop觀察進(jìn)程內(nèi)存,避免觸發(fā) OOM(內(nèi)存不足)。
2. I/O 密集型 vs CPU 密集型
- I/O 密集型(如 HTTP API、數(shù)據(jù)庫(kù)查詢(xún)):優(yōu)先增加
worker_connections。 - CPU 密集型(如圖像處理、復(fù)雜計(jì)算):協(xié)程無(wú)法提升性能,需改用多進(jìn)程(如
gthreadWorker)。
3. 數(shù)據(jù)庫(kù)連接池
- 協(xié)程并發(fā)高時(shí),需確保數(shù)據(jù)庫(kù)連接池足夠大(如 SQLAlchemy 的
pool_size)。
4. 依賴(lài)庫(kù)兼容性
- 確保所有代碼和第三方庫(kù)兼容
gevent(可能需要monkey.patch_all())。
5. 啟動(dòng)前添加補(bǔ)丁:
# app.py 入口文件頂部 from gevent import monkey monkey.patch_all()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python編寫(xiě)一個(gè)串口調(diào)試工具
這篇文章主要為大家詳細(xì)介紹了如何基于 Python編寫(xiě)一個(gè)tkinter 和 pyserial 的串口調(diào)試工具,可以方便地進(jìn)行串口通信的設(shè)置等操作,感興趣的小伙伴可以了解下2025-02-02
Django框架ORM操作數(shù)據(jù)庫(kù)不生效問(wèn)題示例解決方法
本文詳細(xì)描述使用Django 的ORM框架操作PostgreSQL數(shù)據(jù)庫(kù)刪除不生效問(wèn)題的定位過(guò)程及解決方案,并總結(jié)使用ORM框架操作數(shù)據(jù)庫(kù)不生效的問(wèn)題的通用定位方法,感興趣的朋友跟隨小編一起看看吧2023-01-01
使用Djongo模塊在Django中使用MongoDB數(shù)據(jù)庫(kù)
Django框架為我們提供了簡(jiǎn)潔方便的ORM模型供我們對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作,但是這個(gè)“數(shù)據(jù)庫(kù)”卻并不包括NoSQL的典型——MongoDB。不少Django初學(xué)者也會(huì)到處詢(xún)問(wèn),如何才能在Django中使用MongoDB。本文將介紹使用Djongo來(lái)在Django中集成MongoDB數(shù)據(jù)庫(kù)2021-06-06
python使用for...else跳出雙層嵌套循環(huán)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python使用for...else跳出雙層嵌套循環(huán)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
python中WSGI是什么,Python應(yīng)用WSGI詳解
這篇文章主要介紹一下python中的WSGI, 小編在網(wǎng)上找了幾篇非常好的關(guān)于WSGI介紹,整理一下分享給大家。2017-11-11
Python 輸出時(shí)去掉列表元組外面的方括號(hào)與圓括號(hào)的方法
今天小編就為大家分享一篇Python 輸出時(shí)去掉列表元組外面的方括號(hào)與圓括號(hào)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
我用Python給班主任寫(xiě)了一個(gè)自動(dòng)閱卷腳本(附源碼)
這篇文章主要介紹了如何用Python給寫(xiě)了一個(gè)自動(dòng)閱卷腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python正確調(diào)用 jar 包加密得到加密值的操作方法
這篇文章主要介紹了Python 正確調(diào)用 jar 包加密得到加密值的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

