2012-09-26 21 views
6

Właśnie przeniosłem się z prefabetu apache do pracownika i uruchomiłem mod_wsgi w trybie demona. Jak na razie dobrze. Nie doświadczyłem jeszcze obciążenia maksymalnego, ale serwer wydaje się bardziej spójny i nie widzimy, aby losowe żądania trwały 2 minuty, czekając na odpowiedź mod_wsgi. Obciążenie pamięci spadło z 3,5G do 1G. To jest niesamowite. Pracujemy na jednym VPS z 6G pamięci RAM. Jest jedna aplikacja Django uruchomiona na tym serwerze wraz z instancją memcache, do której przydzieliliśmy 1G pamięci RAM. Mamy oddzielny serwer MySql.Django, python, mod_wsgi i pracownik Apache

Nasza aplikacja jest nieporęczna i może być zoptymalizowana. Używamy narzędzia NewRelic do rozwiązywania problemów z niektórymi wolniejszymi stronami teraz. Dużo czytałem na temat optymalizacji mod_wsgi/apache, ale, tak jak wszystkim innym, wciąż mam kilka pytań.

Nasz średni czas ładowania strony aplikacji wynosi 650-750ms. Wiele z naszych stron znajduje się w zakresie 200ms, ale mamy kilka psów, których załadowanie zajmie 2-5 sekund. Otrzymujemy około 15-20 żądań na sekundę podczas normalnych czasów ładowania i 30-40 żądań na sekundę w godzinach szczytu, co może trwać 30-60 minut.

Oto moja konfiguracja apache, działająca pracownik mpm.

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

Zacząłem z domyślnych (StatServers = 2 i MaxClients = 150), ale nasza strona spadła w dół pod minimalnym obciążeniem. Domyślam się, że w miarę nadejścia żądań zabrało to dużo czasu. Serwujemy 90% naszych mediów z s3. Pozostałe 10% jest podawane przez Apache na naszych stronach https lub przez kogoś wskazującego leniwie na nasz lokalny serwer. Przy nominalnym obciążeniu powstaje 15 procesów roboczych, więc myślę, że prawdopodobnie powinienem ustawić StartServers = 15? Przy tej konfiguracji zakładam, że mam 15 procesów roboczych uruchomionych (co mogę potwierdzić za pomocą NewRelic) z 25 wątkami każdy (których nie wiem jak potwierdzić, zgadując 400/15).

Moi dyrektywami apache/mod_wsgi wyglądać następująco:

<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> 

Mając inny WSGIDaemonProcess/WSGIProcessGroup na stronie ssl mojej strony, dobrze, że po prostu nie czuję się dobrze w ogóle. Jestem w 100% pewna, że ​​coś tu zepsułem. W tym celu jednak przydzieliłem 200 + 40 wątków dla mod_wsgi do obsługi żądań z Apache, pozostawiając 160 wątków, aby poradzić sobie z każdym mediami, które należy dostarczyć (przez ssl lub lenistwo nie wskazując na s3).

Biorąc pod uwagę obciążenie aplikacji powyżej, czy ktoś może zasugerować, w jaki sposób mogę poprawić wydajność mojej witryny? Czy mam do czynienia z dyrektywami ssl/mod_wsgi? Gdzie jest Graham? ;)

+2

byłem na wakacjach na kilka tygodni. Wracaj do domu za kilka dni. Lepiej, jeśli wyślesz pytanie na listę mod_wsgi, jeśli chcesz mieć pewność, że odpowiem. –

+0

Graham zrobił także kilka wpisów na blogach związanych z tym tematem. Wszystko oznaczone tag_wsgi jest trafne, ale uznałem je za najbardziej przydatne w rozwiązywaniu problemów z wydajnością. http://blog.dscpl.com.au/2014/02/use-of-threading-in-modwsgi-daemon-mode.html http://blog.dscpl.com.au/2014/02/vertical-partitioning -python-web.html – scoopseven

Odpowiedz

Powiązane problemy