經過優化Gunicorn配置得到更好的性能

對於受CPU限制的應用程序,增長了工做程序和/或內核。對於受I / O限制的應用程序,請使用「僞線程」。

Gunicorn是Python WSGI HTTP Server,一般駐留在反向代理(例如Nginx)或負載平衡器(例如AWS ELB)和Web應用程序(例如Django或Flask)之間。

1 第一種併發方式(工做者,又名UNIX進程)

每一個工做程序都是一個加載Python應用程序的UNIX進程。工做人員之間沒有共享內存。
建議的數量workers是(2*CPU)+1。
對於雙核(2 CPU)計算機,建議workers值爲5 。python

gunicorn --workers = 5 main:app

2 第二種併發方式(線程)

Gunicorn還容許每一個工人都有多個線程。在這種狀況下,每一個工做程序會加載一次Python應用程序,而且同一工做程序產生的每一個線程都共享相同的內存空間。
要將線程用於Gunicorn,請使用threads設置。每次使用時threads,worker類都設置爲gthread:nginx

gunicorn --workers = 5 --threads = 2 main:app

workers * threads在咱們的狀況下,最大併發請求數爲10。
使用輔助線程和線程時,建議的最大併發請求數仍爲(2*CPU)+1。
所以,若是咱們使用的是四核(4 CPU)計算機,而且要使用工做程序和線程的混合,則可使用3個工做程序和3個線程,以獲取9個最大併發請求。web

gunicorn --workers = 3 --threads = 3 main:app

3 第三種併發方式(「僞線程」)

有一些Python庫(例如gevent和Asyncio)經過使用由協程實現的「僞線程」在Python中啓用併發。
Gunicorn經過設置它們的相應工做程序類,容許使用這些異步Python庫。
這裏的設置適用於咱們要使用gevent如下命令運行的單核計算機:django

gunicorn --worker-class = gevent --worker-connections = 1000 --workers = 3 main:app

worker-connections是gevent worker類的特定設置。
(2CPU)+1仍然建議使用,workers由於咱們只有1個核心,咱們將使用3個工做線程。
在這種狀況下,最大併發請求數爲3000(3個工做程序
每一個工做程序1000個鏈接)編程

實際用例

經過調整Gunicorn設置,咱們但願優化應用程序性能。
1 若是應用程序受I / O限制,則最佳性能一般來自使用「僞線程」(gevent或asyncio)。如咱們所見,Gunicorn經過設置適當的worker類並調整workersto 的值來支持這種編程範例(2*CPU)+1。flask

2 若是應用程序受CPU限制,則應用程序處理多少個併發請求都可有可無。惟一重要的是並行請求的數量。因爲Python的GIL,線程和「僞線程」沒法並行運行。實現並行性的惟一方法是增長到workers 建議的(2*CPU)+1,要理解的是,並行請求的最大數量是內核數。服務器

3 若是有一個關於應用程序的關注內存佔用,使用threads 和其對應的g線程工人階級有利於workers產生更好的性能,由於應用程序加載每一個工人和工人股運行一些內存每一個線程一次,這涉及到一些費用額外的CPU消耗。併發

4 若是您不知道本身在作什麼,請從最簡單的配置開始,該配置僅設置workers爲(2*CPU)+1,無需擔憂threads。從那時起,基準測試全都在反覆試驗。若是瓶頸是內存,請開始引入線程。若是瓶頸是I / O,請考慮使用其餘python編程範例。若是瓶頸是CPU,請考慮使用更多的內核並調整其workers值。app

創建系統

軟件開發人員一般認爲,能夠經過優化應用程序代碼來解決每一個性能瓶頸,但並不是老是如此。有時候,調整HTTP服務器的設置,使用更多資源或從新設計應用程序以使用不一樣的編程範例是咱們提升總體應用程序性能所需的解決方案。在這種狀況下,構建系統意味着瞭解咱們可用於部署高性能應用程序的計算資源的類型(進程,線程和「僞線程」)。經過了解,設計和實施具備正確資源的正確技術解決方案,咱們避免陷入嘗試經過優化應用程序代碼來提升性能的陷阱。異步

相關文章
相關標籤/搜索