Konten ini telah dibahas berkali-kali di cnblogs. Saya telah membaca beberapa informasi dalam dua hari terakhir dan melihat beberapa indikator kinerja sederhana dan mendiskusikannya dengan semua orang.
Soket + Utas/Kolam Utas
Perkiraan kinerja: kurang dari 1500 koneksi.
Implementasi: Terima Socket dan serahkan ke thread untuk dikelola. Hal yang lebih canggih adalah menyerahkannya ke kumpulan thread untuk dikelola. Kumpulan thread secara otomatis dihosting oleh sistem, menghemat waktu thread overhead. Untuk proyek-proyek kecil secara umum, ini sudah cukup dan pengembangannya sederhana. Namun perlu diketahui bahwa jika beberapa Soket menempati thread di kumpulan thread untuk waktu yang lama dan terdapat banyak koneksi lainnya, akan mudah untuk mendapatkan prompt yang mengatakan bahwa Anda tidak memiliki cukup thread untuk digunakan. Haha, sebaiknya biarkan Socket melakukan lebih sedikit pekerjaan dan menghabiskan lebih sedikit waktu. Mengganti ke CPU yang lebih cepat adalah cara yang baik. Selain itu, jika ada beberapa komponen kumpulan thread pihak ketiga yang lebih baik, Anda juga dapat memilih untuk menggunakannya, seperti SmartThreadPool.
Soket+Pilih
Perkiraan kinerja: Kinerja menurun setelah lebih dari 1500 koneksi.
Implementasi: Pilih adalah model yang sangat umum digunakan. Ini untuk melakukan polling pada satu atau lebih Socket dalam fungsi pemblokiran, dan memasukkan Socket yang akan diproses ke dalam IList. Ketika polling Select selesai, kami kemudian akan memproses sendiri Socket di IList ini. Untuk penggunaan spesifik, silakan merujuk ke MSDN. Efisiensi Select tidak bisa dikatakan tinggi, karena ketika ada banyak Socket yang akan diproses dalam antrian, memproses beberapa Socket terakhir sama dengan melintasi semua Socket sebelumnya, yang sangat tidak ekonomis.
Soket+Asinkron
Perkiraan kinerja: sekitar 7500 koneksi klien
Implementasi: BeginXXXX, EndXXXX, kita semua sudah familiar dengannya. Pada analisa akhir, Socket asynchronous masih menggunakan teknologi thread pool, menggunakan thread pool untuk menangani IO asynchronous. Hal ini menimbulkan pertanyaan lain, metode implementasi apa yang digunakan untuk kumpulan thread .NET? Saya pernah melihat seseorang mengatakan sebelumnya bahwa kumpulan thread .NET diimplementasikan menggunakan port penyelesaian dari informasi yang saya temukan (saya harap teman dapat memberi tahu saya hal ini). Soket Asinkron jauh lebih rumit daripada alur pemrosesan program sinkron, dan kontrol fungsi panggilan balik asinkron tidak seintuitif metode sinkron. Namun satu hal yang menurut saya perlu diperhatikan adalah bahwa fungsi panggilan balik harus digunakan dengan ringan dan tidak menangani terlalu banyak transaksi. Pemrosesan data yang ditransfer harus diserahkan ke thread lain untuk diproses.
IOCP (port penyelesaian)
Perkiraan kinerja: sekitar 20.000~50.000 koneksi klien
. Implementasi: Ada beberapa pseudo-IOCP di bawah .NET. Anda dapat mencarinya. Saya belum melihat contoh SOCKET terbuka yang diimplementasikan menggunakan pseudo-IOCP ini. 20.000~50.000 koneksi klien yang saya bicarakan mengacu pada situasi pengembangan di bawah C++, dalam hal ini, teknologi dasar yang perlu digunakan meliputi kumpulan memori, algoritma kueri, dll.
Tidak ada informasi untuk memeriksa jumlah maksimum koneksi yang dapat dicapai pseudo-IOCP. Selain itu, banyak data yang disebutkan di atas diambil dari beberapa informasi. Saya sendiri belum mencobanya. Saya hanya membawanya untuk berdiskusi dengan semua orang. Menurut saya program server berperforma tinggi mungkin memerlukan teknologi tidak hanya model apa yang akan digunakan, tetapi juga banyak detail yang perlu diperhatikan, seperti pemrosesan memori, algoritma apa yang digunakan, dll. Tentu saja ini hanya dalam hal biaya perangkat lunak. Pasti akan ada investasi pada perangkat keras.