Apakah mungkin untuk memproses jutaan datagram per detik dengan Windows?

11

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 .

Eugene Beresovsky
sumber
@Ramhound Secara teori, mungkin saja di Windows. Tetapi bagaimana mungkin dalam praktiknya? Sekarang saya telah menemukan beberapa laporan dari orang-orang yang mencapai level ini di linux pada perangkat keras standar, tetapi tidak ada satu pun yang mendekati Windows. Dan bagaimana menurut Anda saya bisa mengurangi ruang lingkup pertanyaan? Hanya saja ini: "Berapa tingkat penerimaan multicast UDP tertinggi di Windows?" Sebagian besar teks dalam pertanyaan saya hanyalah contoh yang seharusnya menunjukkan hal itu mungkin dengan linux - dan bahwa saya telah melakukan pekerjaan rumah saya.
Eugene Beresovsky
@Ramhound 'Jika memungkinkan di Linux, mungkin pada Windows'. Saya masing-masing tidak setuju .. satu sistem yang langsung terlintas dalam pikiran adalah iptables .. ya semoga berhasil meniru sistem itu di windows. ^ _ ^
NiCk Newman
Sebenarnya saya tidak berusaha terlalu keras, jadi Anda selalu bisa mengambil semua kode yang saya miliki untuk pengujian RIO yang saya lakukan dan terus mendorong.
Len Holgate

Jawaban:

5

Menurut Microsoft, tes di lab mereka menunjukkan bahwa "pada server tertentu dalam pengujian awal" RIO , mereka mampu mengatasinya

  • 2Mpps tanpa kehilangan di Windows Server 2008R2, yaitu tanpa RIO
  • 4Mpps aktif (pra-rilis) Windows Server 8 menggunakan RIO

Tangkapan layar dari video itu (44:33):

masukkan deskripsi gambar di sini

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:

  1. Apakah angka untuk Mengirim? Menerima? Atau mungkin untuk Routing (mis. Terima + Kirim)?
  2. Ukuran paket apa? -> Mungkin yang serendah mungkin, seperti yang umumnya dilakukan ketika mencoba untuk mendapatkan angka pps untuk dibanggakan
  3. Berapa banyak koneksi (jika TCP) / packet stream (jika UDP) ? -> Mungkin sebanyak yang diperlukan untuk mendistribusikan beban kerja sehingga semua core yang ada dapat digunakan
  4. Pengaturan tes apa? Spesifikasi dan kabel NIC dan mesin

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)

platform dapat mempertahankan tingkat transaksi sekitar 2 juta transaksi per detik

menggunakan tumpukan jaringan Linux standar (pada host fisik dengan 2x8 core). Transaksi dalam tes permintaan / balasan ini mencakup keduanya

  1. penerimaan paket UDP
  2. penerusan selanjutnya paket itu

(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:

masukkan deskripsi gambar di sini

Eugene Beresovsky
sumber
2

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:

Saya tidak berusaha sekeras itu untuk mendapatkan kinerja maksimal hanya untuk membandingkan kinerja relatif antara API lama dan baru, jadi saya tidak teliti dalam pengujian saya.

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:

  • Tidak ada yang benar-benar menggunakan Windows ketika mencoba mengembangkan latensi sangat rendah dan / atau aplikasi throughput tinggi, hari ini mereka menggunakan Linux
  • Praktis semua tes kinerja dan laporan dengan hasil aktual (yaitu bukan hanya iklan produk) hari ini ada di Linux atau BSD (terima kasih Len karena telah menjadi pelopor dan memberi kami setidaknya satu titik referensi!)
  • Apakah UDP (soket standar) di Windows lebih cepat / lebih lambat daripada di Linux? Saya belum tahu, harus melakukan pengujian sendiri
  • Apakah UDP berkinerja tinggi (RIO vs netmap) pada Windows lebih cepat / lebih lambat daripada di Linux? Linux dengan mudah menangani kecepatan garis 10Gb penuh dengan satu inti pada 900MHz, Windows, dalam kasus terbaik yang diterbitkan mampu naik hingga 43% atau 492kpps untuk paket ukuran UDP besar 1024, yaitu angka bps untuk ukuran yang lebih kecil mungkin akan secara signifikan lebih buruk, meskipun angka pps mungkin akan naik (kecuali penanganan interupsi atau overhead ruang kernel lainnya adalah faktor pembatas).

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

centang untuk berdagang latensi serendah 35ns [nano detik]

Tapi mereka juga mengklaim itu

Sebagian besar kode komputasi yang ada untuk perdagangan hari ini ditulis untuk Linux pada arsitektur prosesor x86.

dan Argon menggunakan sakelar Arista 7124FX , yang (selain FPGA) memiliki OS

dibangun di atas kernel Linux standar.

Eugene Beresovsky
sumber
0

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.

Menepuk
sumber