Condividi tramite


Scalabilità del Lato Ricezione Versione 2 (RSSv2)

Receive Side Scaling migliora le prestazioni del sistema correlate alla gestione dei dati di rete nei sistemi multiprocessore. NDIS 6.80 e versioni successive supportano RSS versione 2 (RSSv2), che estende RSS offrendo una distribuzione dinamica delle code per ciascun VPort.

Panoramica

Rispetto a RSSv1, RSSv2 riduce il tempo tra la misurazione del carico della CPU e l'aggiornamento della tabella di riferimento indiretto, evitando rallentamenti durante situazioni di traffico elevato. A tale scopo, RSSv2 esegue le azioni in IRQL = DISPATCH_LEVEL, nel contesto del processore di gestione della richiesta e opera solo su un subset di voci di tabella di riferimento indiretto che puntano al processore corrente. Ciò significa che RSSv2 può distribuire dinamicamente le code di ricezione su più processori in modo più reattivo rispetto a RSSv1.

Sono stati introdotti due OID, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 e OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, in RSSv2 per consentire ai driver miniport di impostare le funzionalità RSS appropriate e controllare rispettivamente la tabella di indirizzamento indiretto. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 è un OID regolare, mentre OID_GEN_RSS_SET_INDIRECTION_ENTRIES è un OID sincrono che non può restituire NDIS_STATUS_PENDING. Per ulteriori informazioni su questi OID, vedi le singole pagine di riferimento. Per altre informazioni sugli ID sincroni, vedi interfaccia di richiesta OID sincrona in NDIS 6.80.

Terminologia di RSSv2

Questo articolo usa le condizioni seguenti:

Termine Definizione
RSSv1 Il meccanismo di scaling del lato ricevente della prima generazione. Usa OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Il meccanismo di scalabilità dal lato ricevente della seconda generazione supportato in Windows 10, versione 1803 e successive, è descritto in questo articolo.
Ridimensionamento dell'entità L'adattatore miniport stesso in modalità RSS nativa o VPort in modalità RSSv2.
ITE Voce di una tabella di indirizzamento (ITE) di una specifica entità di scalabilità. Il numero totale di ITE per VPort non può superare NumberOfIndirectionTableEntriesPerNonDefaultPFVPort o NumberOfIndirectionTableEntriesForDefaultVPort in modalità VMQ o 128 nel caso RSS nativo. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort e NumberOfIndirectionTableEntriesForDefaultVPort sono membri della struttura NDIS_NIC_SWITCH_CAPABILITIES.
Modalità di ridimensionamento Il criterio per-VPort vmswitch che controlla come i suoi ITE vengono gestiti in fase di esecuzione. Può trattarsi di un'operazione statica (senza spostamenti ITE dovuti a modifiche al carico) o dinamiche (espansione e unione a seconda del carico di traffico corrente).
Coda Oggetto hardware sottostante (coda) che sostiene un ITE. A seconda dell'hardware e della tabella di riferimento indiretto, la coda di configurazione può eseguire il backup di più ITE. Il numero totale di code, incluso quello usato dalla coda predefinita, non può superare il limite preconfigurato in genere impostato da un amministratore.
Processore predefinito Processore che riceve pacchetti per cui non è possibile calcolare l'hash. Ogni VPort ha un processore predefinito.
Processore primario Processore specificato come membro ProcessorAffinity della struttura NDIS_NIC_SWITCH_VPORT_PARAMETERS durante la creazione di un VPort. Questo processore può essere aggiornato in fase di esecuzione e specifica dove viene indirizzato il traffico VMQ.
CPU di origine Processore a cui è attualmente mappato l'ITE.
CPU di destinazione Processore a cui viene eseguito nuovamente il mapping dell'ITE (tramite RSSv2).
CPU dell'attore Processore in cui vengono effettuate richieste RSSv2.

Pubblicità della funzionalità RSSv2 in un driver miniport

I driver Miniport annunciano il supporto RSSv2 impostando il CapabilitiesFlags membro della struttura NDIS_RECEIVE_SCALE_CAPABILITIES con il flag NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Questa funzionalità è necessaria per abilitare la funzionalità di bilanciamento del carico della CPU RSSv2, insieme al flag NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED che abilita il bilanciamento dinamico RSSv1 per vPort non predefiniti (VMQs).

Nota

I protocolli di livello superiore presuppongono che il processore primario del VPort predefinito possa essere spostato per i driver miniport RSSv2.

Se un adattatore miniport non annuncia la funzionalità RSSv2, tutte le porte virtuali abilitate per VMQ rimangono in modalità di distribuzione statica anche se queste VPort sono richieste per eseguire la distribuzione dinamica. L'OID RSSv1 per la configurazione dei parametri RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, viene usato per queste VPort ancora in modalità di distribuzione statica.

I driver Miniport devono implementare solo un meccanismo di controllo RSS: RSSv1 o RSSv2. Se il driver annuncia il supporto RSSv2, NDIS convertirà gli OID RSSv1 in OID RSSv2, se necessario per configurare la distribuzione per VPort. Il driver miniport deve supportare i due nuovi OID e modificare il comportamento di RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID come indicato di seguito:

Gestione degli OID RSSv2

OID_GEN_RECEIVE_SCALE_PARAMETERS viene usato solo per interrogare i parametri RSS correnti di una specifica entità di scaling. In RSSv1 questo OID viene usato per impostare i parametri. Per i driver miniport compatibili con RSSv2, NDIS esegue automaticamente questa conversione del ruolo per il driver e rilascia i due OID seguenti per impostare i parametri.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 è un OID regolare e viene gestito nello stesso modo di OID_GEN_RECEIVE_SCALE_PARAMETERS in RSSv1. Questo OID non è visibile ai driver di filtro NDIS leggeri (LWFs) prima di NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, tuttavia, è un OID sincrono che non può restituire NDIS_STATUS_PENDING. Questo OID deve essere eseguito e completato nel contesto del processore che ha originato l'OID. Come OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, non è visibile anche a NDIS LWFs prima di NDIS 6.80. Le LWF in NDIS 6.80 e versioni successive non sono autorizzate a ritardare questo OID o a spostarsi in un altro processore. Il payload contiene un insieme di semplici azioni di spostamento ITE, ognuna delle quali include un comando per spostare un singolo ITE di un'entità ridimensionabile verso una CPU di destinazione diversa. Gli elementi della matrice possono fare riferimento a entità di ridimensionamento diverse (VPorts).

Ogni tipo di driver NDIS, miniport, filtro e protocollo include punti di ingresso per supportare l'interfaccia di richiesta OID sincrona:

Tipo di driver NDIS Gestori OID sincroni Funzione per la generazione di OID sincroni
Miniport MiniportSynchronousOidRequest N/D
Filtro NdisFSynchronousOidRequest
Protocollo N/D NdisSynchronousOidRequest

Transizioni di stato RSS, aggiornamenti ITE e processori primari/predefiniti

Parametri di spostamento

In RSSv2 vengono usati parametri diversi per indirizzare il traffico verso la CPU corretta a seconda dello stato RSS (abilitato o disabilitato). Quando RSS è disabilitato, viene usato solo il processore primario per indirizzare il traffico. Quando RSS è abilitato, vengono usati sia il processore predefinito che tutti gli ITE per indirizzare il traffico. Questi parametri di spostamento sono etichettati come "attivi" o "inattivi", riepilogati nella tabella seguente:

Parametro di spostamento RSS disabilitato RSS abilitato
Processore primario Attivo Inattivo
Processore predefinito Inattivo Attivo
ITE[0..N] Inattivo Attivo

Quando un parametro di guida si trova nello stato attivo, indirizza il traffico. Dal momento di una transizione di stato RSS che esegue un parametro inattivo, i driver miniport devono tenere traccia delle modifiche apportate al parametro fino a quando la transizione inversa non la attiva nuovamente. Ciò significa che un driver miniport deve tenere traccia di tutti gli aggiornamenti delle voci della tabella del processore predefinito e indiretto mentre RSS è disabilitato per quella entità di scalabilità. Quando RSS è abilitato, lo stato corrente rilevato per il processore predefinito e la tabella di riferimento indiretto dovrebbero avere effetto.

Si consideri, ad esempio, lo scenario in cui è già abilitato il software vRSS. In questo caso, la tabella di riferimento indiretto esiste già nel protocollo di livello superiore e viene usata attivamente dal codice di distribuzione software del livello superiore. Se, durante l'abilitazione RSS hardware, tutte le voci iniziano a puntare al processore primario prima che gli aggiornamenti per spostino le voci della tabella di riferimento indiretto, che vengono rilasciate ed eseguite dall'hardware, il processore primario potrebbe riscontrare un breve blocco. Se il driver miniport ha rilevato le informazioni predefinite sul processore e sull'ITE, può indirizzare il traffico a dove è già previsto dal livello superiore.

Anche se i driver miniport devono tenere traccia di tutti gli aggiornamenti ai parametri di sterzo inattivi, devono rinviare la convalida di tali parametri finché il tentativo di cambiare lo stato RSS non rende attivi questi parametri attivi. Ad esempio, nel caso della diffusione del software mentre l'RSS hardware è disabilitato, i protocolli di livello superiore possono utilizzare qualsiasi processore per la diffusione, inclusi quelli al di fuori del set RSS dell'adattatore. I livelli superiori assicurano che, al momento della transizione dello stato RSS, tutti i parametri inattivi siano validi per il nuovo stato RSS. Tuttavia, il driver miniport deve comunque convalidare i parametri e non eseguire la transizione dello stato RSS se rileva che qualsiasi parametro di spostamento inattivo tracciato non è valido.

Stato iniziale e aggiornamenti ai parametri di spostamento

La tabella seguente descrive lo stato iniziale dell'entità di ridimensionamento dopo la creazione (ad esempio, dopo la creazione di VPort), nonché il modo in cui è possibile aggiornare i parametri:

Parametro Descrizione
Processore primario
  • Inizializzato con il processore Affinity specificato durante la creazione di VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES con il flag NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR impostato.
  • Può essere aggiornato utilizzando l'OID OID_NIC_SWITCH_VPORT_PARAMETERS con il flag NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED impostato (questo è il percorso di compatibilità per i cmdlet esistenti).
  • Può essere letto utilizzando l'OID OID_NIC_SWITCH_VPORT_PARAMETERS con il flag NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (si tratta del percorso di compatibilità per i cmdlet esistenti).
  • Gli spostamenti post-inizializzazione del processore primario non influiscono sul processore predefinito né sul contenuto della tabella di indirizzamento indiretto.
Processore predefinito
  • Inizializzato con il processore Affinity specificato durante la creazione di VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES con il flag NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR impostato.
Tabella di riferimento indiretto
  • NumberOfIndirectionTableEntries è impostato su 1.
  • L'unica voce viene inizializzata con il processore Affinità specificato durante la creazione del VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES.

Gli aggiornamenti agli ITE e ai processori primari/predefiniti (usando OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) vengono invocati dal processore verso il quale punta attualmente l'entry corrispondente. Per un determinato VPort, il livello superiore garantisce che non vengano emessi OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID per spostare gli ITE o impostare i processori primari/predefiniti in queste circostanze:

  1. Mentre OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 è in corso.
  2. Dopo l'avvio della sequenza di eliminazione del VPort. Ad esempio, il livello superiore rilascia l'OID di impostazione del filtro solo dopo il completamento dell'ultimo OID per spostare gli ITE.

Disabilitazione RSS

Durante la disabilitazione RSS, il protocollo di livello superiore potrebbe scegliere di puntare tutti gli ITE al processore primario, quindi rilasciare l'OID per disabilitare RSS oppure potrebbe scegliere di lasciare la tabella di riferimento indiretto as-is e disabilitare RSS. In entrambi i casi, la ricezione del traffico deve avere come destinazione il processore primario.

RSSv2 mantiene un requisito di RSSv1 che consente al protocollo di livello superiore di eliminare un VPort senza prima disabilitare RSS. Il livello superiore può impostare il filtro di ricezione sul VPort su zero, assicurando quindi che nessun traffico di ricezione attraversi il VPort, per poi procedere con l'eliminazione del VPort senza disabilitare RSS. Il livello superiore garantisce che non vengano rilasciati OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID durante o dopo l'eliminazione di VPort.

Durante la disabilitazione RSS e l'eliminazione di VPort, il driver miniport deve occuparsi di eventuali operazioni interne in sospeso che potrebbero esistere a causa degli spostamenti della coda precedenti.

Invarianti RSSv2

Il protocollo di livello superiore garantisce che le invarianti importanti non siano violate prima di eseguire le funzioni di gestione o gli spostamenti dell'ITE. Per esempio:

  1. Prima di ridurre il numero di code, il livello superiore garantisce che la tabella di riferimento indiretto non faccia riferimento a più processori rispetto al nuovo numero di code per un VPort.
  2. Il livello superiore non deve richiedere un aggiornamento della tabella di indirezione che violi il numero di code attualmente configurate per un VPort. Il driver miniport deve applicare questa regola e restituire un errore.
  3. Prima di modificare il numero di voci di tabella di riferimento indiretto per gli adattatori VMMQ-RESTRICTED, il livello superiore garantisce che il contenuto della tabella di riferimento indiretto venga normalizzato in base alla potenza di 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Interfaccia di richiesta OID sincrona in NDIS 6.80