Windows Server 2016 in VM: disattivare i Jumbo Frame e ripristinare MTU 1500 in Hyper‑V, vSphere e KVM

In molte VM con Windows Server 2016 l’opzione “Disabled” per i Jumbo Frame non è disponibile e viene richiesto solo un valore numerico. Questo articolo spiega come riportare l’MTU al valore standard, perché ciò equivale a disattivare i Jumbo Frame, e come verificare end‑to‑end che l’intero percorso di rete sia coerente.

Indice

Perché l’opzione disattivata non compare

In alcuni driver e ambienti virtualizzati, la voce Jumbo Packet dell’adattatore di rete non offre la scelta testuale “Disabled”, ma solo numeri. È un comportamento normale: il driver si aspetta che l’operatore inserisca direttamente il valore dell’MTU desiderato. Disattivare i Jumbo Frame significa semplicemente riportare l’MTU al valore tipico di rete senza jumbo, quindi MTU 1500 nella maggior parte dei casi.

Attenzione: alcuni driver mostrano valori come 1514 o 1518 per includere l’overhead Ethernet. Se 1500 non è accettato, prova 1514 o la voce “Disabled” se disponibile. La regola pratica rimane la stessa: valore standard = Jumbo Frame disattivati.

Concetti essenziali

  • MTU è la dimensione massima del payload a livello IP su un link. Con Ethernet classico è tipicamente 1500.
  • I cosiddetti Jumbo Frame sono frame più grandi del normale, spesso configurati a 9000 o simili, utili solo se tutta la catena di rete li supporta.
  • In ambienti virtuali la coerenza end‑to‑end è cruciale: NIC fisica dell’host, switch virtuale, eventuale team o bridge, vNIC della VM e sistema operativo guest devono condividere la stessa scelta.

Soluzione per Hyper‑V sull’host

Di seguito una procedura affidabile per forzare MTU 1500 (equivalente a “Jumbo Frame disattivati”) lato host Hyper‑V. Apri PowerShell come amministratore.

Individuazione dello switch virtuale

Get-VMSwitch

Prendi nota del nome dello switch virtuale in uso dalla VM e del nome della NIC fisica a cui lo switch è collegato.

Impostazione dell’MTU sulla NIC fisica

Imposta il valore standard sull’adattatore fisico che alimenta lo switch virtuale. Se il driver espone la chiave *JumboPacket, usa Set-NetAdapterAdvancedProperty:

$phyNicName = "Ethernet"    # Sostituisci con il nome reale della NIC fisica

Se la proprietà esiste, forza il valore standard

if (Get-NetAdapterAdvancedProperty -Name $phyNicName -ErrorAction SilentlyContinue |
Where-Object RegistryKeyword -eq "*JumboPacket") {
Set-NetAdapterAdvancedProperty -Name $phyNicName `                                   -RegistryKeyword "*JumboPacket"`
-RegistryValue 1500 `
-NoRestart
}

In aggiunta, imposta l'MTU IP (in byte) sulla stessa interfaccia

Get-NetIPInterface -InterfaceAlias $phyNicName |
Set-NetIPInterface -NlMtuBytes 1500 -PassThru 

Nota: se Set‑NetIPInterface non accetta -NlMtuBytes nella tua build, usa l’equivalente netsh mostrato più avanti.

Verifica sulla vNIC dell’host

L’host può avere una vNIC chiamata tipicamente vEthernet (NomeSwitch). Verifica se anche qui è esposta la proprietà Jumbo Packet e, se presente, portala a 1500:

$switchName = "NomeSwitch" # Sostituisci con il tuo switch
$hostVnic   = "vEthernet ($switchName)"

Prova a leggere e impostare la proprietà sulla vNIC dell'host

if (Get-NetAdapterAdvancedProperty -Name $hostVnic -ErrorAction SilentlyContinue |
Where-Object RegistryKeyword -eq "*JumboPacket") {
Set-NetAdapterAdvancedProperty -Name $hostVnic `                                   -RegistryKeyword "*JumboPacket"`
-RegistryValue 1500 `
-NoRestart
}

Imposta anche l'MTU IP

if (Get-NetIPInterface -InterfaceAlias $hostVnic -ErrorAction SilentlyContinue) {
Get-NetIPInterface -InterfaceAlias $hostVnic |
Set-NetIPInterface -NlMtuBytes 1500 -PassThru
} 

Controllo finale lato host

Get-NetAdapterAdvancedProperty -Name $phyNicName,$hostVnic `
                               -DisplayName "Jumbo Packet" `
                               -ErrorAction SilentlyContinue | 
    Format-Table Name, DisplayValue

Get-NetIPInterface -InterfaceAlias $phyNicName,$hostVnic |
Format-Table InterfaceAlias, NlMtu </code></pre>

<p>Se la tua NIC fisica era stata precedentemente configurata per Jumbo Frame, <strong>disattivali anche lì</strong> per evitare disallineamenti con lo stack virtuale.</p>

<h2>Intervento nel sistema operativo guest</h2>
<p>Il ripristino dell’MTU va completato dentro la VM con Windows Server&nbsp;2016. In molte installazioni la scheda di rete della VM non mostra “Disabled”, ma solo valori numerici: imposta <strong>1500</strong>. Se preferisci farlo via riga di comando:</p>

<h3>Comando con netsh</h3>
<pre><code class="language-powershell">netsh interface ipv4 show subinterfaces
netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent
</code></pre>

<h3>Comando con PowerShell</h3>
<p>Se disponibile, puoi usare anche PowerShell:</p>
<pre><code class="language-powershell">Set-NetIPInterface -InterfaceAlias "Ethernet" -NlMtuBytes 1500
</code></pre>
<p>Per adattatori che espongono la proprietà <em>Jumbo Packet</em> nei <em>Driver Properties</em>, puoi forzare via registro della NIC:</p>
<pre><code class="language-powershell"># Applica solo se la chiave *JumboPacket esiste
if (Get-NetAdapterAdvancedProperty -Name "Ethernet" -ErrorAction SilentlyContinue | 
    Where-Object RegistryKeyword -eq "*JumboPacket") {
    Set-NetAdapterAdvancedProperty -Name "Ethernet" `
                                   -RegistryKeyword "*JumboPacket" `
                                   -RegistryValue 1500 `
                                   -NoRestart
}
</code></pre>

<h2>Verifica pratica con ping</h2>
<p>Una volta applicate le modifiche, verifica che non si verifichi frammentazione lungo il percorso. Ricorda che, su IPv4, l’header IP e ICMP occupano <strong>28 byte</strong>; quindi, con MTU&nbsp;1500, il payload massimo senza frammentazione è <strong>1472</strong>:</p>
<pre><code class="language-powershell">ping -f -l 1472 &lt;IPorHost&gt;   # Nessuna frammentazione attesa

Se hai risposte "Packet needs to be fragmented"

prova a ridurre il payload fino a trovare il valore massimo

</code></pre>

<p>Per IPv6 l’overhead è diverso e l’opzione <code>-f</code> potrebbe non essere disponibile allo stesso modo; in tal caso verifica con strumenti specifici oppure usa valori di sicurezza come <code>1452</code> per test rapidi.</p>

<h2>Procedura rapida come script</h2>
<p>Se vuoi automatizzare la correzione lato host Hyper‑V e lato guest, ecco uno script di esempio che puoi adattare:</p>
<pre><code class="language-powershell"># Esegui sull'host Hyper-V come amministratore

param(
[string]$SwitchName = "NomeSwitch",
[string]$PhysicalNic = "Ethernet",
[int]$Mtu = 1500
)

$hostVnic = "vEthernet ($SwitchName)"

function Set-MtuIfSupported {
param([string]$Alias, [int]$Value)
try {
$prop = Get-NetAdapterAdvancedProperty -Name $Alias -ErrorAction Stop |
Where-Object RegistryKeyword -eq "*JumboPacket"
if ($prop) {
Set-NetAdapterAdvancedProperty -Name $Alias `                                           -RegistryKeyword "*JumboPacket"`
-RegistryValue $Value `
-NoRestart
Write-Host "Impostato JumboPacket $Value su $Alias"
} else {
Write-Host "La proprietà JumboPacket non è esposta su $Alias"
}
} catch { Write-Host "Impossibile leggere le proprietà di $Alias: $($_.Exception.Message)" }
}

NIC fisica

Set-MtuIfSupported -Alias $PhysicalNic -Value $Mtu

vNIC host (se presente)

Set-MtuIfSupported -Alias $hostVnic -Value $Mtu

MTU IP

Get-NetIPInterface -InterfaceAlias $PhysicalNic -ErrorAction SilentlyContinue |
Set-NetIPInterface -NlMtuBytes $Mtu
Get-NetIPInterface -InterfaceAlias $hostVnic -ErrorAction SilentlyContinue |
Set-NetIPInterface -NlMtuBytes $Mtu

Verifica

Get-NetAdapterAdvancedProperty -Name $PhysicalNic,$hostVnic -DisplayName "Jumbo Packet" -ErrorAction SilentlyContinue |
Format-Table Name, DisplayValue
Get-NetIPInterface -InterfaceAlias $PhysicalNic,$hostVnic |
Format-Table InterfaceAlias, NlMtu </code></pre>

<h2>Varianti e note utili</h2>
<table>
  <thead>
    <tr>
      <th>Scenario</th>
      <th>Dove intervenire</th>
      <th>Azione rapida</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Solo sulla VM</td>
      <td>Proprietà della scheda di rete del guest oppure riga di comando</td>
      <td><code>netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent</code>. Garantisce MTU&nbsp;1500 solo all’interno della VM; lo switch virtuale deve comunque supportare lo stesso valore.</td>
    </tr>
    <tr>
      <td>vSphere o ESXi</td>
      <td>vSwitch, portgroup e vNIC della VM</td>
      <td>Imposta MTU&nbsp;1500 dall’interfaccia vSphere. Da riga di comando host: <code>esxcli network vswitch standard set -m 1500 -v vSwitch0</code>. Verifica anche il dvSwitch se usato.</td>
    </tr>
    <tr>
      <td>KVM e Libvirt</td>
      <td>XML della VM e bridge tap del host</td>
      <td>Aggiungi o modifica <code>&lt;mtu size='1500'/&gt;</code> nell’interfaccia della VM e applica <code>ip link set dev br0 mtu 1500</code> sul bridge del host, poi riavvia la VM.</td>
    </tr>
  </tbody>
</table>
<p>Se la NIC fisica dell’host aveva i Jumbo Frame abilitati, <strong>disattivali anche lì</strong> per evitare disallineamenti.</p>

<h2>Allineamento end‑to‑end</h2>
<p>Per evitare colli di bottiglia, applica la stessa scelta MTU su tutti i punti del percorso:</p>
<ul>
  <li>NIC fisica e team o switch embedded teaming.</li>
  <li>Switch virtuale e vNIC dell’host.</li>
  <li>vNIC della VM e sistema operativo guest.</li>
  <li>Eventuali apparati di rete intermedi come firewall, load balancer e tunnel.</li>
</ul>
<p>Se esistono VLAN, ricordati di verificare come il driver gestisce l’overhead: alcuni richiedono di rimanere a <code>1500</code> anche con tagging, altri adeguano automaticamente.</p>

<h2>Risoluzione dei problemi</h2>
<h3>Perdita di throughput dopo il cambio</h3>
<p>Se le prestazioni peggiorano dopo il ripristino a <code>1500</code>, controlla:</p>
<ul>
  <li>La VM usa una scheda <em>synthetic</em> e non la legacy emulata.</li>
  <li>Checksum offload, RSS e VMQ abilitati, se supportati.</li>
  <li>Assenza di vecchie policy QoS che limitano la banda su specifiche interfacce.</li>
</ul>

<h3>Frammentazione visibile solo verso alcune destinazioni</h3>
<p>È tipico quando una parte del percorso (ad esempio un tunnel o un appliance) impone un MTU più basso. Usa i test con <code>ping</code> a payload decrescente per individuare la soglia massima e valuta se applicare un <em>per‑interface MTU</em> più conservativo verso quella rete.</p>

<h3>Driver che accetta solo valori superiori</h3>
<p>Se il driver non accetta <code>1500</code> ma offre scelte come <code>1514</code> o <code>Disabled</code> in stringa, seleziona la voce che corrisponde al valore standard del produttore. L’importante è che i test con <code>ping</code> confermino l’assenza di frammentazione con payload coerente.</p>

<h3>Team o switch embedded teaming</h3>
<p>Con <em>LBFO</em> o <em>SET</em>, imposta il valore su <strong>tutti</strong> i membri del team e sullo switch virtuale. Un membro fuori allineamento degrada l’intero canale.</p>

<h3>SR‑IOV attivato</h3>
<p>Se una VM usa SR‑IOV, la vNIC può mappare un <em>Virtual Function</em> direttamente alla NIC fisica. In questo caso la coerenza MTU tra VF e PF è fondamentale; adegua le proprietà anche sul PF corrispondente.</p>

<h3>Carichi con overlay</h3>
<p>Tecnologie di virtual networking con overlay (ad esempio VXLAN, NVGRE o simili) aggiungono overhead. Se in precedenza usavi Jumbo Frame per accomodare l’overlay, ripristinare <code>1500</code> può richiedere anche l’adeguamento dei percorsi o la rimozione dell’overlay.</p>

<h2>Checklist operativa</h2>
<ul>
  <li>Conferma quali NIC fisiche alimentano lo switch virtuale della VM.</li>
  <li>Riporta <em>Jumbo Packet</em> al valore standard sulla NIC fisica e, se presente, sulla vNIC dell’host.</li>
  <li>Imposta l’MTU IP a <code>1500</code> sia sull’host sia nel guest.</li>
  <li>Verifica con <code>ping -f -l 1472</code> verso le principali destinazioni.</li>
  <li>Ripeti il controllo su eventuali VLAN, team e tunnel.</li>
</ul>

<h2>Domande frequenti</h2>
<p><strong>Serve riavviare?</strong> Spesso non è necessario riavviare la VM, ma può essere richiesto un <em>disable/enable</em> della scheda. Alcuni driver applicano la modifica solo dopo un <em>link reset</em> o un riavvio dell’host.</p>
<p><strong>Posso impostare un valore diverso da quello standard?</strong> Solo se l’intera rete lo supporta. Un singolo punto con MTU inferiore comporterà frammentazione o perdita di pacchetti.</p>
<p><strong>Perché la mia VM mostra solo valori numerici?</strong> È una scelta del vendor del driver: non cambia la semantica della configurazione. Il valore numerico è più esplicito e riduce ambiguità.</p>

<h2>Esempi di verifica estesa</h2>
<p>Se desideri trovare automaticamente il payload massimo senza frammentazione verso una destinazione IPv4, prova questo mini‑script nel guest:</p>
<pre><code class="language-powershell">$target = "10.0.0.1"     # sostituisci
$min = 1400; $max = 1472; $ok = $min
while ($min -le $max) {
    $mid = [int](($min + $max)/2)
    $r = ping -n 1 -f -l $mid $target 2&gt;&amp;1
    if ($r -match "Reply from" -and $r -notmatch "fragmentation") { $ok = $mid; $min = $mid + 1 }
    else { $max = $mid - 1 }
}
"Payload massimo senza frammentazione: $ok byte (MTU stimata: $($ok + 28))"
</code></pre>
<p>Il risultato atteso, con MTU standard, è un payload massimo pari a <code>1472</code>, che corrisponde a MTU&nbsp;<code>1500</code>.</p>

<h2>Riepilogo operativo</h2>
<ul>
  <li>In ambienti virtuali non esiste il tasto “Disabled”: <strong>MTU&nbsp;1500 = Jumbo Frame disattivati</strong>.</li>
  <li>Modifica l’MTU a tutti i livelli per coerenza end‑to‑end: <em>NIC fisica, switch virtuale, vNIC e guest OS</em>.</li>
  <li>Dopo la modifica, testa con <code>ping -f -l 1472 &lt;IP&gt;</code> e verifica l’assenza di frammentazione.</li>
</ul>

<h2>Soluzione rapida in quattro passaggi per Hyper‑V</h2>
<ol>
  <li>Apri PowerShell come amministratore sul nodo Hyper‑V.</li>
  <li>Individua lo switch virtuale con <code>Get‑VMSwitch</code> e la NIC fisica associata.</li>
  <li>Riporta il valore standard su NIC fisica e, se presente, sulla vNIC dell’host:
    <pre><code class="language-powershell">Set-NetAdapterAdvancedProperty -Name "Ethernet" -RegistryKeyword "*JumboPacket" -RegistryValue 1500
Get-NetIPInterface -InterfaceAlias "Ethernet" | Set-NetIPInterface -NlMtuBytes 1500
facoltativo, se esposto:
Set-NetAdapterAdvancedProperty -Name "vEthernet (NomeSwitch)" -RegistryKeyword "*JumboPacket" -RegistryValue 1500
</code></pre>
  </li>
  <li>Verifica la modifica:
    <pre><code class="language-powershell">Get‑NetAdapterAdvancedProperty -Name "vEthernet (NomeSwitch)" -DisplayName "Jumbo Packet"
<em>MTU&nbsp;1500 è il valore tipico per disattivare i Jumbo Frame; scegli un’altra MTU solo se l’intera rete è configurata in modo coerente.</em>

Nota finale: se il tuo ambiente utilizza overlay, tunnel o dispositivi che introducono overhead, valuta se mantenere MTU inferiori su segmenti specifici oppure ripristinare il supporto Jumbo solo per quei percorsi, sempre garantendo che ogni hop intermedio sia configurato in modo coerente.

Indice