Django mod_wsgi üzerinden çalıştırırken bir WSGIDaemonProcess'te kaç işlem belirtmem gerekir?


23

Diyelim ki kendi Apache sanal ana bilgisayarlarından bir kutuda çalışan 2 sitem (Süper kullanıcı ve Sunucu hatası) var. 2 site Django tarafından desteklenmektedir ve mod-wsgi ile Apache'de çalışmaktadır. Sitelerden biri için tipik bir yapılandırma dosyası aşağıdaki gibi görünecektir:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

Ev sahibi, Ubuntu'yu çalıştıran 4 GB RAM'e sahip bir linux makinedir. Kimse 2 sitem için yukarıda belirtmem gereken işlem sayısını önerebilir mi? Gerçek kullanıcı ve Serverfault siteleriyle aynı trafiğe sahip olduklarını varsayalım.

Yanıtlar:


22

Eh, ne kadar trafik yok gerçek Superuser ve ServerFault siteleri var mı? Varsayımı kolaylaştırmak için yeterli bilgiye sahip değillerse, varsayımlar pek kullanılmazlar ...

En kötü durumdaki işlem sayınız, sitenin işleyebilmesini istediğiniz saniye başına düşen istek sayısı, tüm bu isteklerin en yavaş işleminiz için yapılması durumunda, bir işlemin yapabileceği saniye başına düşen istek sayısıdır (yani bu eylemin işlem süresinin karşılığını). Req / sn'inizin güven aralığına ve zaman ölçümlerine dayanarak, uygun olduğunu düşündüğünüz geçiştirme faktörünü ekleyin.

Ortalama vaka sayısı aynıdır, ancak her bir işlem için req / sn'yi, her bir işlem için saniye başına düşen isteklerinizin ağırlıklı ortalaması ile bölersiniz (ağırlık, söz konusu eyleme ulaşmayı umduğunuz taleplerin yüzdesidir). Yine, şekerleme faktörleri yararlıdır.

Makinede kaç işlem çalıştırabileceğinizin gerçek üst sınırı, her işlemin aldığı üst bellek miktarına göre belirlenir; Bir işlemi biriktirin, daha sonra gerçekçi bir veri kümesiyle (sadece test için bir oyuncak veri kullanıyorsanız, 50 veya 100) kullanın. satırlar, ardından eylemlerinizden biri tablodaki her satırı alır ve yönetirse, bellek kullanımının neye patladığını görmek için bu tablonun 10.000 sıraya yükseldiği zaman için iyi bir ölçüm olmaz. İşlem başına bellek kullanımınızı, belirli bir bellek kullanım eşiğine ulaşan çalışanlara ulaşan bir komut dosyasıyla yapay olarak sınırlandırabilirsiniz; bu eşiği çok düşük ayarlarsanız kötü sorunlara neden olabilirsiniz.

Bellek kullanım şeklinize sahip olduğunuzda, genel giderler için bir miktar bellek düşersiniz (kendim 512 MB'ı severim), aynı makinede çalışan başka işlemleriniz varsa (veritabanı gibi) bir miktar daha düşersiniz ve sonra Disk önbellek alanınızın bitmediğinden emin olmak için bir kısmı daha var (diskinizin çalışma setinin boyutuna bağlı, ama yine de en az 512 MB ile gideceğim). Bu, tavana ulaşmak için işlem başına bellek kullanımınızla böleceğiniz bellek miktarıdır.

En yüksek yükünüze hizmet etmek için ihtiyaç duyduğunuz işlem sayısı kutuya sığdırabileceğiniz işlem sayısından büyükse, daha fazla makineye ihtiyacınız vardır (veya veritabanını en basit durumda başka bir makineye taşımak için).

Orada, birkaç küçük ve basit SF postasına damıtılmış web sitelerini ölçeklendirme konusunda birkaç yıllık deneyim.


İşlem / iş parçacığı sayısı için bir başka önemli faktör, bireysel isteklerin ne kadar sürede ele alınabileceği ve tüm olası süre boyunca genel olarak yayılmasıdır. Başka bir deyişle, bir seferde kaç tane talebin ele alınması gerekir ki bu da ortalama tepki süresinden daha büyüktür. Bu nedenle, daha uzun süren taleplerin etkisi önemli olabileceği ve genel yapılandırma parametrelerini gereğinden fazla belirleyebileceği için, teorik talepler / sn kadar basit değildir. FWIW mod_wsgi 3.0, yapılandırmaya yardımcı olmak için bu konuda veri denemek ve yakalamak için bazı yerleşik istatistik koleksiyonlarını içerecektir.
Graham Dumpleton

@ Graham: Cevabımı tekrar okudum, biraz detaylıca anladım. İstekler / sn, yalnızca yanıt süresinin karşılığıdır ve bir tamsayı req / sn ile bölmek, ondalık sayı ile çarpmaktan daha kolaydır.
womble,

Sadece en kötü durum tepkisine veya bunun için sadece ortalamaya odaklanamazsınız. Zaman periyodlarına düşen taleplerin yüzdesine, yani mümkün olan tüm zamanlara yayılmaya dayalı olarak ağırlıklandırılması gerekir. En kötü vakada yanıt sürenizi gerçekten aldıysanız, gerçekçi olmayan gereksinimler ortaya çıkardı. Sorun, hangi formülü kullanacağınızı bilmek gerçekten zor. Bu nedenle mod_wsgi 3.0'da, iplik kullanımına bakacak ve herhangi bir sayıda iş parçacığının herhangi bir zamanda kullanılmakta olan sayının ve yüzdesinin yüzdesini belirleyen dahili istatistikler toplanacaktır.
Graham Dumpleton

3
Sorun, belki de sadece işlemlerin iş parçacığı için faktörü nasıl kullandığı konusunda endişelendiğim süreçleri araştırıyor olmanızdır ve bu kadar basit değildir. Başka bir deyişle, bu WSGIDaemonProcess yönergesi, her işlemin varsayılan olarak 15 iş parçacığı kullanarak olduğu 5 işlemi belirtir. Açıklamanızı okuduğum kadarıyla tek dişli işlemlerin olduğu varsayılıyor. Olmazsa, modelinizin iplikler ve GIL çevresinde çekişme / ölçeklendirme sorunları için nasıl karşıladığını belirtin. Bu nedenle, tanımınızın yalnızca tek iş parçacıklı işlemler için geçerli olduğunu ve tartışmayacağımı belirtin.
Graham Dumpleton

2
"Çok iş parçacıklı Apache + multiprocess-wsgi" yaklaşımı, Python kodunuzun ve tüm bağımlılıklarınızın iş parçacığı için güvende olduğundan% 99 emin olana kadar en iyi seçeneğe sahip değil mi?
Tomasz Zieliński

9

womble'ın cevabı harika, anlaşılması ve tecrübesizce anlaşılması biraz zor olsa da. Bazı ampirik sayılar ve "e-ticaret" uygulama karşılaştırması yerine "basit içerik" vermek istiyorum.

Mod_wsgi'nin uygun konfigürasyonuyla ilgili olarak farklı kullanım senaryoları oluşturmak için fazla malzeme yok, bu yüzden burada biraz nesir kullanmanın bir sakıncası yok.

A) CMS Siteleri ve Mikrositler

Çoğu müşteri web sitesini işletiyoruz, bunların çoğu içerik siteleri veya django CMS'yi barındıran mikro siteler, bazı özel formlar ve bazen planlanmış arka plan görevleri için Kereviz. Bu siteler kaynaklar için aç değil, birçoğu 32 GB RAM'e sahip tek bir 4 Çekirdekli Intel Xeon'da paralel olarak mutlu bir şekilde çalışıyor. İşte bu tür sitelerin her biri için kullandığımız yapılandırma:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

Tek bir sunucuda yaklaşık 40 siteden söz ediyorum, birçoğu Staging sitesi bekleme modundayken. 2 işlemle (her biri varsayılan olarak 15 iş parçacığı olan), sunucu kaynaklarını tahsis etme yetenekleriyle sınırlı olsa da, siteler iyi durumdadır. Bu kurulumun neden yeterli olduğu (CMS) uygulamasının basit yapısı ile doğrulanabilir: Hiçbir isteğin tamamlanması birkaç milisaniyeden fazla sürmesi beklenmez. Apache daima rahat kalacak ve böylece CPU yükü olacaktır.

B) E-Ticaret Siteleri

Yaptığımız daha karmaşık siteler, hala hesaplama açısından ucuz yerel işlemler, ancak işlem süresi açısından pahalı olan harici bağımlılıklar (örn. Rezervasyon verilerini sağlayan web hizmetleri) ile karakterize edilir. Dış istekleri olan işlemler, iş parçacıklarını daha uzun süre kaplar, bu nedenle aynı sayıda kullanıcıyı karşılamak için daha fazla iş parçacığına ihtiyacınız vardır (yukarıdan basit bir CMS sitesine kıyasla). Daha da kötüsü, bir dış servis bir isteği hemen, bazen birkaç saniye boyunca hemen yanıtlayamadığında, iş parçacıkları zaman zaman engellenir. Bu, mevcut tüm mod_wsgi iş parçacığı kullanılıncaya ve beklemenin engellenmesine kadar isteklerin aynı iş kuyruğuna istekte bulunan iş parçacıklarının sıraya sokulmasının hoş olmayan yan etkisine yol açabilir.

Bu senaryolar için 6süreçleri çok fazla fark görmeden kullanmaya çalıştık ve 12performans ve operasyonel istikrar konusunda kıyaslanamayacak bir artış görmeye başladık :

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

150 ve 250 paralel kullanıcılı bazı basit yük testleri sitenin iyi yanıt vermesiyle kolayca yapılabilir ( 2süreçlerde sitenin kullanılamaz olduğu durumlarda 50 kullanıcıya paralel hizmet verilir). 32 GB RAM'e sahip 2 CPU 6 Çekirdekli Intel Xeon, bu yük altında% 25 CPU kullanımının altında çalışıyor, RAM kullanımı da neredeyse% 25'in altında sabit kalıyor. Burada yalnızca tek bir site için özel bir makine kullandığımızı, bu nedenle diğer sitelerin ihtiyaç duyabileceği kaynakları çalmayacağımızı unutmayın.

Sonuç

Daha fazla sayıda işlem kullanmak, Apache'nin kullanılabilir sistem kaynaklarını kullanıp kullanmamasına izin vermek arasında bir denge kurar. "Saldırı" koşulları altında kararlı bir sunucu sistemi (web sitesi değil!) Tutmak istiyorsanız bu sayıyı düşük tutun. Apache'nin gerektiğinde sistem kaynaklarını (CPU, RAM) kullanmanıza yardımcı olması için daha yüksek bir sayı seçin. Ne kadar yüksek olabilirsiniz, yukarıda kabul edilen cevabın ana hatlarıyla belirtildiği şekilde hesaplar ve sonuçta mevcut CPU gücü ve RAM tarafından sınırlandırılır.

(Not: modwsgi project wiki'nin ConfigurationDirectives bölümünü Apache benzeri arka plan okuma için yastığımın altında tutuyorum. Ayrıca Apache sunucunuzun açık bağlantılarını anladığınızdan ve izlediğinizden emin olun .)


Harika bir mesaj, fakat neden iplik sayımı ayarlamıyorsunuz? Python'un GIL ipliğin avantajlarını bir çok olumsuzluğa soktuğundan, ipliğin dışında bir işlemin olmasını isteyeceğinizi düşünürdüm, ama ipliğin sayısını belirlemede bir avantaj var mı?
Cerin

Belgelere göre varsayılan sayı threads15'tir . Bunu açıkça belirtmenin bir avantajı olduğunu sanmıyorum. Aslında, bir sebepten ötürü dışarıda bıraktığımı hatırlıyorum: Yan etkilerden kaçınmak için değeri ihmal etmeyi öneren bazı SO ya da bazı belgelerin bir kısmı vardı (Biliyorum, kulağa garip geliyor). Ne yazık ki, şu anda bu kaynağı bulamıyorum. Sorunuzun geri kalanında (GIL) muhtemelen benden daha uzmansınız, üzgünüm.
Peterino

Bu deneysel yapılandırma için teşekkür ederim. Ancak, bu post You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.