In una VM Hyper‑V collegata a uno switch virtuale esterno, il cmdlet Get‑NetAdapter mostra la velocità ma il campo FullDuplex risulta vuoto. Non è un bug: è il comportamento previsto del layer di virtualizzazione. Qui trovi spiegazione, verifiche e best practice operative.
Scenario e sintomi
All’interno della VM, l’amministratore esegue:
Get‑NetAdapter | Select Name, FullDuplex, LinkSpeed
L’output riporta correttamente LinkSpeed (es. 100 Mbps) ma la colonna FullDuplex è vuota (valore NULL).
Istintivamente ci si aspetta che la VM “erediti” lo stato duplex dalla scheda fisica dell’host; tuttavia questa aspettativa non si applica al networking virtualizzato.
Perché FullDuplex è vuoto in una VM Hyper‑V
La proprietà FullDuplex di Get‑NetAdapter ha senso solo per schede che parlano su un mezzo fisico (rame o fibra) e che negoziano la modalità half/full duplex a Layer 1. La vNIC della VM, invece, non “vede” il cavo: dialoga con lo switch virtuale attraverso il VMBus.
| Punto chiave | Dettagli |
|---|---|
| Il duplex è un attributo fisico | La negoziazione half/full duplex avviene a Layer 1 fra due NIC reali collegate da un cavo. È un’informazione legata al mezzo, non al traffico virtuale. |
| La VM usa un adattatore virtuale | La vNIC (driver sintetico NetVSC) scambia frame con il vSwitch tramite VMBus. Non partecipa ad auto‑negotiation fisica → Hyper‑V non popola FullDuplex (risulta NULL). |
| Dove verificare il duplex | Controlla la scheda fisica dell’host Hyper‑V (o gli strumenti del vendor, o lo switch fisico) per conoscere Speed & Duplex reali. |
| Nessun impatto funzionale | L’assenza del valore in VM è normale e non limita le prestazioni; il percorso virtuale opera di fatto in full‑duplex verso il vSwitch. |
| Non esiste un override | Non c’è un cmdlet o un’impostazione per “forzare” la VM a mostrare FullDuplex: l’informazione non viene esposta dal layer di virtualizzazione. |
Approfondimento tecnico
- vNIC sintetica (NetVSC): il driver della VM è ottimizzato per dialogare via VMBus con lo switch virtuale. Non effettua alcuna auto‑negotiation elettrica, quindi non ha un concetto di “half” o “full” riferito al filo.
- OID di duplex: gli adattatori fisici espongono (a livello NDIS) un indicatore di duplex; la vNIC Hyper‑V tipicamente non lo espone perché lo scenario non prevede collision domain né CSMA/CD.
- Velocità mostrata in VM:
LinkSpeednella VM è un valore logico. In molti ambienti Hyper‑V appare un numero “nominale” (spesso elevato) utile a QoS/prioritizzazione interna; in altri casi può riflettere valori più bassi. Non è la prova della velocità del cavo. - SR‑IOV: anche quando usi SR‑IOV (vNIC come Virtual Function), la rappresentazione in guest può non riportare
FullDuplexin modo coerente con l’aspettativa “da NIC fisica”; fa fede la porta sullo switch fisico.
Impatto sulle prestazioni
La mancanza del valore FullDuplex nella VM non penalizza il throughput: all’interno dell’host non esistono collisioni e lo scambio con il vSwitch è concettualmente full‑duplex. Le prestazioni dipendono da:
- capacità della NIC fisica e configurazione dello switch reale;
- coda e scheduler del vSwitch;
- offload e accelerazioni (RSS/vRSS, VMQ, SR‑IOV, checksum offload, LSO);
- CPU/NUMA, storage e stack TCP della VM.
Dove verificare davvero duplex e velocità
Sull’host Hyper‑V (Windows Server / Windows 10/11)
Controlla stato e velocità delle NIC fisiche:
# NIC fisiche con stato e velocità
Get‑NetAdapter -Physical | Select Name, InterfaceDescription, Status, LinkSpeed, MediaConnectionState | Format‑Table -Auto
Molti driver espongono una voce “Speed & Duplex” fra le proprietà avanzate. Se presente, puoi leggerla così:
# Cerca proprietà avanzate legate a Speed/Duplex (nome variabile in base al vendor)
Get‑NetAdapterAdvancedProperty -Name "*" |
Where‑Object { $.RegistryKeyword -match "Speed|Duplex|Auto" -or $.DisplayName -match "Speed.*Duplex" } |
Sort‑Object Name | Format‑Table Name, DisplayName, DisplayValue
Se il driver non espone l’impostazione, affidati al pannello del vendor o allo switch fisico.
Sullo switch di rete fisico
Verifica che la porta a cui è collegata la NIC dell’host sia su Auto‑Negotiation oppure, se richiesto, forzata a 100 Mbps full‑duplex su entrambi i lati. Evita forzature asimmetriche (tipica causa di collisioni, errori e throughput spontaneamente basso).
Dentro la VM (per completezza)
È normale vedere FullDuplex vuoto. Puoi comunque rilevare stato e contatori:
# Stato della vNIC in VM
Get‑NetAdapter | Select Name, Status, LinkSpeed, MacAddress | Format‑Table -Auto
Contatori di rete generici per la vNIC della VM
Get‑Counter '\Network Interface(*)\Bytes Total/sec' -SampleInterval 1 -MaxSamples 5
Best practice di configurazione
- Preferisci Auto‑Negotiation su NIC fisica e porta di switch. È la pratica consigliata per 100/1000/10G. Forzare la velocità solo quando richiesto da ambienti legacy e sempre in modo simmetrico.
- Evita l’half‑duplex: è eredità dell’era degli hub; sugli switch moderni non ha senso operativo.
- Allinea firmware e driver: aggiorna la NIC dell’host, in particolare per funzionalità VMQ/SR‑IOV.
- Controlla il binding dello vSwitch: verifica quale NIC fisica è associata allo switch virtuale esterno e il suo stato.
- Bilanciamento del traffico: se usi NIC Teaming o SET (Switch Embedded Teaming), verifica la salute di tutti i membri e la modalità (LACP/Static).
Procedure operative di diagnostica
Verifica rapida host ↔ vSwitch
# Mappa gli switch virtuali e le NIC fisiche sottostanti
Get‑VMSwitch | Select Name, SwitchType, NetAdapterInterfaceDescription, AllowManagementOS | Format‑List
Elenco delle vNIC delle VM e stato
Get‑VMNetworkAdapter -All | Select VMName, SwitchName, Status, MacAddress | Format‑Table -Auto
Controllo mismatch duplex o velocità
- Confronta lo stato della port‑channel o della porta fisica sullo switch con la configurazione della NIC dell’host.
- Se vedi errori o performance anomale, imposta temporaneamente 100 Mbps full‑duplex su entrambi i lati (o torna a Auto su entrambi) e testa.
- Raccogli contatori in host e VM per correlare l’eventuale perdita di pacchetti al salto fisico.
Performance counter utili
# Elenca i set di contatori Hyper‑V
Get‑Counter -ListSet 'Hyper-V*' | Select -ExpandProperty CounterSetName
Traffico per porta dello vSwitch
Get‑Counter '\Hyper-V Virtual Switch Port(*)\Bytes/sec' -SampleInterval 1 -MaxSamples 10
Pacchetti scartati (se disponibili)
Get‑Counter '\Hyper-V Virtual Switch Port(*)\Dropped Packets' -SampleInterval 1 -MaxSamples 10
Incrocia i nomi delle porte con l’output di Get‑VMNetworkAdapter per capire quale VM stai osservando.
Script di utilità
Report sintetico del duplex sulla NIC fisica
function Get-HostNicDuplex {
[CmdletBinding()]
param(
[string]$Name = '*'
)
$nics = Get-NetAdapter -Name $Name -Physical -ErrorAction SilentlyContinue
foreach ($nic in $nics) {
$adv = Get-NetAdapterAdvancedProperty -Name $nic.Name -ErrorAction SilentlyContinue |
Where-Object { $.RegistryKeyword -match 'Speed|Duplex|Auto' -or $.DisplayName -match 'Speed.*Duplex' }
[pscustomobject]@{
Name = $nic.Name
Vendor = $nic.InterfaceDescription
Status = $nic.Status
LinkSpeed = $nic.LinkSpeed
DuplexSetting = if ($adv) { $adv.DisplayValue -join '; ' } else { '(non esposto dal driver)' }
}
}
}
Esempio d'uso
Get-HostNicDuplex
Mappa rapida vSwitch → NIC fisica
function Get-HVNetworkMap {
Get-VMSwitch | ForEach-Object {
$sw = $_
$nic = $null
if ($sw.NetAdapterInterfaceDescription) {
$nic = Get-NetAdapter | Where-Object { $_.InterfaceDescription -eq $sw.NetAdapterInterfaceDescription }
}
[pscustomobject]@{
Switch = $sw.Name
Tipo = $sw.SwitchType
NicFisica = if ($nic) { $nic.Name } else { '(nessuna: interno/privato)' }
DescrizioneNicFisica = $sw.NetAdapterInterfaceDescription
AllowManagementOS = $sw.AllowManagementOS
}
}
}
Esempio d'uso
Get-HVNetworkMap | Format-Table -Auto
Checklist di troubleshooting
- Il campo FullDuplex in VM è vuoto? Comportamento atteso.
- Hai throughput basso o altalenante? Verifica duplex e velocità sulla NIC fisica dell’host e sulla porta dello switch; evita configurazioni asimmetriche.
- Usi NIC Teaming/SET? Controlla lo stato di tutti i membri e la policy (LACP/Static), poi misura di nuovo.
- Offload e code: conferma che RSS/vRSS, VMQ e LSO siano coerenti con le best practice del tuo carico.
- Contatori: confronta i contatori “Hyper‑V Virtual Switch Port” con quelli “Network Interface” per individuare dove si generano scarti.
Domande frequenti
Perché vedo 100 Mbps di LinkSpeed nella VM?
La velocità mostrata nella VM è logica: può riflettere un valore nominale del vSwitch/driver o un valore coerente con policy locali. Non rappresenta l’esatta capacità del collegamento fisico dell’host.
Posso forzare la VM a mostrare “FullDuplex = True”?
No. Non esiste un parametro supportato per popolare quella proprietà in guest: il dato non è esposto dalla vNIC Hyper‑V.
Questo limita le prestazioni?
No. Il percorso VM ↔ vSwitch è full‑duplex per progettazione. I colli di bottiglia reali sono sulla NIC fisica, sulla CPU o sullo storage.
Con SR‑IOV cambia qualcosa?
La VM usa una Virtual Function hardware, ma duplex e velocità restano tematiche del link fisico. Controlla comunque la porta di switch e gli strumenti del vendor.
Uso una Legacy Network Adapter: vedrò differenze?
La legacy NIC è emulata e pensata solo per compatibilità/boot PXE; anche in questo caso non aspettarti un valore affidabile di FullDuplex. Per prestazioni usa sempre la vNIC sintetica.
Ho forzato 100 full sullo switch ma “Auto” sull’host: è un problema?
Sì, è un classico scenario di mismatch. Imposta Auto/Auto o 100 full/100 full su entrambi i lati.
Esempi pratici di verifiche end‑to‑end
Conferma dello stato fisico sull’host
# Verifica che l'host stia linkando come atteso
Get‑NetAdapter -Name "Ethernet*" -Physical | Format‑List Name, Status, LinkSpeed, MediaConnectionState
Get‑HostNicDuplex | Where-Object { $_.Name -like "Ethernet*" }
Correlazione con lo switch virtuale
# Quale NIC fisica alimenta lo switch esterno usato dalla VM?
Get‑VMSwitch -SwitchType External | Select Name, NetAdapterInterfaceDescription | Format‑Table -Auto
Quale switch usa la VM?
Get‑VMNetworkAdapter -VMName "NomeVM" | Select VMName, SwitchName, MacAddress, Status | Format‑Table -Auto
Misura di throughput
Per validare con numeri, usa strumenti di misurazione (ad es. tra VM e un endpoint fuori dall’host) e osserva i contatori sopra riportati. Se il link fisico è 100 Mbps, aspettati throughput TCP netto inferiore a 100 Mb/s per via dell’overhead di protocollo.
Linee guida operative
- Accetta il “NULL” in guest: è by‑design.
- Verifica sempre lato host e switch quando indaghi problemi di rete.
- Auto‑Negotiation come default sicuro; forzature solo quando necessario e in modo simmetrico.
- Monitora con contatori di Hyper‑V e interfacce: sono più utili di un singolo flag.
- Aggiorna driver/firmware e rivedi le impostazioni di offload se noti CPU elevata o code in saturazione.
Conclusioni
Il campo FullDuplex vuoto in una VM Hyper‑V non è un errore: è la diretta conseguenza del fatto che la vNIC non effettua negoziazione fisica. La verifica di duplex e velocità va sempre spostata sulla NIC fisica dell’host e sulla porta di switch reale. In termini di prestazioni, il piano dati virtuale opera in full‑duplex e la tua attenzione dovrebbe concentrarsi su link fisico, contatori Hyper‑V, impostazioni di offload e coerenza delle configurazioni tra host e switch.
Suggerimenti operativi (riassunto)
Diagnostica prestazioni
- Se sospetti mismatch duplex o throughput anomalo, controlla la scheda fisica dell’host e lo switch reale.
- Usa i contatori Hyper‑V (vNIC e vSwitch) o monitoraggio nella VM per misurare traffico e latenza.
Coerenza delle impostazioni
- Imposta NIC fisica e porta di switch entrambe su Auto‑Negotiation oppure entrambe su 100 Mbps/full‑duplex.
In sintesi: il valore mancante di FullDuplex in una VM Hyper‑V è un comportamento atteso e non limita le prestazioni. Per conoscere la modalità duplex effettiva, verifica sempre l’interfaccia fisica sull’host o sullo switch di rete.
