Nginx isteklerini / saniyesini en üst düzeye çıkarmak için ipuçları?


15

Bir analiz paketi hazırlıyorum ve proje gereksinimleri günde 1 milyar isabeti desteklemem gerektiğini söylüyor. Evet, "milyar". Başka bir deyişle, saniyede 12.000'den az isabet devam etmedi ve tercihen patlayacak bir yer vardı. Bunun için birden fazla sunucuya ihtiyacım olacağını biliyorum, ama "daha fazla donanım atmadan" önce her düğümden maksimum performans elde etmeye çalışıyorum.

Şu anda, hit izleme bölümünü tamamladım ve iyi optimize ettim. Hemen hemen istekleri doğrudan Redis'e kaydediyorum (daha sonra Hadoop ile işlem yapmak için). Uygulama ağ geçidi için bir gunicorn ile Python / Django olduğunu.

2 GB Ubuntu 10.04 Rackspace sunucum (bir üretim makinesi değil) saniyede yaklaşık 1200 statik dosya sunabilir (tek bir statik varlığa karşı Apache AB kullanılarak karşılaştırılmıştır). Karşılaştırma yapmak için, statik dosya bağlantısını izleme bağlantımla değiştirirsem, yine de saniyede yaklaşık 600 istek alıyorum - bence bu, izleyicimin iyi optimize edildiği anlamına geliyor, çünkü aynı statik varlığa hizmet etmekten sadece 2 kat daha yavaş bir faktör defalarca.

Ancak, milyonlarca isabetle karşılaştırdığımda birkaç şey fark ettim -

  1. Disk kullanımı yok - bu bekleniyor, çünkü tüm Nginx günlüklerini kapattım ve özel kodum istek ayrıntılarını Redis'e kaydetmekten başka bir şey yapmıyor.
  2. Sabit olmayan bellek kullanımı - Muhtemelen Redis'in bellek yönetimi nedeniyle, bellek kullanımım yavaş yavaş artacak ve sonra geri düşecek, ancak bir zamanlar darboğazım olmadı.
  3. Sistem yükü 2-4 civarında seyrediyor, sistem en ağır ölçütlerimde bile hala duyarlı ve yine de http://mysite.com/tracking/pixel'i az görünür gecikmeyle manuel olarak görüntüleyebilirken (diğer) sunucum ikinci.
  4. Kısa bir test yaparsam, örneğin 50.000 vuruş (yaklaşık 2m sürer), saniyede düzenli, güvenilir bir 600 istek alırım. Daha uzun bir test yaparsam (şu ana kadar 3,5 m'ye kadar denedim), r / s değerim yaklaşık 250 değerine düşer.

Sorularım --

a. Henüz bu sunucuyu azamıyorum. 1.200 / sn'lik statik dosyalar nginx performansı diğerlerinin deneyimleriyle karşılaştırılabilir mi?

b. Bu tür yüksek hacimli uygulamalar için ortak nginx ayarları var mı? 64'e ayarlanmış işçi iş parçacıkları ve 8'e ayarlanmış gunicorn iş parçacıkları var, ancak bu değerleri değiştirmek bana çok yardımcı ya da zarar vermiyor gibi görünüyor.

c. Gelen bağlantılarımı sınırlandırabilecek linux düzeyinde ayarlar var mı?

d. Uzun süreli testlerde performansımın 250r / s'ye düşmesine ne neden olabilir? Yine, bu testler sırasında bellek maksimum düzeyde değildir ve HDD kullanımı sıfırdır.

Şimdiden teşekkürler, hepsi :)

EDIT İşte benim nginx yapılandırma - http://pastie.org/1450749 - çoğunlukla vanilya, belirgin yağ kesilmiş.


Bir gönderide birden fazla soru yapıyorsunuz, gözden geçirmeyi düşünün. Tüm bölümlere cevap veremediğim için sadece bir cevap değil, bir yorum yapıyorum. Python / Django performansını düşündüğünüzü varsayıyorum - aşırı hız için ideal değil. 1200 req / s ile ilgili olarak, 1px gif veya HTTP 204 yanıtı olduğunu düşündüğüm için çok düşük geliyor. Bkz. Fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world (24k req / s, localhost üzerinde çalışıyor, ancak sadece 1 nginx çalışanı kullanıyor.)
Jesper M

Goldmine yorum, çok teşekkür ederim. Gönderiyi okuyacağım ve bulgularımla geri döneceğim; "birden fazla soru" işaretçisi için teşekkürler!
32'de bağlantılı

Yanıtlar:


8

Nginx'in worker_threads işini kötüye kullanıyorsunuz. Bu kadar çok işçiyi çalıştırmaya kesinlikle gerek yok. İşlemciniz olduğu kadar çok işçi çalıştırmalı ve onu günde çağırmalısınız. Aynı sunucuda gunicorn çalıştırıyorsanız, muhtemelen nginx çalışanlarını ikiyle sınırlandırmalısınız. Aksi takdirde, CPU'ları tüm bu işlemleri yönetmek için gereken tüm bağlam anahtarlamasıyla harcayacaksınız.


1
Ah teşekkürler. Performans 64 ile 2'de olduğu gibi görünüyordu, ancak WTF'nin yapmadığını biliyordum. Açıkladığınız için teşekkürler.
27'de bağlantılı

Nginx yapılandırmanızı paylaşabilir misiniz? Neyi ayarladığımızı bilmediğimizde ayar ipuçları vermek zor.
blueben

2

Statik içerik için bir saniye 5K isteği hizmet etmek için nginx kullandım. Şu anda 1024 olarak ayarlanmış worker_connections sayısını artırabilirsiniz.

Max_client hesaplaması aşağıdaki gibi olacaktır.

Ana bölümdeki worker_connections ve worker_proceses, maxclients değerini hesaplamanızı sağlar:

max_clients = worker_processes * worker_connections

Ters proxy durumunda, max_clients olur

max_clients = worker_processes * worker_connections / 4

http://wiki.nginx.org/EventsModule#worker_connections

Kurulumunuzun kapasitesini öğrendikten sonra, maksimum çalışan bağlantılarını hesaplamak kolaydır. Toplam kapasite / çekirdek sayısı maksimum çalışan bağlantısıdır. Toplam kapasiteyi hesaplamanın birçok yolu vardır.

  1. Size en gerçekçi sayıları verecek olan kurulumunuzu karşılaştırmanızı öneririm. Siege, pummel, apache bench vs. gibi araçları kullanabilirsiniz, test sırasında sistem kaynak kullanımını ölçmeyi unutmayın.

Yukarıdaki yöntem sizin için çalışmazsa, aşağıdaki yöntemleri deneyin. RAM ve IO'yu görmezden gelen geniş varsayımlar yapıyorum, bunlar da faktör olacak, ancak bunlar size başlangıç ​​noktaları verecek ve oradan ayarlamalar yapabilirsiniz.

  1. Bant genişliğinin darboğaz olduğunu varsayalım, nginx'in sunduğu ortalama nesne boyutunu alın ve bant genişliğinizi buna bölün ve desteklenen maksimum qps'yi elde edin.

  2. İkinci varsayımda CPU darboğazdır. Bu durumda, talep süresini ölçün ve 1'i sisteminizdeki çekirdek sayısı ile bölün. Bu, nginx'in işleyebileceği saniye başına istek sayısını verecektir.


Nasıl worker_connections artırabilir ve belirli bir sunucu için ideal bir ayar olup olmadığını belirlemek için nasıl gitmek gerekir?
Kato

Bununla ilgili birkaç yol var.
Sameer
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.