Koneksi Socket.IO bersamaan maksimum

123

Pertanyaan ini telah ditanyakan sebelumnya tetapi tidak baru-baru ini dan tidak dengan jawaban yang jelas.

Menggunakan Socket.io, apakah ada jumlah maksimum koneksi bersamaan yang dapat dipertahankan sebelum Anda perlu menambahkan server lain?

Adakah yang mengetahui lingkungan produksi aktif yang menggunakan websockets (terutama socket.io) dalam skala besar? Saya benar-benar ingin tahu jenis pengaturan apa yang terbaik untuk koneksi maksimum?

Karena Websockets dibangun di atas TCP, pemahaman saya adalah bahwa kecuali port dibagikan di antara koneksi Anda akan terikat oleh batas port 64K. Tetapi saya juga telah melihat laporan koneksi 512K menggunakan Gretty . Jadi saya tidak tahu.

Andrew
sumber
3
Trello menggunakan soket dalam skala besar (khususnya, socket.io).
Yakobus
Saya membaca bahwa Trello harus memodifikasi kode Socket.io karena batasan koneksi 10.000 dan mampu mempertahankan 'ribuan' koneksi sebelum menambahkan server. Masih ada jurang pemisah yang besar antara itu dan 512K sistem server lain.
Andrew
1
Berapa umur artikel itu? Trello baru-baru ini menjangkau lebih dari 1 juta pengguna aktif per bulan, jadi saya membayangkan mereka sekarang menjalankan lebih dari 10.000 soket aktif. Trello menggunakan Redis untuk duduk di atas socket.io untuk skalabilitas
James
2
Trello sekarang tampaknya memiliki lebih dari 4 juta pengguna, tetapi tentunya mereka menjalankannya di sejumlah besar server, bukan? Itu membawa saya kembali ke pertanyaan awal saya: apa jumlah pengguna serentak puncak aktual mereka (atau siapa pun) per server? Sebaiknya juga mengetahui jenis server / penampung yang mereka gunakan. Dan apakah mereka masih menjalankan garpu mereka sendiri, atau apakah mereka kembali ke asalnya / master? Satu-satunya tujuan saya dalam menanyakan pertanyaan ini adalah mencoba mengukur apakah perusahaan saya (pada saat itu) mampu mempertahankan aplikasi Socket.io untuk kemungkinan 120.000 koneksi bersamaan.
Andrew
1
Mengenai batas port, saya pikir penjelasan mengapa itu tidak menjadi masalah dijelaskan di sini . Pada dasarnya, satu-satunya port yang digunakan pada sistem Anda adalah yang Anda dengarkan. Soket dibuat untuk setiap koneksi, dan mereka menggunakan deskriptor file, tetapi mereka tidak menggunakan port pada kotak Anda.
Paul Lynch

Jawaban:

77

Artikel ini dapat membantu Anda: http://drewww.github.io/socket.io-benchmarking/

Saya bertanya-tanya pertanyaan yang sama, jadi saya akhirnya menulis tes kecil (menggunakan polling XHR) untuk melihat kapan koneksi mulai gagal (atau tertinggal). Saya menemukan (dalam kasus saya) bahwa soket mulai bekerja sekitar 1400-1800 koneksi bersamaan.

Ini adalah inti singkat yang saya buat, mirip dengan tes yang saya gunakan: https://gist.github.com/jmyrland/5535279

SELAI
sumber
7
Saya menyadari ini adalah topik yang lebih lama tetapi saya menemukannya pertama kali ketika mencari pertanyaan untuk jawaban saya dan akhirnya menemukan ini berguna: rtcamp.com/tutorials/linux/increase-open-files-limit Batas file terbuka per proses mungkin default ke batas lunak 1024 dan batas keras 4096 dan karena setiap port TCP terbuka mewakili file, penting untuk mempertimbangkan batas ini saat menentukan berapa banyak soket terbuka yang akan diizinkan mesin sebelum mencoba memaksimalkan perpustakaan.
DeeperID
2
@JAM Pernahkah Anda mengetahui mengapa soket web Anda bekerja sekitar 1400-1800 koneksi? Saya mengalami masalah yang sama, dan batas file saya disetel ke 100.000, jadi saya tahu itu bukan masalahnya. Bantuan apa pun akan sangat dihargai. Terima kasih.
Seth
@seth: sudah lama sejak saya terakhir kali mengulas ini, tetapi saya pikir ini adalah kesimpulannya: polling XHR memakan terlalu banyak sumber daya (dalam kaitannya dengan metode transportasi lainnya). Saat menggunakan websockets, jumlah koneksi bersamaan lebih tinggi.
JAM
@JAM terima kasih atas jawabannya. Saya melihat masalah yang sama menggunakan modul ws, bukan socket.io, jadi seharusnya tidak ada polling XHR dengan modul ws. Di situlah saya mengalami masalah pemecahan masalah. Pencarian terus berlanjut.
Seth
Ini adalah jawaban bersih yang bagus .. Juga benar karena kasus per kasus .. Secara pribadi saya sarankan ppl menulis benchmark atau simulator koneksi mereka sendiri. Meskipun tes untuk orang lain mungkin bagus, namun tidak mewakili lingkungan dunia nyata ... Setelah Anda memiliki simulator klien yang mampu menangani sejumlah klien dengan berbagai kesalahan dunia nyata .. Anda dapat mengukur setelah perubahan besar dan juga perbarui simulator Anda saat Anda pergi. Mengoperasikan antarmuka obrolan pengguna akan berbeda untuk memantau browser pengguna dan seterusnya .. Python menurut saya sangat berguna untuk membuat skrip simulator ...
Marah 84
16

Saya mencoba menggunakan socket.io di AWS, saya dapat menyimpan paling banyak sekitar 600 koneksi dengan stabil.

Dan saya menemukan itu karena socket.io menggunakan polling panjang terlebih dahulu dan kemudian ditingkatkan ke websocket.

setelah saya mengatur konfigurasi untuk hanya menggunakan websocket, saya dapat menyimpan sekitar 9000 koneksi.

Setel konfigurasi ini di sisi klien:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })
Salem Chen
sumber
2
apakah Anda menggunakan EC2, contoh jenis apa? t2.micro, t2.nano?
bvdb
2
Apakah Anda melihat perbedaan dalam responsivitas saat Anda memaksa websockets?
Lauren
Tahukah Anda berapa ukuran instans Anda? Juga agar setiap orang di masa depan tahu beberapa browser lama tidak mendukung WebSockets, itulah sebabnya peningkatan mungkin penting bagi sebagian orang.
Ryan Soderberg
Bagaimana kami dapat menguji seberapa banyak koneksi yang didukung server? Bagaimana Anda mengukur 9000 koneksi? Mohon saran ..
Curious Developer
15

Orang ini tampaknya telah berhasil memiliki lebih dari 1 juta koneksi bersamaan di satu server Node.js.

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

Tidak jelas bagi saya berapa banyak port yang dia gunakan.

Daniel Nalbach
sumber
13
Tidak dengan socket.io saya pikir dan bahkan dengan websockets. Orang itu tampaknya menggunakan polling panjang yang menurut saya tidak terlalu haus sumber daya.
Tim 333
6

Untuk + 300k koneksi bersamaan:

Tetapkan variabel ini di /etc/sysctl.conf:

fs.file-max = 10000000 
fs.nr_open = 10000000

Juga, ubah variabel ini di /etc/security/limits.conf:

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

Dan terakhir, tingkatkan juga buffer TCP di /etc/sysctl.conf:

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

untuk informasi lebih lanjut silakan merujuk ke https://www.linangran.com/?p=547

MajidJafari
sumber
bagaimana cara memeriksa apakah perubahan kami berfungsi?
Curious Developer