Saya sedang menyelidiki apakah saya dapat mengimplementasikan aplikasi HPC pada Windows yang menerima datagram multicast UDP kecil (kebanyakan 100-400 Bytes) dengan kecepatan tinggi, menggunakan selusin atau hingga mungkin 200 grup multicast (yaitu menggunakan MSI-X dan RSS saya dapat skala ke beberapa core), melakukan beberapa pemrosesan per paket, dan kemudian mengirimkannya. Mengirim melalui TCP saya berhasil naik sejauh yang saya butuhkan (6.4Gb / detik) tanpa menabrak dinding, tetapi menerima datagram dengan kecepatan pps tinggi ternyata menjadi masalah.
Dalam pengujian baru - baru ini pada mesin NUMA spec tinggi dengan 2-port 10Gb ethernet NIC pada Windows 2012 R2, saya hanya dapat menerima ratusan ribu datagram UDP per detik (drop awal, yaitu tanpa benar-benar memproses data, untuk hapus overhead pemrosesan aplikasi saya dari persamaan untuk melihat seberapa cepat didapatnya) menggunakan 2x12 core, dan bagian kernel dari 12 grup multicast yang diuji nampaknya didistribusikan di 8 atau 10 core dari satu NUMA node ( Max RSS antrian ditetapkan ke 16) - meskipun dengan aplikasi .net, jadi aplikasi asli harus dapat berjalan lebih cepat.
Tetapi bahkan Len Holgate hanya berhasil menerima paket-paket UDP dengan kecepatan 500 kpps dalam tes-tes Windows RIO-nya yang tinggi , menggunakan muatan UDP sebesar 1024 byte.
Dalam whitepaper QLogic (OS yang diuji tidak disebutkan) batas untuk "routing paket super-kecil multi-threaded" (sehingga mencakup pengiriman yang diterima dan yang berikutnya?) Diatur pada 5,7Mpps . Dalam artikel di jaringan Linux , batasnya ditetapkan pada 1Mpps hingga 2Mpps per inti (dilaporkan meningkatkan lebih atau kurang linier), atau bahkan 15Mpps dengan solusi khusus yang memintas kernel.
Misalnya netmap
dapat menghasilkan lalu lintas pada tingkat garis ( 14.88Mpps ) pada tautan 10GigE dengan hanya satu inti berjalan pada 900Mhz. Ini sama dengan sekitar 60-65 clock cycle per paket, dan skala baik dengan core dan frekuensi clock (dengan 4 core, line rate dicapai pada kurang dari 450 MHz). Tarif serupa tercapai di sisi penerima .
Jadi seberapa jauh saya dapat mengambil (versi terbaru dari) Windows / Windows Server, khususnya menerima multicast UDP seperti yang dijelaskan dalam paragraf terkemuka?
Sunting Ada posting blog cloudflare - dan bagian komentar yang menarik - tentang cara melakukannya di Linux: Cara menerima satu juta paket per detik , dan ada halaman komentar berita hacker yang sesuai .
sumber
Jawaban:
Menurut Microsoft, tes di lab mereka menunjukkan bahwa "pada server tertentu dalam pengujian awal" RIO , mereka mampu mengatasinya
Tangkapan layar dari video itu (44:33):
Jadi jawaban untuk pertanyaan saya
Is it possible to process millions of datagrams per second with Windows?
adalah: Ya , dan ternyata itu bahkan sebelum RIO, di Windows Server 2008R2.Namun selain angka resmi, terutama pada perangkat lunak yang tidak dirilis, harus diambil dengan sedikit garam, dengan hanya sedikit informasi yang diberikan dalam presentasi ini, banyak pertanyaan tentang tes, dan karenanya bagaimana menginterpretasikan hasil dengan benar, tetap ada. Yang paling relevan adalah:
Yang pertama sangat penting, karena Mengirim dan Menerima memerlukan langkah-langkah berbeda dan dapat menunjukkan perbedaan besar dalam kinerja. Untuk gambar lain, kita mungkin dapat mengasumsikan bahwa ukuran paket terendah, dengan setidaknya satu koneksi / aliran paket per inti sedang digunakan pada mesin spesifikasi tinggi untuk mendapatkan angka Mpps maksimum yang dimungkinkan.
Sunting Saya baru saja menemukan dokumen Intel tentang Pemrosesan Paket Kinerja Tinggi di Linux, dan menurut itu, (Linux)
menggunakan tumpukan jaringan Linux standar (pada host fisik dengan 2x8 core). Transaksi dalam tes permintaan / balasan ini mencakup keduanya
(menggunakan netperf's netserver). Tes ini menjalankan 100 transaksi secara paralel. Ada banyak lagi rincian di koran, untuk mereka yang tertarik. Saya berharap kami memiliki sesuatu seperti ini untuk dibandingkan dengan Windows ... Pokoknya, inilah grafik yang paling relevan untuk tes permintaan / balasan itu:
sumber
tl; dr
Untuk memberikan jawaban yang pasti, tes lebih lanjut tampaknya diperlukan. Tetapi bukti kuat menunjukkan bahwa Linux adalah OS yang digunakan secara praktis di komunitas latensi sangat rendah, yang juga secara rutin memproses beban kerja Mpps. Itu tidak berarti tidak mungkin dengan Windows, tetapi Windows mungkin akan tertinggal sedikit, meskipun mungkin untuk mencapai angka Mpps. Tapi itu perlu pengujian untuk dipastikan, dan misalnya untuk mencari tahu berapa (CPU) biaya angka-angka itu dapat dicapai.
NB Ini bukan jawaban yang ingin saya terima. Hal ini dimaksudkan untuk memberikan siapa pun yang tertarik pada jawaban atas pertanyaan beberapa petunjuk tentang di mana kita berdiri dan di mana untuk menyelidiki lebih lanjut.
Len Holgate, yang menurut google tampaknya menjadi satu-satunya yang telah menguji RIO untuk mendapatkan lebih banyak kinerja dari jaringan Windows (dan menerbitkan hasilnya), hanya mengklarifikasi dalam komentar di blognya bahwa ia menggunakan kombo IP / Port tunggal untuk mengirim paket UDP.
Dengan kata lain, hasilnya harus agak sebanding dengan angka inti tunggal dalam pengujian di Linux (meskipun ia menggunakan 8 utas - yang, tanpa memeriksa kodenya, tampaknya berbahaya untuk kinerja saat menangani hanya satu aliran paket UDP dan tidak melakukan pemrosesan berat pada paket, dan ia menyebutkan hanya beberapa thread yang benar-benar digunakan, yang akan masuk akal). Itu meskipun dia mengatakan:
Tapi apa yang melepaskan zona kenyamanan (relatif) dari IOCP standar untuk dunia RIO yang lebih kasar selain "berusaha keras"? Setidaknya sejauh satu aliran paket UDP yang bersangkutan.
Saya kira apa yang dia maksudkan - ketika dia mencoba berbagai pendekatan desain dalam beberapa tes RIO - adalah bahwa dia tidak misalnya memperbaiki pengaturan NIC untuk memeras sedikit performa terakhir. Yang, misalnya dalam hal Receive Buffer Size berpotensi memberikan dampak positif yang sangat besar pada UDP, menerima kinerja dan angka kehilangan paket.
Namun masalahnya ketika mencoba untuk membandingkan hasilnya secara langsung dengan tes Linux / Unix / BSD lainnya adalah ini: Kebanyakan tes, ketika mencoba untuk mendorong batas "paket per detik", gunakan ukuran paket / bingkai sekecil mungkin, yaitu Ethernet bingkai 64 byte. Len menguji paket 1024 byte (-> frame 1070 byte), yang (terutama untuk UDP No-Nagle) dapat memberi Anda angka "bit per detik" yang jauh lebih tinggi, tetapi mungkin tidak mendorong batas pps sejauh mungkin dengan paket yang lebih kecil . Jadi tidak adil untuk membandingkan angka-angka ini sebagaimana adanya.
Menyimpulkan hasil pencarian saya ke dalam Windows UDP menerima kinerja sejauh ini:
Mengenai mengapa mereka menggunakan linux, itu pasti karena mengembangkan solusi yang melibatkan perubahan kernel seperti netmap atau RIO - diperlukan ketika mendorong kinerja hingga batasnya - hampir tidak mungkin dengan sistem tertutup seperti Windows, kecuali gaji Anda kebetulan keluar dari Redmond, atau Anda memiliki kontrak khusus dengan Microsoft. Itulah sebabnya RIO adalah produk MS.
Akhirnya, hanya untuk memberikan beberapa contoh ekstrim dari apa yang saya temukan sedang dan sedang terjadi di Linux:
Sudah 15 tahun yang lalu, beberapa menerima 680 kpps menggunakan 800 mHz Pentium III CPU, 133 mHz front-side bus pada NIC 1GbE.Sunting : Mereka menggunakan Click , sebuah router mode-kernel yang melewati banyak tumpukan jaringan standar, yaitu mereka "curang".Pada 2013, Argon Design berhasil mendapatkan
Tapi mereka juga mengklaim itu
dan Argon menggunakan sakelar Arista 7124FX , yang (selain FPGA) memiliki OS
sumber
Anda tentu perlu "mengukur" berbagai konfigurasi dan skenario. Ini dapat dilakukan AFAIK dengan dua gigi yang disediakan oleh 2 perusahaan. IXIA dan Spirent . Mereka menawarkan generator lalu lintas berbasis perangkat keras yang dapat memompa lalu lintas dengan kecepatan jalur. Mereka menawarkan uji ramp di mana Anda dapat mendeteksi kecepatan di mana sistem tertentu Anda mungkin runtuh. Perangkat itu mahal tetapi Anda bisa menyewanya.
sumber