2009-09-25 74 views
6

首先,我對Django站點的性能沒有任何不滿,它沒有獲得大量的流量,到目前爲止每天訪問次數超過1000次。在Django中的併發性(apache2 prefork/mod_wsgi),我做錯了什麼?

我很好奇它將如何應對交通繁忙的高峯,所以我使用ab工具來做一些基準測試。

我注意到,併發性大於1時的性能與1個併發連接的請求量相同。

不應該要求/ s增加併發?

在具有1 GB RAM,apache2(prefork),mod_wsgi,memcached和mysql的虛擬機上運行。
頁面上的所有內容已被緩存,數據庫不會採取任何命中。如果memcached將刪除條目,那麼只有兩個輕量級(索引)查詢 - 並應立即重新緩存。

基準數據:(注:我沒有基準它與2000年和10K的請求,結果相同)

對於起始頁,通過的Apache2/mod_wsgi的送達Django的:
-n100 -c4:http://dpaste.com/97999/ (58.2請求數/秒)
-n100 -c1:http://dpaste.com/97998/(57.7請求數/秒)

對於robots.txt的,直接從apache2的:
-n100-C4:http://dpaste.com/97992/(4917個請求數/秒)
-n100 -C1:http://dpaste.com/97991/(1412個請求數/秒)

這是我的Apache的conf:http://dpaste.com/97995/

編輯:增加了更多的信息

wsgi.conf:http://dpaste.com/98461/

mysite的。 conf:http://dpaste.com/98462/

我的wsgi處理程序:

import os, sys 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 
import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 
+2

您不指示Apache是​​否使用prefork或worker MPM進行編譯。您不提供您使用的配置來讓您的應用程序由mod_wsgi託管,因此不知道您使用的是嵌入模式還是守護程序模式。使用100個基準樣本請求也不會產生好的結果,通常您會想要使用數千個樣本。也不知道你是否確定你已經消除了啓動延遲。 Apache/mod_wsgi將懶惰地加載Python web應用程序。也沒有跡象表明您的請求是否針對數據庫以及是否存在問題。需要更多信息。 – 2009-09-26 04:10:59

+0

添加更多信息。我用2000和10k請求做了基準測試,結果相同。 該請求根本不會觸及數據庫,我確定所有內容都被緩存(memcached),而top只告訴我它只有正在使用(全部)資源的apache進程。 – schmilblick 2009-09-26 07:10:00

+0

哦,我實際上已在標題中「prefork」,以便提供信息。爲了清晰起見,現在將其添加到文本中。 – schmilblick 2009-09-26 07:16:00

回答

12

由於您在嵌入模式下使用prefork MPM和mod_wsgi以及大量進程,因此可能會導致您的盒子性能下降。一開始,建議您閱讀:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

使用嵌入模式像你這樣,你需要仔細調整你的MPM參數。將MaxRequestsPerChild設置爲非零並不是一個好的開始,因爲您將定期強制執行A​​pache進程,結果是您將導致負載高峯,因爲所有內容都必須重新加載。

建議工人MPM和你的Python web應用程序以mod_wsgi守護進程模式運行。這一開始將導致運行的進程少得多,內存開銷減少,並且在系統性能方面提供更多的可預測性。然後可以開始更仔細地研究爲什麼事情可能會運行得更慢。

有一點要注意的是你所得到的「AB」輸出以下部分:

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  0 0 0.2  0  2 
Waiting:  0 0 0.1  0  2 
Total:   0 0 0.2  0  2 

如果最大列顯示較大的值,那麼你得到的,由於應用程序加載的費用打要麼不能通過預加載從測試中消除它們,要麼通過短暫的進程重啓時間間隔來消除它們。

+0

謝謝!我沒有意識到mod_wsgi可以在守護進程模式下運行。我將通過幾次閱讀並調整我的設置。 如果我正確地閱讀了你的建議,你說我不應該運行prefork版本的apache2? – schmilblick 2009-09-28 06:58:59

+2

如果您使用守護進程模式運行Python WSGI應用程序,那麼不要擔心運行worker MPM,因爲Python代碼不能再在覈心Apache服務器子進程中運行。如果你還使用mod_php運行PHP,那麼仍然會遇到運行prefork MPM的問題。不過,如果不依賴於mod_php或任何其他需要單線程Apache進程的Apache模塊,那麼最好使用worker MPM。即使您仍然需要運行單線程prefork MPM,mod_wsgi守護進程仍然可以是多線程的。 – 2009-09-28 07:47:49