Soru başlığının da belirttiği gibi, kabul edilebilir bir performans elde etmek için uygulamamda neyin geliştirilebileceğini (veya os, ubuntu'da ayarlanmış) anlamaya zorlanıyorum. Ama önce mimariyi açıklayacağım:
Ön uç sunucu, 8 çekirdekli RAM ile Ubuntu 12.04 çalıştıran 8 çekirdekli bir makinedir. Uygulama tamamen javascript ile yazılmış ve node.js v 0.8.22'de çalıştırılıyor (bazı modüller düğümün yeni sürümlerinden şikayet ediyor gibi) 80 ve 443 numaralı bağlantı noktasından http trafiğini yönetmek için nginx 1.4 kullanıyorum ve düğüm kümesi API'sini kullanmaya başladı. Ben sadece websockets ve xhr-polling'i kullanılabilir aktarımlar olarak etkinleştirdiğim websocket bağlantılarını işlemek için socket.io 0.9.14'ün en son sürümünü kullanıyorum. Bu makinede ayrıca Redis (2.2)
Kalıcı verileri (kullanıcılar ve skorlar gibi) 4gigs RAM ve 2 çekirdekli mongodb (3.6) üzerinde ikinci bir sunucuda saklıyorum.
Uygulama birkaç aydan beri üretiliyor (birkaç hafta öncesine kadar tek bir kutuda çalışıyor) ve günde yaklaşık 18 bin kullanıcı tarafından kullanılıyor. Her zaman bir ana konu dışında çok iyi çalıştı: performans bozulması. Kullanımla birlikte, her işlem tarafından kullanılan işlemci miktarı, çalışanı (bu artık istekleri karşılamayacak) statüye getirene kadar artar. Her işçi tarafından kullanılan cpu'yu her dakika kontrol etmeyi ve% 98'e ulaştığında yeniden başlatmayı geçici olarak çözdüm. Yani buradaki problem esas olarak CPU değil, RAM. RAM artık bir sorun değil, socket.io 0.9.14'e (önceki sürüm bellek sızdırıyor) güncellediğim için artık bir sorun değil, bu yüzden bir bellek sızıntısı sorunu olduğundan şüphe duyuyorum, çünkü özellikle şimdi oldukça hızlı büyüyen cpu ( Her çalışanı günde 10-12 kez yeniden başlatmalıyım!). Kullanılan RAM, dürüst olmak gerekirse büyüyor, ancak çok yavaş, her 2-3 günde bir 1 gig ve garip şey, tüm uygulamayı tamamen yeniden başlattığımda bile serbest bırakılmaması. Yalnızca sunucuyu yeniden başlatırsam yayınlanır! bunu gerçekten anlayamıyorum ...
Şimdi şaşırtıcı olan nodefly'i keşfettim , bu yüzden sonunda üretim sunucumda neler olduğunu görebiliyorum ve birkaç günden beri veri topluyorum. Eğer herkes grafikleri görmek istersen sana erişebilirim, ama temelde 80 ile 200 arasında eşzamanlı bağlantım olduğunu görebiliyorum! Node.js'nin yüzlerce isteği değil, binlerce kişiyi işlemesini bekliyordum. Ayrıca http trafik için ortalama tepki süresi gerçekten çok olduğunu düşünüyorum 500 ve 1500 milisaniye arasında yüzer. Ayrıca, şu anda çevrimiçi 1300 kullanıcı ile, bu "ss -s" çıktı:
Total: 5013 (kernel 5533)
TCP: 8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0
Transport Total IP IPv6
* 5533 - -
RAW 0 0 0
UDP 0 0 0
TCP 4950 4948 2
INET 4950 4948 2
FRAG 0 0 0
Bu da zamana bağlı çok fazla kapalı bağlantım olduğunu gösteriyor. Maksimum açık dosyaları 999999'a çıkardım, işte ulimit -a çıktısı:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63724
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 999999
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63724
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Bu nedenle, sorunun http trafiğinde, bazı nedenlerden dolayı mevcut bağlantı noktalarını / soketleri (?) Doyurduğunu düşündüm, ancak bir şey benim için anlamlı değil: neden işçileri yeniden başlattığımda ve tüm istemciler birkaç saniye içinde yeniden bağlandığında, işçinin cpu'sundaki yük% 1'e iner ve yaklaşık 1 saat sonra (en yoğun zamanda) doyuncaya kadar istekleri düzgün bir şekilde sunabilir mi?
Ben esas olarak bir javascript programcısı değilim, bir sys yöneticisi değilim, bu yüzden sunucularımla işlemek için ne kadar yük beklemem gerektiğini bilmiyorum, ama mutlaka olması gerektiği gibi performans göstermiyor. Aksi takdirde uygulama kararlı ve bu son sorun, açıkçası daha fazla yük getirecek ve sonunda her şeyi çökecek gibi hazır olan uygulamanın mobil sürümleri gemi beni engelliyor!
Umarım yanlış yaptığım açık bir şey vardır ve birisi bunu fark etmeye yardımcı olacaktır ... daha fazla bilgi istemekten çekinmeyin ve sorunun uzunluğu için özür dilerim ama gerekli olduğuna inanıyorum ... şimdiden teşekkürler!
top
İşlemci kullanımı% 100'e yakın olduğunda ne görüyorsunuz ?