Katakanlah jika saya harus berbagi, virtual atau hosting khusus, saya membaca di suatu tempat server / mesin hanya dapat menangani 64.000 koneksi TCP pada satu waktu, apakah ini benar? Berapa banyak jenis hosting yang dapat menangani berapa pun bandwidth-nya? Saya berasumsi HTTP bekerja melalui TCP.
Apakah ini berarti hanya 64.000 pengguna yang dapat terhubung ke situs web, dan jika saya ingin melayani lebih banyak, saya harus pindah ke web farm?
Jawaban:
Singkatnya: Anda harus dapat mencapai dalam urutan jutaan koneksi TCP aktif simultan dan dengan ekstensi permintaan HTTP. Ini memberi tahu Anda kinerja maksimum yang dapat Anda harapkan dengan platform yang tepat dengan konfigurasi yang tepat.
Hari ini, saya khawatir apakah IIS dengan ASP.NET akan mendukung dalam urutan 100 koneksi bersamaan (lihat pembaruan saya, harapkan ~ 10k tanggapan per detik pada versi ASP.Net Mono yang lebih lama). Ketika saya melihat pertanyaan / jawaban ini, saya tidak bisa menahan diri untuk menjawab sendiri, banyak jawaban atas pertanyaan di sini yang sepenuhnya salah.
Kasus terbaik
Jawaban atas pertanyaan ini harus hanya memusatkan perhatian pada konfigurasi server paling sederhana untuk memisahkan dari variabel yang tak terhitung jumlahnya dan kemungkinan konfigurasi di hilir.
Jadi pertimbangkan skenario berikut untuk jawaban saya:
Jawaban Terperinci
Desain thread-terikat sinkron cenderung memiliki performa paling buruk dibandingkan dengan implementasi IO Asinkron.
WhatsApp mendapatkan satu juta DENGAN lalu lintas pada satu mesin OS rasa Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
Dan terakhir, yang ini, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , membahas banyak detail , mengeksplorasi bagaimana bahkan 10 juta dapat dicapai. Server sering kali memiliki mesin pembongkar TCP perangkat keras, ASIC dirancang untuk peran khusus ini secara lebih efisien daripada CPU tujuan umum.
Pilihan desain perangkat lunak yang bagus
Desain Asynchronous IO akan berbeda di seluruh Sistem Operasi dan platform Pemrograman. Node.js dirancang dengan asynchronous dalam pikiran. Anda harus menggunakan Promises setidaknya, dan ketika ECMAScript 7 hadir,
async
/await
. C # /. Net sudah memiliki dukungan asinkron penuh seperti node.js. Apapun OS dan platformnya, asynchronous diharapkan dapat bekerja dengan sangat baik. Dan bahasa apa pun yang Anda pilih, cari kata kunci "asynchronous", sebagian besar bahasa modern akan memiliki beberapa dukungan, meskipun itu semacam add-on.Ke WebFarm?
Apa pun batasannya untuk situasi khusus Anda, ya, web-farm adalah salah satu solusi yang baik untuk penskalaan. Ada banyak arsitektur untuk mencapai ini. Salah satunya adalah menggunakan penyeimbang beban (penyedia hosting dapat menawarkan ini, tetapi bahkan ini memiliki batas, bersama dengan plafon bandwidth), tetapi saya tidak menyukai opsi ini. Untuk Aplikasi Halaman Tunggal dengan koneksi yang berjalan lama, saya lebih memilih untuk memiliki daftar server terbuka yang akan dipilih aplikasi klien secara acak saat startup dan digunakan kembali selama masa pakai aplikasi. Ini menghilangkan satu titik kegagalan (load balancer) dan memungkinkan penskalaan melalui beberapa pusat data dan oleh karena itu lebih banyak bandwidth.
Menghancurkan mitos - 64K port
Untuk menjawab komponen pertanyaan tentang "64.000", ini adalah kesalahpahaman. Sebuah server dapat terhubung ke lebih dari 65535 klien. Lihat /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
Omong-omong, Http.sys di Windows mengizinkan beberapa aplikasi untuk berbagi port server yang sama di bawah skema HTTP URL. Mereka masing-masing mendaftarkan pengikatan domain terpisah, tetapi pada akhirnya ada satu aplikasi server yang mem-proxy permintaan ke aplikasi yang benar.
Perbarui 2019-05-30
Berikut adalah perbandingan terkini dari perpustakaan HTTP tercepat - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
sumber
Pertanyaan ini cukup sulit. Tidak ada batasan perangkat lunak nyata pada jumlah koneksi aktif yang dapat dimiliki mesin, meskipun beberapa OS lebih terbatas daripada yang lain. Masalah menjadi salah satu sumber daya. Misalnya, satu mesin ingin mendukung 64.000 koneksi simultan. Jika server menggunakan 1MB RAM per koneksi, itu akan membutuhkan 64GB RAM. Jika setiap klien perlu membaca file, beban akses disk atau larik penyimpanan menjadi jauh lebih besar daripada yang dapat ditangani perangkat tersebut. Jika server perlu membagi satu proses per koneksi maka OS akan menghabiskan sebagian besar waktunya untuk beralih konteks atau proses kelaparan untuk waktu CPU.
The masalah C10K halaman memiliki diskusi yang sangat baik dari masalah ini.
sumber
Untuk menambahkan dua sen saya ke percakapan, sebuah proses dapat secara bersamaan membuka sejumlah soket yang terhubung sama dengan nomor ini (dalam sistem tipe Linux) / proc / sys / net / core / somaxconn
cat / proc / sys / net / core / somaxconn
Nomor ini dapat dimodifikasi dengan cepat (tentu saja hanya oleh pengguna root)
echo 1024> / proc / sys / net / core / somaxconn
Tetapi sepenuhnya tergantung pada proses server, perangkat keras mesin dan jaringan, jumlah sebenarnya dari soket yang dapat dihubungkan sebelum sistem crash
sumber
listen(int socket, int backlog)
. Ini tidak terkait dengan jumlah soket yang dapat dibuka oleh suatu proses.Sepertinya jawabannya adalah setidaknya 12 juta jika Anda memiliki server yang besar, perangkat lunak server Anda dioptimalkan untuk itu, Anda memiliki cukup klien. Jika Anda menguji dari satu klien ke satu server, jumlah nomor port pada klien akan menjadi salah satu batas sumber daya yang jelas (Setiap sambungan TCP ditentukan oleh kombinasi unik dari IP dan nomor port di sumber dan tujuan).
(Anda perlu menjalankan banyak klien karena jika tidak, Anda mencapai batas 64K pada nomor port terlebih dahulu)
Ketika sampai pada itu, ini adalah contoh klasik dari kecerdasan bahwa "perbedaan antara teori dan praktek jauh lebih besar dalam praktek daripada dalam teori" - dalam prakteknya mencapai angka yang lebih tinggi tampaknya merupakan siklus a. mengusulkan konfigurasi / arsitektur / perubahan kode tertentu, b. mengujinya sampai Anda mencapai batas, c. Apakah saya sudah selesai? Jika tidak maka d. mencari tahu apa faktor pembatasnya, e. kembali ke langkah a (bilas dan ulangi).
Berikut adalah contoh dengan 2 juta koneksi TCP ke kotak besar (128GB RAM dan 40 core) menjalankan Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections - mereka berakhir up membutuhkan 50 atau lebih server yang cukup signifikan hanya untuk menyediakan beban klien (klien awal mereka yang lebih kecil dimaksimalkan hingga awal, misalnya "memaksimalkan kotak 4core / 15gb kami @ 450k klien").
Berikut adalah referensi lain untuk pergi kali ini di 10 juta: http://goroutines.com/10m .
Tampaknya ini berbasis java dan 12 juta koneksi: https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/
sumber
Perhatikan bahwa HTTP biasanya tidak membuat koneksi TCP terbuka lebih lama dari yang dibutuhkan untuk mengirimkan halaman ke klien; dan biasanya membutuhkan lebih banyak waktu bagi pengguna untuk membaca halaman web daripada yang diperlukan untuk mengunduh halaman ... saat pengguna melihat halaman, dia tidak menambahkan beban ke server sama sekali.
Jadi jumlah orang yang dapat melihat situs web Anda secara bersamaan jauh lebih besar daripada jumlah koneksi TCP yang dapat dilayani secara bersamaan.
sumber
dalam kasus protokol IPv4, server dengan satu alamat IP yang mendengarkan pada satu port hanya dapat menangani 2 ^ 32 alamat IP x 2 ^ 16 port sehingga 2 ^ 48 soket unik. Jika Anda berbicara tentang server sebagai mesin fisik, dan Anda dapat menggunakan semua 2 ^ 16 port, maka maksimum 2 ^ 48 x 2 ^ 16 = 2 ^ 64 soket TCP / IP unik untuk satu alamat IP. Harap dicatat bahwa beberapa port dicadangkan untuk OS, jadi angka ini akan lebih rendah. Untuk menyimpulkan:
1 IP dan 1 port -> 2 ^ 48 soket
1 IP dan semua port -> 2 ^ 64 soket
semua soket IPv4 unik di alam semesta -> 2 ^ 96 soket
sumber
Ada dua diskusi berbeda di sini: Pertama adalah berapa banyak orang yang dapat terhubung ke server Anda. Yang ini telah dijawab dengan memadai oleh orang lain, jadi saya tidak akan membahasnya.
Lainnya adalah berapa banyak port yang dapat didengarkan oleh server Anda? Saya yakin dari sinilah angka 64K itu berasal. Sebenarnya, protokol TCP menggunakan pengenal 16-bit untuk sebuah port, yang diterjemahkan menjadi 65536 (sedikit lebih dari 64K). Ini berarti bahwa Anda dapat memiliki banyak "pendengar" yang berbeda di server per Alamat IP.
sumber
Saya pikir jumlah koneksi soket bersamaan yang dapat ditangani satu server web sangat bergantung pada jumlah sumber daya yang dikonsumsi setiap koneksi dan jumlah total sumber daya yang tersedia di server, kecuali konfigurasi pembatas sumber daya server web lainnya.
Sebagai ilustrasi, jika setiap koneksi soket menggunakan 1MB sumber daya server dan server memiliki 16GB RAM yang tersedia (secara teoritis), ini berarti itu hanya dapat menangani koneksi bersamaan (16GB / 1MB). Saya pikir sesederhana itu ... SANGAT!
Jadi, terlepas dari bagaimana server web menangani koneksi, setiap koneksi pada akhirnya akan menghabiskan beberapa sumber daya.
sumber