python之gunicorn配置詳解
python之gunicorn配置
- 起因:因為cpu利用率低導致我去縮容,雖然縮容之后cpu利用率上升維持在60%左右,但是程序響應耗時增加了。
- 解釋:因為cpu干這件活本身不累,但在干這件活的時候不能去干其他事情,導致并發(fā)的請求不能及時響應,導致耗時增加。比如,sleep1s,此時cpu利用率為0,但是cpu卻做不了其他的處理。其他任務就被阻塞。
- 解法:增加cpu的線程數(shù)。
但我任務的配置其實是協(xié)程,而不是多線程。
gunicorn當worker_class = 'gevent’時,如何增加程序的并發(fā)能力?
在 Gunicorn 中使用 worker_class = 'gevent'
(基于協(xié)程的異步 Worker)時,提升并發(fā)能力的關鍵在于 合理配置協(xié)程并發(fā)數(shù) 和 優(yōu)化資源分配。
以下是具體方法和步驟:
一、gevent 的并發(fā)原理
gevent
通過 協(xié)程(Coroutine) 和 事件循環(huán)(Event Loop) 實現(xiàn)高并發(fā),每個請求由協(xié)程處理而非線程或進程。
協(xié)程的切換成本極低,因此適用于 I/O 密集型 場景(如 HTTP API、數(shù)據(jù)庫查詢、外部服務調(diào)用等)。
二、提升并發(fā)能力的核心參數(shù)
1. Worker 進程數(shù) (--workers
/workers
)
- 作用:指定啟動的 Worker 進程數(shù)量。每個 Worker 是一個獨立進程,內(nèi)部通過協(xié)程處理并發(fā)。
- 建議值:通常設置為
CPU 核心數(shù) × 2 + 1
。例如 4 核 CPU 可設workers = 9
。 - 示例:
gunicorn --workers=9 --worker-class=gevent app:app
2. 每個 Worker 的并發(fā)連接數(shù) (--worker-connections
/worker_connections
)
- 作用:單個 Worker 進程能處理的最大并發(fā)連接數(shù)。此參數(shù)直接影響協(xié)程池大小。
- 建議值:默認
1000
,可調(diào)整為1000~5000
(需根據(jù)內(nèi)存和負載測試調(diào)整)。 - 示例:
gunicorn --workers=9 --worker-class=gevent --worker-connections=2000 app:app
3. 超時時間 (--timeout
/timeout
)
- 作用:防止單個請求長時間阻塞協(xié)程。
- 建議值:根據(jù)接口響應時間設定(如
--timeout=30
表示 30 秒超時)。
三、完整配置示例
1. 通過命令行啟動
gunicorn \ --workers=9 \ # Worker 進程數(shù) = CPU核心數(shù) × 2 + 1 --worker-class=gevent \ # 使用 gevent Worker --worker-connections=2000 \ # 每個 Worker 的協(xié)程并發(fā)數(shù) --timeout=30 \ # 請求超時時間 --bind=0.0.0.0:8000 \ # 綁定端口 app:app # 應用入口
2. 通過配置文件 (gunicorn.conf.py
)
# gunicorn.conf.py workers = 9 worker_class = "gevent" worker_connections = 2000 timeout = 30 bind = "0.0.0.0:8000"
啟動命令:
gunicorn -c gunicorn.conf.py app:app
四、關鍵優(yōu)化點
1. 內(nèi)存限制
- 每個 Worker 的協(xié)程數(shù) (
worker_connections
) 受內(nèi)存限制。協(xié)程越多,內(nèi)存占用越高。 - 監(jiān)控內(nèi)存:使用
top
或htop
觀察進程內(nèi)存,避免觸發(fā) OOM(內(nèi)存不足)。
2. I/O 密集型 vs CPU 密集型
- I/O 密集型(如 HTTP API、數(shù)據(jù)庫查詢):優(yōu)先增加
worker_connections
。 - CPU 密集型(如圖像處理、復雜計算):協(xié)程無法提升性能,需改用多進程(如
gthread
Worker)。
3. 數(shù)據(jù)庫連接池
- 協(xié)程并發(fā)高時,需確保數(shù)據(jù)庫連接池足夠大(如 SQLAlchemy 的
pool_size
)。
4. 依賴庫兼容性
- 確保所有代碼和第三方庫兼容
gevent
(可能需要monkey.patch_all()
)。
5. 啟動前添加補丁:
# app.py 入口文件頂部 from gevent import monkey monkey.patch_all()
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pytorch GAN偽造手寫體mnist數(shù)據(jù)集方式
今天小編就為大家分享一篇pytorch GAN偽造手寫體mnist數(shù)據(jù)集方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01淺析Django 接收所有文件,前端展示文件(包括視頻,文件,圖片)ajax請求
這篇文章主要介紹了Django 接收所有文件,前端展示文件(包括視頻,文件,圖片)ajax請求,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下2020-03-03Python中字符串,列表與字典的常用拼接方法總結(jié)
有時在數(shù)據(jù)處理時,需要對數(shù)據(jù)進行拼接處理,比如字符串的拼接、列表的拼接等,本文主要是介紹了字符串、列表、字典常用的拼接方法,希望對大家有所幫助2024-02-02python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標
今天小編就為大家分享一篇python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python中NumPy的線性代數(shù)子模塊linalg詳解
這篇文章主要介紹了Python中NumPy的線性代數(shù)子模塊linalg詳解,NumPy 的線性代數(shù)子模塊linalg提供了 20 余個函數(shù),用于求解行列式、逆矩陣、特征值、特征向量,以及矩陣分解等,需要的朋友可以參考下2023-08-08Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解
今天小編就為大家分享一篇關于Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02keras 模型參數(shù),模型保存,中間結(jié)果輸出操作
這篇文章主要介紹了keras 模型參數(shù),模型保存,中間結(jié)果輸出操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07