2009-09-25 4 views
6

Przede wszystkim nie jestem w żaden sposób niezadowolony z wydajności mojej strony z Django, która nie osiąga dużego ruchu, do tej pory ponad 1000 odwiedzin dziennie.Wydajność współbieżności w Django (apache2 prefork/mod_wsgi), co robię źle?

Byłem ciekawy, jak dobrze poradziłby sobie z dużymi obciążeniami drogowymi, więc użyłem narzędzia ab do wykonania testów porównawczych.

Zauważyłem, że wydajność, gdy współbieżność jest większa niż 1, zapewnia taką samą ilość żądań, co jedno równoległe połączenie.

Czy nie należy zwiększać/zwiększać wymagań względem współbieżności?

Im na maszynie wirtualnej z 1 GB pamięci RAM, apache2 (prefork), mod_wsgi, memcached i mysql.
Cała zawartość strony została zapisana w pamięci podręcznej, baza danych nie zawiera żadnych trafień. I jeśli memcached zrzuci wpis, będzie tylko 2 lekkie (indeksowane) zapytania - i powinno natychmiast zostać ponownie zapisane w pamięci podręcznej.

Benchmarking dane: (uwaga: zrobiłem Benchmark to z 2000 i 10k wniosków z tych samych wyników)

dla startową, podawane przez apache2/mod_wsgi przez Django:
-n100 C4: http://dpaste.com/97999/ (58,2 reqs/s)
-n100 -C1: http://dpaste.com/97998/ (57,7 reqs/s)

Na robots.txt bezpośrednio z apache2:
-n100 C4: http://dpaste.com/97992/ (4917 reqs/s)
-n100 -c1: http://dpaste.com/97991/ (1412 reqs/s)

To moje apache conf: http://dpaste.com/97995/

Edycja: Dodano więcej informacji

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

mojawitryna. conf: http://dpaste.com/98462/

Mój program obsługi wsgi:

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

Nie wskazano, czy Apache jest skompilowany z preforkem czy z robotem MPM. Nie dostarczasz konfiguracji, której używasz do obsługi aplikacji przez mod_wsgi, więc nie masz pojęcia, czy używasz trybu wbudowanego, czy demona. Użycie 100 żądań dla próbki porównawczej również nie przyniesie dobrych wyników, zwykle chciałbyś użyć tysięcy. Nie można również stwierdzić, czy udało Ci się wyeliminować opóźnienia uruchamiania. Apache/mod_wsgi będzie leniwie ładować aplikację internetową Python. Również brak wskazania, czy twoje żądanie jest przeciwko bazie danych i czy jest to problem. Więcej potrzebnych informacji. –

+0

Dodano więcej informacji. Zrobiłem test porównawczy z 2000 i 10k wniosków z tymi samymi wynikami. Żądanie w ogóle nie trafiło do bazy danych, upewniłem się, że wszystko jest w pamięci podręcznej (memcached), a top mówi mi tylko o procesach apache, które używają (wszystkich) zasobów. – schmilblick

+0

Och i faktycznie miałem "prefork" w nagłówku, więc informacje zostały dostarczone. Dodano to teraz do tekstu dla jasności. – schmilblick

Odpowiedz

12

Podczas korzystania z prefabrykatów MPM i mod_wsgi w trybie wbudowanym z wieloma procesami, prawdopodobnie zabijasz wydajność swojego pudełka. Na początek proponuję przeczytać:

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

Korzystanie z trybu wbudowanego jak jesteś, trzeba dostroić parametry MPM ostrożnie. Ustawienie MaxRequestsPerChild na niezerową nie jest dobrym początkiem, ponieważ będziesz okresowo wymuszać procesy Apache, w wyniku czego spowodujesz skok obciążenia, ponieważ wszystko musi przeładować.

Sugerowałby użycie narzędzia MPM dla pracownika oraz aplikacji internetowej Python działającej w trybie demona mod_wsgi. To na początek spowoduje dużo mniej uruchamianych procesów, mniej narzutów pamięci i da większą przewidywalność wokół wydajności systemu. Następnie może przyjrzeć się bliżej, dlaczego rzeczy mogą działać wolniej.

Jedno zwrócić uwagę na to, co można dostać w następnym odcinku wyjścia „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 

Jeśli kolumna max pokazuje duże wartości, to jesteś trafiony przez kosztach załadunku aplikacja należnych aby nie eliminować ich z testów poprzez wstępne ładowanie lub krótki interwał restartu procesu.

+0

Dzięki! Nie wiedziałem, że mod_wsgi może działać w trybie demona. Przeczytam to kilka razy i dostosuję ustawienia. Jeśli poprawnie przeczytam Twoją sugestię, mówisz, że nie powinienem uruchamiać preforkowej wersji apache2? – schmilblick

+2

Jeśli używasz trybu demona do uruchomienia aplikacji Python WSGI, nie jest tak istotne, aby uruchamiać proces roboczy MPM jako kod Pythona, który nie działa już w procesach potomnych serwera Apache. Jeśli używasz również PHP przy użyciu mod_php, i tak utkniesz z uruchomieniem prefektora MPM. Nadal, jeśli nie jest zależne od mod_php lub innych modułów Apache, które wymagają pojedynczego wątku procesów Apache, to lepiej wyłączyć przy użyciu Worker MPM. Nawet jeśli nadal trzeba uruchamiać prefabrykację MPM z jednym wątkiem, procesy demona mod_wsgi nadal mogą być wielowątkowe. –