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()
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. –
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
Och i faktycznie miałem "prefork" w nagłówku, więc informacje zostały dostarczone. Dodano to teraz do tekstu dla jasności. – schmilblick