每一個工做程序都是一個加載Python應用程序的UNIX進程。工做人員之間沒有共享內存。
建議的數量workers是(2*CPU)+1。
對於雙核(2 CPU)計算機,建議workers值爲5 。python
gunicorn --workers = 5 main:app
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
有一些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服務器的設置,使用更多資源或從新設計應用程序以使用不一樣的編程範例是咱們提升總體應用程序性能所需的解決方案。在這種狀況下,構建系統意味着瞭解咱們可用於部署高性能應用程序的計算資源的類型(進程,線程和「僞線程」)。經過了解,設計和實施具備正確資源的正確技術解決方案,咱們避免陷入嘗試經過優化應用程序代碼來提升性能的陷阱。異步