通過優化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 。

gunicorn --workers = 5 main:app

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

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

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

workers * threads在我們的情況下,最大並發請求數為10。
使用輔助線程和線程時,建議的最大並發請求數仍為(2*CPU)+1。
因此,如果我們使用的是四核(4 CPU)計算機,並且要使用工作程序和線程的混合,則可以使用3個工作程序和3個線程,以獲取9個最大並發請求。

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

3 第三種並發方式(“偽線程”)

有一些Python庫(例如gevent和Asyncio)通過使用由協程實現的“偽線程”在Python中啟用並發。
Gunicorn通過設置它們的相應工作程序類,允許使用這些異步Python庫。
這里的設置適用於我們要使用gevent以下命令運行的單核計算機:

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。

2 如果應用程序受CPU限制,則應用程序處理多少個並發請求都無關緊要。唯一重要的是並行請求的數量。由於Python的GIL,線程和“偽線程”無法並行運行。實現並行性的唯一方法是增加到workers 建議的(2*CPU)+1,要理解的是,並行請求的最大數量是內核數。

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

4 如果您不知道自己在做什么,請從最簡單的配置開始,該配置僅設置workers為(2*CPU)+1,無需擔心threads。從那時起,基准測試全都在反復試驗。如果瓶頸是內存,請開始引入線程。如果瓶頸是I / O,請考慮使用其他python編程范例。如果瓶頸是CPU,請考慮使用更多的內核並調整其workers值。

建立系統

軟件開發人員通常認為,可以通過優化應用程序代碼來解決每個性能瓶頸,但並非總是如此。有時候,調整HTTP服務器的設置,使用更多資源或重新設計應用程序以使用不同的編程范例是我們提高整體應用程序性能所需的解決方案。在這種情況下,構建系統意味着了解我們可用於部署高性能應用程序的計算資源的類型(進程,線程和“偽線程”)。通過了解,設計和實施具有正確資源的正確技術解決方案,我們避免陷入嘗試通過優化應用程序代碼來提高性能的陷阱。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM