È possibile elaborare milioni di datagrammi al secondo con Windows?


11

Sto studiando se posso implementare un'app HPC su Windows che riceve piccoli datagrammi multicast UDP (per lo più 100-400 byte) a una velocità elevata, usando una dozzina o fino a forse 200 gruppi multicast (cioè usando MSI-X e RSS posso scala a più core), esegue l'elaborazione per pacchetto, quindi lo invia. L'invio tramite TCP sono riuscito a salire fino a quando necessario (6,4Gb / sec) senza colpire un muro, ma la ricezione di datagrammi ad alta velocità pps si è rivelata un problema.

In un recente test su una macchina NUMA ad alta specifica con una scheda NIC Ethernet da 10 Gb a 2 porte su Windows 2012 R2, sono stato in grado di ricevere solo centinaia di migliaia di datagrammi UDP al secondo (drop iniziale, ovvero senza effettivamente elaborare i dati, a rimuovi il sovraccarico di elaborazione della mia app dall'equazione per vedere quanto diventa veloce) usando 2x12 core e la parte del kernel dei 12 gruppi multicast testati sembra essere distribuita su 8 o 10 core di un nodo NUMA (sono state impostate le code Max RSS a 16) - anche se con un'app .net, quindi le app native dovrebbero essere in grado di andare più velocemente.

Ma anche Len Holgate è riuscito a ricevere pacchetti UDP a 500kpps nei suoi test RIO Windows ad alte prestazioni , utilizzando un payload UDP di 1024 byte.

Nel white paper di QLogic (sistema operativo sotto test non menzionato) i limiti per "instradamento di pacchetti super-piccoli multi-thread" (in modo che includano sia la ricezione che il successivo invio?) Sono fissati a 5,7 Mbps . Negli articoli sulla rete Linux , i limiti sono fissati a 1Mpps a 2Mpps per core (secondo quanto riferito scalare più o meno linearmente), o anche 15Mpps con soluzioni speciali che bypassano il kernel.

Ad esempio netmap

può generare traffico a velocità di linea ( 14,88 Mpps ) su un collegamento 10GigE con un solo core in esecuzione a 900Mhz. Ciò equivale a circa 60-65 cicli di clock per pacchetto e si adatta bene ai core e alla frequenza di clock (con 4 core, la frequenza di linea viene raggiunta a meno di 450 MHz). Tariffe simili sono raggiunte dal lato di ricezione .

Quindi quanto lontano posso prendere (le ultime versioni di) Windows / Windows Server, in particolare la ricezione multicast UDP come descritto nel paragrafo iniziale?

Modifica C'è un post sul blog cloudflare - e un'interessante sezione di commenti - su come farlo su Linux: come ricevere un milione di pacchetti al secondo , e c'è la corrispondente pagina di commenti sulle notizie degli hacker .


@Ramhound In teoria, è probabilmente possibile in Windows. Ma come è possibile in pratica? Ormai mi sono imbattuto in parecchi rapporti di persone che raggiungono questi livelli in linux su hardware standard, ma non uno solo che si avvicini da qualche parte a Windows. E come pensi che potrei ridurre la portata della domanda? È solo questo: "Quali sono le più alte frequenze di ricezione multicast UDP in Windows?". La maggior parte del testo nella mia domanda sono solo esempi che dovrebbero mostrare che è possibile con Linux - e che ho fatto i compiti.
Eugene Beresovsky,

@Ramhound 'Se è possibile su Linux è possibile su Windows'. Non sono d'accordo rispettivamente .. un sistema che mi viene subito in mente è iptables .. sì, buona fortuna imitando quel sistema su Windows. ^ _ ^
NiCk Newman,

In realtà non ci stavo provando tanto, quindi potresti sempre prendere tutto il codice che ho a disposizione per i test RIO che ho fatto e continuare a spingere.
Len Holgate,

Risposte:


5

Secondo Microsoft, i test nel loro laboratorio hanno dimostrato che "su un particolare server nei primi test" di RIO , erano in grado di gestirli

  • 2Mpps senza perdita in Windows Server 2008R2, ovvero senza RIO
  • 4Mpps su (pre-release) Windows Server 8 utilizzando RIO

Screenshot da quel video (44:33):

inserisci qui la descrizione dell'immagine

Quindi la risposta alla mia domanda Is it possible to process millions of datagrams per second with Windows?sarebbe: , e apparentemente era anche prima di RIO, in Windows Server 2008R2.

Ma oltre ai dati ufficiali, specialmente sui software inediti, che devono essere presi con un pizzico di sale, con solo le informazioni sparse fornite in questa presentazione, rimangono molte domande sul test, e quindi su come interpretare correttamente i risultati. I più rilevanti sono:

  1. Le cifre sono per l'invio? Ricezione? O forse per il routing (ad esempio Ricevi + Invia)?
  2. Quale dimensione del pacchetto? -> Probabilmente il più basso possibile, come si fa generalmente quando si cerca di ottenere figure pps di cui vantarsi
  3. Quante connessioni (se TCP) / flussi di pacchetti (se UDP) ? -> Probabilmente il numero necessario per distribuire il carico di lavoro in modo da poter utilizzare tutti i nuclei presenti
  4. Quale configurazione di prova? Specifiche e cablaggio della macchina e della scheda di rete

Il primo è fondamentale, perché Sends and Receives richiedono passaggi diversi e possono mostrare differenze sostanziali nelle prestazioni. Per le altre figure, possiamo probabilmente supporre che la dimensione del pacchetto più bassa, con almeno un flusso di connessione / pacchetto per core sia stata utilizzata su una macchina ad alta specifica per ottenere le cifre Mpps massime possibili.


Modifica Mi sono appena imbattuto in un documento Intel sull'elaborazione di pacchetti ad alte prestazioni su Linux e, in base a ciò, il (Linux)

la piattaforma può sostenere una velocità di transazione di circa 2 milioni di transazioni al secondo

utilizzando lo stack di rete Linux standard (su un host fisico con 2x8 core). Una transazione in questo test di richiesta / risposta include entrambi

  1. ricezione di un pacchetto UDP
  2. successivo inoltro di quel pacchetto

(usando il netserver di netperf). Il test eseguiva 100 transazioni in parallelo. Ci sono molti più dettagli nel documento, per chi è interessato. Vorrei che avessimo qualcosa di simile per Windows da confrontare ... Comunque, ecco il grafico più rilevante per quel test di richiesta / risposta:

inserisci qui la descrizione dell'immagine


2

tl; dr

Per dare una risposta definitiva, sembrano necessari più test. Ma prove circostanziali suggeriscono che Linux è il sistema operativo utilizzato praticamente esclusivamente nella comunità a latenza ultra bassa, che elabora anche i carichi di lavoro di Mpps. Ciò non significa che sia impossibile con Windows, ma Windows probabilmente rimarrà un po 'indietro, anche se potrebbe essere possibile ottenere numeri Mpps. Ma questo ha bisogno di essere testato, ad esempio per capire a quale costo (CPU) è possibile raggiungere quei numeri.

NB Questa non è una risposta che intendo accettare. Ha lo scopo di dare a chiunque sia interessato a una risposta alla domanda alcuni suggerimenti su dove ci troviamo e dove indagare ulteriormente.


Len Holgate, che secondo Google sembra essere l'unico che ha testato RIO per ottenere maggiori prestazioni dalla rete di Windows (e ha pubblicato i risultati), ha appena chiarito in un commento sul suo blog che stava usando una singola combinazione IP / Port per l'invio dei pacchetti UDP.

In altre parole, i suoi risultati dovrebbero essere in qualche modo paragonabili alle singole figure principali nei test su Linux (anche se sta usando 8 thread - che, senza aver ancora verificato il suo codice, sembra dannoso per le prestazioni quando si gestisce solo un singolo flusso di pacchetti UDP e non facendo una pesante elaborazione dei pacchetti, e menziona solo pochi thread effettivamente utilizzati, il che avrebbe senso). Ciò nonostante lui stia dicendo:

Non mi stavo sforzando tanto per ottenere le massime prestazioni solo per confrontare le prestazioni relative tra vecchie e nuove API e quindi non ero così completo nei miei test.

Ma cosa sta rinunciando alla (relativa) zona di comfort dello IOCP standard per il mondo RIO più ruvido oltre a "provare duro"? Almeno per quanto riguarda un singolo flusso di pacchetti UDP.

Immagino che cosa significhi - mentre ha provato vari approcci di progettazione in diversi test di RIO - è che non ha ad esempio perfezionato le impostazioni della NIC per ridurre le prestazioni. Il che, ad esempio nel caso della dimensione del buffer di ricezione, potrebbe potenzialmente avere un impatto positivo enorme sulle cifre relative alle prestazioni e alla perdita di pacchetti di UDP.

Il problema, tuttavia, quando si tenta di confrontare direttamente i suoi risultati con quelli di altri test Linux / Unix / BSD è questo: la maggior parte dei test, quando si tenta di spingere il limite dei "pacchetti al secondo", utilizza la dimensione del pacchetto / frame più piccola possibile, ovvero una Ethernet frame di 64 byte. Len ha testato pacchetti da 1024 byte (-> un frame da 1070 byte), che (specialmente per No-Nagle UDP) può farti ottenere cifre di "bit al secondo" molto più elevate, ma potrebbe non superare il limite di pps per quanto riguarda i pacchetti più piccoli . Quindi non sarebbe giusto confrontare queste cifre così come sono.

Riassumendo i risultati della mia ricerca in Windows UDP ricevo prestazioni finora:

  • Nessuno sta davvero usando Windows quando tenta di sviluppare applicazioni a bassissima latenza e / o ad alta velocità, in questi giorni usano Linux
  • Praticamente tutti i test delle prestazioni e le relazioni con risultati reali (cioè non semplici pubblicità di prodotti) in questi giorni sono su Linux o BSD (grazie Len per essere stato un pioniere e averci fornito almeno un punto di riferimento!)
  • UDP (socket standard) su Windows è più veloce / più lento che su Linux? Non posso ancora dirlo, dovrei fare i miei test
  • UDP ad alte prestazioni (RIO vs netmap) su Windows è più veloce / più lento che su Linux? Linux gestisce facilmente la piena velocità della linea da 10 Gb con un singolo core a 900 MHz, Windows, nel migliore dei casi pubblicato è in grado di salire fino al 43% o 492kpps per un pacchetto UDP di grandi dimensioni di 1024, vale a dire che le cifre in bps per dimensioni più piccole saranno probabilmente significativamente peggio, anche se le cifre dei pps probabilmente aumenteranno (a meno che il fattore limitante non sia la gestione degli interrupt o qualche altro sovraccarico dello spazio del kernel).

Per quanto riguarda il motivo per cui usano Linux, ciò è dovuto al fatto che lo sviluppo di soluzioni che comportano cambiamenti del kernel come netmap o RIO - necessario quando si spingono le prestazioni al limite - è quasi impossibile con un sistema chiuso come Windows, a meno che i vostri stipendi non escano da Redmond, o hai un contratto speciale con Microsoft. Ecco perché RIO è un prodotto MS.

Infine, solo per dare alcuni esempi estremi di ciò che ho scoperto era e sta succedendo in terra Linux:

Già 15 anni fa, alcuni stavano ricevendo 680kpps usando una CPU Pentium III a 800 mHz, bus frontale da 133 mHz su una scheda NIC da 1 GbE. Modifica : Stavano usando Click , un router in modalità kernel che bypassa gran parte dello stack di rete standard, cioè ha "imbrogliato".

Nel 2013, Argon Design è riuscito a ottenere

spunta per scambiare latenze a partire da 35 ns [nano secondi]

Tra l'altro lo affermano anche

La stragrande maggioranza del codice di elaborazione esistente per il trading di oggi è scritto per Linux su architetture di processori x86.

e Argon usano lo switch Arista 7124FX , che (oltre a un FPGA) ha un sistema operativo

costruito sopra un kernel Linux standard.


0

Avrai sicuramente bisogno di "misurare" diverse configurazioni e scenari. Questo può essere fatto AFAIK con due attrezzi forniti da 2 aziende. IXIA e Spirent . Offrono generatori di traffico basati su hardware in grado di pompare il traffico alla velocità della linea. Offrono un test di rampa in cui è possibile rilevare la velocità con cui il proprio sistema potrebbe crollare. I dispositivi sono costosi ma puoi noleggiarli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.