Ricezione ridimensionamento lato versione 2 (RSSv2)

Il ridimensionamento lato ricezione 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 la distribuzione dinamica per VPort delle code.

Panoramica

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

Sono stati introdotti due id, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 e OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, in RSSv2 per i driver miniport per impostare le funzionalità RSS appropriate e controllare rispettivamente la tabella di 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 altre informazioni su questi ID, vedere le singole pagine di riferimento. Per altre informazioni sugli OID sincroni, vedere Interfaccia richiesta OID sincrona in NDIS 6.80.

Terminologia RSSv2

Questo argomento usa i termini seguenti:

Termine Definizione
RSSv1 La prima generazione riceve il meccanismo di ridimensionamento lato. Usa OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 La seconda generazione riceve il meccanismo di ridimensionamento lato supportato in Windows 10, versione 1803 e successiva, descritto in questo argomento.
Ridimensionamento dell'entità L'adattatore miniport stesso in modalità RSS nativa o VPort in modalità RSSv2.
ITE Voce di tabella indiretta (ITE) di un'entità di scalabilità specificata. Il numero totale di ITes 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 I criteri vmswitch per VPort che controllano la modalità di gestione dei relativi ITE in fase di esecuzione. Questo può essere statico (nessun ite si sposta a causa di modifiche al carico) o dyanmic (espansione e unione a seconda del carico di traffico corrente).
Coda Oggetto hardware sottostante (coda) che esegue il backup di un ITE. A seconda della tabella hardware e indiretta, la coda di configurazione può restituire più ITE. Il numero totale di code, incluso quello utilizzato dalla coda predefinita, non può superare il limite preconfigurato in genere impostato da un amministratore.
Processore predefinito Processore che riceve pacchetti per i quali 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 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 destinazione Processore a cui viene eseguito nuovamente il mapping dell'ITE (tramite RSSv2).
CPU 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 membro CapabilitiesFlags della struttura NDIS_RECEIVE_SCALE_CAPABILITIES con il flag di NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE . Questa funzionalità è necessaria per abilitare la funzionalità di bilanciamento del carico della CPU RSSv2, insieme al flag di 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 una scheda miniport non annuncia la funzionalità RSSv2, tutte le VPort abilitate per VMQ rimangono in modalità di distribuzione statica anche se queste VPort vengono 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 converte gli ID 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 del OID_GEN_RECEIVE_SCALE_PARAMETERS OID RSSv1 come indicato di seguito:

Gestione degli ID RSSv2

OID_GEN_RECEIVE_SCALE_PARAMETERS viene usato solo per eseguire query sui parametri RSS correnti di un'entità di ridimensionamento specificata. 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 allo stesso modo dell'OID OID_GEN_RECEIVE_SCALE_PARAMETERS gestito in RSSv1. Questo OID non è visibile ai driver di filtro NDIS (LWFs) precedenti a 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 generato l'OID. Come OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, non è visibile anche a NDIS LWFs prima di NDIS 6.80. Le LWFs in NDIS 6.80 e versioni successive non possono ritardare questo OID o spostarsi in un altro processore. Il payload contiene una matrice di semplici azioni "move ITE", ognuna delle quali contiene un comando per spostare un singolo ITE per un'entità di ridimensionamento in 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 richiesta OID sincrona:

Tipo di driver NDIS Gestori OID sincroni Funzione per l'origine degli OID sincroni
Miniport MiniportSynchronousOidRequest N/D
Filtra 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 alla 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, il processore predefinito e tutti gli ITE vengono usati 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 Inactive
Processore predefinito Inactive Attivo
ITE[0..N] Inactive Attivo

Quando un parametro di spostamento si trova nello stato attivo , indirizza il traffico. Dal momento di una transizione dello stato RSS che rende inattivo un parametro, i driver miniport devono tenere traccia delle modifiche al parametro fino a quando la transizione inversa lo attiva di nuovo. Ciò significa che un driver miniport deve tenere traccia di tutti gli aggiornamenti alle voci predefinite del processore e della tabella indiretta mentre RSS è disabilitato per tale entità di ridimensionamento. Quando RSS è abilitato, lo stato corrente monitorato per il processore predefinito e la tabella indiretta devono avere effetto.

Si consideri ad esempio lo scenario in cui è già abilitato il software vRSS. In questo caso, la tabella indiretta esiste già nel protocollo del 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 spostano le voci di tabella indirette vengano rilasciate e eseguite dall'hardware, il processore primario potrebbe riscontrare un breve jam. 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.

Si noti che mentre i driver miniport devono tenere traccia di tutti gli aggiornamenti ai parametri di spostamento inattivi, devono rinviare la convalida di tali parametri fino a quando la modifica dello stato RSS tenta di rendere attivi questi parametri. Ad esempio, nel caso della distribuzione del software mentre RSS hardware è disabilitato, i protocolli di livello superiore possono usare qualsiasi processore per la distribuzione (incluso all'esterno del set RSS dell'adattatore). I livelli superiori garantiscono che, al momento della transizione dello stato RSS, tutti i parametri inattivi siano validi per il nuovo stato RSS. Tuttavia, il miniport dirver deve comunque convalidare i parametri e non riuscire la transizione dello stato RSS se rileva che i parametri di spostamento inattivi rilevati non sono validi.

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 i parametri possono essere aggiornati:

Parametro Descrizione
Processore primario
  • Inizializzato con il processore di affinità specificato durante la creazione di VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES con il set di flag di NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR .
  • Può essere aggiornato usando l'OID OID_NIC_SWITCH_VPORT_PARAMETERS con il set di flag NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (si tratta del percorso di compatibilità per il cmdlet esistente).
  • È possibile leggere usando l'OID OID_NIC_SWITCH_VPORT_PARAMETERS con il flag di NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (si tratta del percorso di compatibilità per il cmdlet esistente).
  • Le operazioni di post-inizializzazione del processore primario non influiscono sul processore predefinito o sul contenuto della tabella indiretta.
Processore predefinito
  • Inizializzato con il processore di affinità specificato durante la creazione di VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES con il set di flag NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR .
Tabella indiretta
  • NumberOfIndirectionTableEntries è impostato su 1.
  • L'unica voce viene inizializzata con il processore Di affinità specificato durante la creazione di VPort.
  • Può essere aggiornato usando l'OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES .

Aggiornamenti a ITEs e ai processori primari/predefiniti (usando OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) viene richiamato dal processore a cui punta attualmente la voce corrispondente. Per un determinato VPort, il livello superiore garantisce che non vengano rilasciati OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID per spostare le 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 VPort. Ad esempio, il livello superiore genera l'OID del filtro impostato solo dopo il completamento dell'ultimo OID per spostare le ITe.

Disabilitazione RSS

Durante la disabilitazione RSS, il protocollo di livello superiore potrebbe scegliere di puntare tutti gli ITes al processore primario, quindi rilasciare l'OID per disabilitare RSS oppure potrebbe scegliere di lasciare la tabella indiretta come è e disabilitare RSS. In entrambi i casi, il traffico di ricezione deve essere destinazione del processore primario.

RSSv2 gestisce un requisito da RSSv1 che consente al protocollo superiore di eliminare una VPort senza prima disabilitare RSS. Il livello superiore può impostare il filtro di ricezione sul VPort su zero, garantendo così che nessun flusso di traffico di ricezione attraverso VPort, quindi procedere con l'eliminazione 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 di spostamenti di coda precedenti.

Invarianti RSSv2

Il protocollo di livello superiore garantisce che le invarianti importanti non vengano violate prima di eseguire funzioni di gestione o spostamenti ITE. Ad esempio:

  1. Prima di ridurre il numero di code, il livello superiore garantisce che la tabella di 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 indiretto che viola il numero di code attualmente configurate per un VPort. Il driver miniport deve applicare questa operazione e restituire un errore.
  3. Prima di modificare il numero di voci di tabella indirette per adattatori VMMQ-RESTRICTED, il livello superiore garantisce che il contenuto della tabella indiretta sia normalizzato alla potenza di 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Interfaccia richiesta OID sincrona in NDIS 6.80