2012-09-26 143 views
6

我剛剛從apache prefork移動到worker並開始以守護進程模式運行mod_wsgi。到現在爲止還挺好。我還沒有經歷最大負載,但服務器似乎更一致,我們沒有看到隨機請求需要2分鐘等待mod_wsgi響應。內存佔用從3.5G變爲1G。這太棒了。我們正在使用6G內存的單個VPS運行。在此sevrer上運行一個Django應用程序以及一個memcache實例,我們已經爲其分配了1G的ram。我們有一個單獨的MySql服務器。Django,python,mod_wsgi和Apache worker

我們的應用程序體積龐大,當然可以優化。我們現在使用NewRelic來解決一些運行速度較慢的頁面。我讀過很多關於優化mod_wsgi/apache的內容,但和其他人一樣,我仍然留下了一些問題。

我們的平均應用頁面加載時間爲650-750ms。我們很多頁面都在200ms範圍內,但我們有一些需要2-5秒加載的狗。在正常加載時間內,我們可以獲得15-20個請求/秒,而在高峯期可以達到30-40個請求/秒,這可能會持續30-60分鐘。

這是我的apache配置,運行worker mpm。

StartServers  10 
MaxClients   400 
MinSpareThreads  25 
MaxSpareThreads  75 
ThreadsPerChild  25 
MaxRequestsPerChild 0 

我開始了默認值(StatServers = 2的MaxClients = 150),但我們的網站速度最小負載下一路下滑。我猜這需要很長時間才能啓動服務器。我們從s3服務90%的媒體。其他10%通過我們的https頁面上的Apache或者懶洋洋地指向我們本地服務器的人員提供服務。在名義負載下,最終創建了15個工作進程,所以我認爲我應該設置StartServers = 15?有了這個配置,我假設我有15個工作進程在運行(我可以用NewRelic來確認),每個進程有25個線程(我不知道如何確認,猜測400/15)。

我的Apache/mod_wsgi的指令是這樣的:

<VirtualHost *:80> 
    # Some stuff 
    WSGIDaemonProcess app1 user=http group=http processes=10 threads=20 
    WSGIProcessGroup app1 
    WSGIApplicationGroup app1 
    WSGIScriptAlias//path/to/django.wsgi 
    WSGIImportScript /path/to/django.wsgi process-group=app1 application-group=app1  
    # Some more stuff  
</VirtualHost> 

<VirtualHost *:443> 
    # Some stuff 
    WSGIDaemonProcess app1-ssl user=http group=http processes=2 threads=20 
    WSGIProcessGroup app1-ssl 
    WSGIApplicationGroup app1-ssl 
    WSGIScriptAlias//path/to/django.wsgi 
    WSGIImportScript /path/to/django.wsgi process-group=app1-ssl application-group=app1-ssl 
    # Some more stuff 
</VirtualHost> 

有我的網站的SSL側的不同WSGIDaemonProcess/WSGIProcessGroup,很好,只是感覺不對的。我100%肯定我在這裏弄到了一些東西。儘管如此,我已經爲mod_wsgi分配了200 + 40個線程來處理來自Apache的請求,剩下160個線程來處理需要提交的任何媒體(通過ssl或懶惰不指向s3)。

因此,考慮到我們的應用程序負載以上,任何人都可以建議我可以提高我的網站的性能?我正確處理ssl/mod_wsgi指令嗎?格雷厄姆在哪裏? ;)在

+2

我一直在放假了幾個星期。幾天後回家。如果你想確保我回答,如果你發送問題到mod_wsgi列表更好。 –

+0

格雷厄姆還撰寫了一些與此主題相關的博客文章。所有標記爲mod_wsgi的東西都是相關的,但我發現這些在解決性能問題時最有用。 http://blog.dscpl.com.au/2014/02/use-of-threading-in-modwsgi-daemon-mode.html http://blog.dscpl.com.au/20//02/vertically-partitioning -python-web.html – scoopseven

回答