Seperti yang disarankan judul pertanyaan, saya mengalami kesulitan untuk mencari tahu apa yang dapat ditingkatkan pada aplikasi saya (atau dicari di os, ubuntu) untuk mencapai kinerja yang dapat diterima. Tapi pertama-tama saya akan menjelaskan arsitekturnya:
Server front-end adalah mesin 8 inti dengan 8 gigs RAM yang menjalankan Ubuntu 12.04. Aplikasi ini ditulis seluruhnya dalam javascript dan dijalankan di node.js v 0.8.22 (karena beberapa modul tampaknya mengeluh pada versi yang lebih baru dari node) Saya menggunakan nginx 1.4 untuk mem-proxy lalu lintas http dari port 80 dan 443 hingga 8 pekerja simpul yang dikelola dan mulai menggunakan simpul cluster api. Saya menggunakan versi socket.io 0.9.14 terbaru untuk menangani koneksi websocket, di mana saya hanya mengaktifkan soket web dan xhr-polling sebagai transport yang tersedia. Di mesin ini saya juga menjalankan instance Redis (2.2)
Saya menyimpan data persisten (seperti pengguna dan skor) pada server kedua di mongodb (3,6) dengan RAM 4gigs dan 2 core.
Aplikasi ini dalam produksi sejak beberapa bulan (itu berjalan pada satu kotak sampai beberapa minggu yang lalu) dan sedang digunakan oleh sekitar 18k pengguna per hari. Itu selalu bekerja dengan sangat baik terlepas dari satu masalah utama: penurunan kinerja. Dengan penggunaan, jumlah cpu yang digunakan oleh setiap proses tumbuh sampai membuat pekerja menjadi lebih matang (yang tidak lagi melayani permintaan). Saya sementara waktu menyelesaikannya memeriksa cpu yang digunakan oleh setiap pekerja setiap menit, dan memulai kembali jika mencapai 98%. Jadi masalahnya di sini adalah cpu, dan bukan RAM. RAM bukan masalah lagi karena saya telah memperbarui ke socket.io 0.9.14 (versi sebelumnya adalah memori bocor) jadi saya ragu itu menjadi masalah kebocoran memori, terutama karena sekarang cpu yang tumbuh cukup cepat ( Saya harus memulai kembali setiap pekerja sekitar 10-12 kali sehari!). RAM yang digunakan tumbuh juga jujur, tapi sangat lambat, 1 manggung setiap 2-3 hari penggunaan, dan yang aneh adalah itu tidak dirilis bahkan ketika saya me-restart seluruh aplikasi. Ini hanya dirilis jika saya me-reboot server! ini saya tidak bisa mengerti ...
Saya sekarang telah menemukan nodefly yang luar biasa, jadi saya akhirnya bisa melihat apa yang terjadi di server produksi saya, dan saya mengumpulkan data sejak beberapa hari. Jika ada yang ingin melihat grafik saya dapat memberi Anda akses, tetapi pada dasarnya saya dapat melihat bahwa saya memiliki antara 80 dan 200 koneksi bersamaan! Saya mengharapkan node.js untuk menangani ribuan, bukan ratusan permintaan. Juga waktu respon rata-rata untuk lalu lintas http mengapung antara 500 dan 1500 milidetik yang menurut saya sangat banyak. Juga, saat ini dengan 1300 pengguna online, ini adalah output dari "ss -s":
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
yang menunjukkan bahwa saya punya banyak koneksi tertutup di timewait. Saya telah meningkatkan file max terbuka ke 999999, di sini adalah output dari ulimit -a:
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
Jadi saya pikir masalahnya mungkin pada lalu lintas http yang karena beberapa alasan memenuhi port / soket yang tersedia (?), Tetapi satu hal tidak masuk akal bagi saya: mengapa ketika saya me-restart pekerja, dan semua klien terhubung kembali dalam beberapa detik, beban cpu pekerja turun ke 1% dan mampu melayani permintaan dengan benar sampai jenuh setelah sekitar 1 jam (pada waktu puncak)?
Saya terutama seorang programmer javascript, bukan admin sys jadi saya tidak tahu berapa banyak beban yang saya harapkan untuk ditangani dengan server saya, tapi tentu saja itu tidak berkinerja sebagaimana mestinya. Aplikasi ini stabil jika tidak dan masalah terakhir ini mencegah saya untuk mengirimkan versi mobile dari aplikasi yang siap, karena jelas mereka akan membawa lebih banyak beban dan akhirnya menabrak semuanya!
Mudah-mudahan ada sesuatu yang jelas bahwa saya melakukan kesalahan, dan seseorang akan membantu untuk menemukannya ... jangan ragu untuk meminta saya untuk info lebih lanjut, dan saya minta maaf untuk panjang pertanyaan tetapi perlu saya percaya ... Terima kasih sebelumnya!
top
ketika penggunaan cpu mendekati 100%?