2012-09-26 29 views
6

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

+2

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

+0

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

cevap

İlgili konular