
我對 apache 和 django 的組合很陌生,坦白說,我對如何處理多線程很天真。具體來說,我在 Windows 伺服器上運行,所以我知道 MPM 僅是基於線程的。
我有一個為網站頁面提供服務的應用程序,另一個應用程式執行 CPU 密集型後台進程,該進程時常發生,需要 30 秒左右的時間。我擔心我可能會遇到效能問題並有幾個問題,我希望這些也能幫助其他人...
- apache如何在執行緒之間分配並發請求? CPU 之間呢?這是怎樣的邏輯驅動的?每個請求都會產生一個單獨的執行緒嗎?
- 我可以手動指定某個應用程式在單獨的 CPU 上運行嗎?例如,如果我有一台有 4 個 CPU 的機器,我可以設定 1 個 CPU 用於網站請求,另外 3 個用於按需運行後台進程嗎?
- 多個執行緒如何讀取/寫入同一個資料庫?我不希望發生衝突,因為寫入將按使用者進行,但我不知道實際上是如何處理的。
- 如果我有不只一台這樣的機器,例如在 EC2 上運行並且有多個實例,會發生什麼情況?請求是如何分配的?
謝謝
答案1
一般閱讀請參閱:
- http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading
- http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html
apache如何在執行緒之間分配並發請求?
對於多執行緒配置,有一個預先建立的執行緒池。當新請求到達時,該請求將被移交給池中的可用執行緒之一進行處理。完成後,線程返回池中。
apache如何在CPU之間分配並發請求?
事實並非如此,執行緒在任何特定時間點運行的位置是由作業系統決定的。 Apache 不會將執行緒綁定到特定處理器,因此執行可以移動。
每個請求都會產生一個單獨的執行緒嗎?
對於 Apache 處理的 Web 請求,答案是否定的。
我可以手動指定某個應用程式在單獨的 CPU 上運行嗎?
您可以透過多種方法設定處理器關聯性以將進程綁定到處理器,但具體操作方式取決於系統。據我所知,Apache 本身並沒有提供任何設定機制來對其自身執行此操作。
多個執行緒如何讀取/寫入同一個資料庫?
小心。通常資料庫伺服器進程會擔心所有這些,因此您不必擔心。在客戶端中,您確實需要透過為每個請求建立一個資料庫連接來確保每個線程都使用自己的資料庫連接,或者您有一個資料庫連接池,並且在需要時線程在需要時從池中獲取連接並在需要式返回它完畢。
請注意,這假定資料庫的存取是透過伺服器進程進行中介的。如果您使用的是基於檔案系統的資料庫,那麼資料庫用戶端程式庫應該確保多執行緒存取是安全的。
如果我有不只一台這樣的機器,例如在 EC2 上運行並且有多個實例,會發生什麼情況?請求是如何分配的?
您需要某種前端負載平衡器來分發請求。這可能是合適的負載平衡器,或者您可以使用 nginx 前端作為代理。