[ Posting ini terbaru pada 2012-09-02 (lebih baru dari yang di atas). ]
Node.js benar-benar melakukan skala pada mesin multi-core.
Ya, Node.js adalah one-thread-per-proses. Ini adalah keputusan desain yang sangat disengaja dan menghilangkan kebutuhan untuk berurusan dengan semantik penguncian. Jika Anda tidak setuju dengan ini, Anda mungkin belum menyadari betapa sulitnya melakukan debug kode multi-threaded. Untuk penjelasan lebih lanjut tentang model proses Node.js dan mengapa ia bekerja dengan cara ini (dan mengapa itu TIDAK PERNAH mendukung banyak utas), baca posting saya yang lain .
Jadi bagaimana saya mengambil keuntungan dari 16 core box saya?
Dua arah:
- Untuk tugas komputasi besar yang berat seperti pengkodean gambar, Node.js dapat menjalankan proses anak atau mengirim pesan ke proses pekerja tambahan. Dalam desain ini, Anda akan memiliki satu utas yang mengelola aliran peristiwa dan proses N yang melakukan tugas komputasi yang berat dan mengunyah 15 CPU lainnya.
- Untuk meningkatkan throughput pada layanan web, Anda harus menjalankan beberapa server Node.js pada satu kotak, satu per inti dan membagi lalu lintas permintaan di antara mereka. Ini memberikan afinitas CPU yang sangat baik dan skala proses akan hampir linier dengan jumlah inti.
Menskalakan throughput pada layanan web
Sejak v6.0.X Node.js telah menyertakan modul cluster langsung dari kotak, yang membuatnya mudah untuk mengatur beberapa pekerja simpul yang dapat mendengarkan pada satu port. Perhatikan bahwa ini BUKAN sama dengan modul "cluster" learningboost yang lebih lama tersedia melalui npm .
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
Pekerja akan bersaing untuk menerima koneksi baru, dan proses yang paling sedikit dimuat kemungkinan besar akan menang. Ini bekerja cukup baik dan dapat meningkatkan throughput dengan cukup baik pada kotak multi-core.
Jika Anda memiliki beban yang cukup untuk peduli terhadap banyak inti, maka Anda juga ingin melakukan beberapa hal lagi:
Jalankan layanan Node.js Anda di belakang proxy web seperti Nginx atau Apache - sesuatu yang dapat melakukan pelambatan koneksi (kecuali jika Anda ingin kondisi overload menurunkan kotak sepenuhnya), menulis ulang URL, menyajikan konten statis, dan proksi sub-layanan lainnya.
Daur ulang proses pekerja Anda secara berkala. Untuk proses yang berjalan lama, bahkan kebocoran memori kecil pada akhirnya akan bertambah.
Pengaturan pengumpulan / pemantauan log
PS: Ada diskusi antara Aaron dan Christopher dalam komentar-komentar dari postingan lain (pada tulisan ini, ini postingan teratas). Beberapa komentar tentang itu:
- Model soket bersama sangat nyaman untuk memungkinkan beberapa proses mendengarkan pada satu port dan bersaing untuk menerima koneksi baru. Secara konseptual, Anda dapat membayangkan Apache yang melakukan operasi ini dengan peringatan signifikan bahwa setiap proses hanya akan menerima satu koneksi dan kemudian mati. Kehilangan efisiensi untuk Apache ada di atas proses proses baru dan tidak ada hubungannya dengan operasi soket.
- Untuk Node.js, memiliki pekerja N bersaing pada satu soket adalah solusi yang sangat masuk akal. Alternatifnya adalah dengan mengatur front-end on-box seperti Nginx dan memiliki lalu lintas proxy untuk masing-masing pekerja, bergantian antara pekerja untuk menetapkan koneksi baru. Kedua solusi tersebut memiliki karakteristik kinerja yang sangat mirip. Dan karena, seperti yang saya sebutkan di atas, Anda mungkin ingin memiliki Nginx (atau alternatif) untuk mem-forward layanan simpul Anda, pilihan di sini adalah antara:
Port Bersama: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
vs.
Port Individual: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
Ada beberapa manfaat untuk pengaturan masing-masing port (potensi untuk memiliki lebih sedikit kopling antar proses, memiliki keputusan load-balancing yang lebih canggih, dll.), Tetapi jelas lebih banyak pekerjaan untuk diatur dan modul klaster built-in rendah Alternatif -kompleksitas yang bekerja untuk kebanyakan orang.