Apache prefork'dan worker (işçi) öğesine taşındım ve mod_wsgi'yi daemon modunda çalıştırmaya başladım. Çok uzak çok iyi. Henüz maksimum yük almadım, ancak sunucu daha tutarlı görünüyor ve rastgele talepler görmüyoruz, mod_wsgi yanıtı için 2 dakika beklemekteyiz. Bellek ayak izi 3,5G'den 1G'ye çıktı. Bu harika. 6G ram ile tek bir VPS üzerinde çalışıyoruz. 1G ram tahsis ettiğimiz bir memcache örneğiyle birlikte bu sevrer üzerinde çalışan bir Django uygulaması var. Ayrı bir MySql sunucumuz var.Django, python, mod_wsgi ve Apache çalışanı
Uygulamamız hantal ve kesinlikle optimize edilebilir. Şu anda daha yavaş çalışan sayfalardan bazılarını gidermek için NewRelic kullanıyoruz. Mod_wsgi/apache'yi optimize etmede çok şey okudum ama herkes gibi, hala birkaç soruyla kaldım.
Ortalama uygulama sayfası yükleme zamani 650-750 ms'dir. Sayfalarımızın çoğu 200ms aralığındadır, ancak yüklemek için 2-5 saniye süren bazı köpeklerimiz var. Normal yükleme süreleri sırasında yaklaşık 15-20 istek/saniye, 30-60 dakika süren en yoğun zamanlarda 30-40 istek/saniye alırız.
İşte apache yapılandırmam, çalışan çalışan mpm.
StartServers 10
MaxClients 400
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
Ben varsayılanlarla başladı (StatServers = 2 ve MaxClients = 150), ancak sitemizin yolu aşağı asgari yük altında yavaşladı. Tahminler geldiğinde sunucuların hızlandırılması uzun zaman aldı. Sanırım medyanın% 90'ını s3'ten alıyoruz. Diğer% 10'luk kısmı, https sayfalarımızda veya yerel sunucumuza tembel bir şekilde işaret eden bir kişi tarafından Apache aracılığıyla sunulur. Nominal yükte, 15 işçi süreci yaratılıyor, bu yüzden muhtemelen StartServers = 15'i ayarlamalıyım diye düşünüyorum. Bu konfigürasyon ile, her biri 25 iş parçacığıyla (ki bunu nasıl doğrulayacağımı bilmiyorum, tahmin etmeyi tahmin ediyorum, 400/15'i tahmin ederek) çalışan 15 işçi sürecim var (NewRelic ile onaylayabilirim).
My apache/mod_wsgi direktifler şu şekilde görünür:
<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>
, şey, bu sadece sağ hiç hissetmez sitemin ssl tarafı için farklı bir WSGIDaemonProcess/WSGIProcessGroup olmak. % 100 eminim ki burada bir şeyleri mahvetmişim. Bununla birlikte, daha büyük bir noktaya, Apache'nin isteklerini ele almak için mod_wsgi için 200 + 40 iş parçacığı tahsis ettim, böylece herhangi bir ortamın teslim edilmesi gereken şeylerle uğraşmak için 160 iş parçacığı bıraktı (ssl veya s3'e işaret etmenin tembelliği).
Yukarıdaki uygulama yüklememizden dolayı, sitemdeki performansını iyileştirebileceğim yöntemler önerebilir mi? Ssl/mod_wsgi yönergelerini düzgün bir şekilde mi uyguluyorum? Graham nerede? ;) En
. Birkaç gün içinde eve dön. Eğer cevap verdiğimden emin olmak için mod_wsgi listesine soru gönderirseniz daha iyi olur. –
Graham, bu konuyla ilgili bir kaç blog yazısı da yayınladı. Mod_wsgi etiketli her şey alakalı, ancak performans sorunlarını gidermek için bu en yararlı buldum. http://blog.dscpl.com.au/2014/02/use-of-threading-in-modwsgi-daemon-mode.html http://blog.dscpl.com.au/2014/02/vertically-partitioning -python-web.html – scoopseven