簡體   English   中英

Flask --without-threads 在 CPU 綁定任務上比 --with-threads 提供更好的性能?

[英]Flask --without-threads gives better performance than --with-threads on CPU-bound tasks?

我正在使用 Apache JMeter 來測試一個微型 Flask 應用程序。 該應用程序執行某種 CPU 密集型任務。

令人驚訝的是,使用--without-threads運行 Flask 應用程序比使用--with-threads運行得到明顯更好的結果。 怎么可能?

Apache JMeter 的一些設置和各自的結果是:

線程數(用戶) 循環計數 沒有線程所花費的時間(秒) 線程花費的時間(秒)
5個 1000 14 17
10 500 14 18
5個 3000 43 51
10 1500 43 56

我希望,在純 CPU 綁定任務的情況下,多線程版本應該至少與單線程版本一樣快。 讓我解釋:

在執行實際 CPU 任務方面,我希望兩個版本執行相同的操作。 然而,就下一個線程的服務速度而言,我希望多線程版本有一點優勢,因為請求已經被 Flask 服務並且它只是卡在等待 CPU 中。

在單線程版本(即--without-threads )中,一次只服務一個請求,而所有其他請求都在等待 Flask 服務。換句話說,Flask 有一定的“服務開銷”介紹。

在理想情況下,Flask 可以立即滿足新請求。 換句話說,服務於 HTTP 請求的 Flask 的開銷將為 0。在這種情況下,我希望單線程和多線程版本同樣快,因為線程是否等待沒有區別由 Flask 服務或等待訪問 CPU。

我猜我的理解是不正確的。 我哪里錯了?

正如@Thomas 所建議的,我使用生產就緒服務器運行了更多測試。 我選擇的服務器是 gunicorn,因為使用 Python 3.9 很容易設置。

gunicorn 接受兩個與此主題相關的命令行 arguments:

  1. --workers - “處理請求的工作進程數。” 默認值為 1。
  2. --threads - “用於處理請求的工作線程數。” 默認值也是 1。

--workers增加到我的 CPU 可以處理的程度確實提高了性能。 增加--threads沒有。 此外,運行 1 個線程的 8 個 worker 比運行 4 個線程的 8 個 worker 得到更好的結果。

因此,我嘗試通過休眠半秒鍾來模擬一些 I/O。 最后,增加線程數確實提高了性能。

我的應用程序也是 CPU 綁定應用程序。 我通過 --worker --worker-class=gthread使用 gthread 模式 gunicorn,結果比另一種模式更好。 你可以試試看。 更多信息: https://medium.com/building-the-system/gunicorn-3-means-of-concurrency-efbb547674b7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM