[{"data":1,"prerenderedAt":2465},["ShallowReactive",2],{"post:\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads\u002F":3},{"post":4,"newer":2416,"older":2426,"related":2436,"series":2463},{"id":5,"title":6,"body":7,"canonical":2396,"categories":2397,"date":2400,"description":2401,"extension":2402,"featured":2403,"hero":2404,"image":2404,"meta":2405,"navigation":706,"path":2406,"readingTime":443,"seo":2407,"series":2404,"seriesOrder":2404,"sites":2408,"source":2404,"stem":2409,"tags":2410,"updated":2404,"url":2414,"__hash__":2415},"blog\u002Fblog\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads.md","PowerShell: Windows Server – Tune the TCP Stack for 10GbE Workloads",{"type":8,"value":9,"toc":2388},"minimark",[10,25,30,76,80,227,231,234,265,268,312,315,350,353,361,372,413,417,2151,2155,2314,2318,2384],[11,12,13,14,18,19,24],"p",{},"Dropping a 10GbE NIC into a Windows Server box and expecting line-rate throughput without looking at it is a common mistake. The Windows defaults are mostly right; what goes wrong is drift. Receive Side Scaling gets switched off or confined to a few cores, a driver update resets offloads, someone leaves receive window autotuning disabled after a troubleshooting session, or an old \"TCP optimizer\" registry tweak is still sitting in ",[15,16,17],"code",{},"Tcpip\\Parameters"," doing nothing. I run a version of this script against every new file server, backup target and hypervisor host with a 10GbE (or faster) uplink before I trust any throughput numbers. It checks and sets the things Microsoft's network adapter tuning guidance actually recommends, reports the ones it deliberately leaves alone, and prints a summary of where each adapter ended up. The why behind each setting is in ",[20,21,23],"a",{"href":22},"\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network\u002F","Windows Server: TCP Stack Tuning for a 10GbE Storage Network",".",[26,27,29],"h2",{"id":28},"requirements","Requirements",[31,32,33,37,48,55,69],"ul",{},[34,35,36],"li",{},"Windows Server 2016 or later, elevated PowerShell (Administrator).",[34,38,39,40,43,44,47],{},"The built-in ",[15,41,42],{},"NetAdapter"," and ",[15,45,46],{},"NetTCPIP"," modules. Nothing to install.",[34,49,50,51,54],{},"An adapter whose driver exposes RSS, RSC, checksum offload and LSO. Some virtual NICs don't expose all of them; the script warns and continues. Check with ",[15,52,53],{},"Get-NetAdapterAdvancedProperty -Name \"\u003Cadapter>\""," if you're unsure.",[34,56,57,58,43,61,64,65,68],{},"A maintenance window or an out-of-band console. The ",[15,59,60],{},"Enable-NetAdapter*",[15,62,63],{},"Set-NetAdapter*"," cmdlets restart the adapter by default so the change takes effect; don't run this over the NIC you're connected through unless you pass ",[15,66,67],{},"-NoRestart"," and restart the adapter later.",[34,70,71,72,75],{},"For ",[15,73,74],{},"-EnableJumboFrame",": the switch ports and the far end (storage array, other hosts) configured for the same MTU first. A mismatch doesn't fail cleanly; it shows up as drops and retransmits under load.",[26,77,79],{"id":78},"parameters","Parameters",[81,82,83,102],"table",{},[84,85,86],"thead",{},[87,88,89,93,96,99],"tr",{},[90,91,92],"th",{},"Name",[90,94,95],{},"Type",[90,97,98],{},"Required",[90,100,101],{},"Description",[103,104,105,128,148,170,193,210],"tbody",{},[87,106,107,113,119,122],{},[108,109,110],"td",{},[15,111,112],{},"AdapterName",[108,114,115,116],{},"string",[117,118],"span",{},[108,120,121],{},"Yes",[108,123,124,125,24],{},"One or more adapter names, as shown by ",[15,126,127],{},"Get-NetAdapter",[87,129,130,135,138,141],{},[108,131,132],{},[15,133,134],{},"RssMaxProcessors",[108,136,137],{},"int",[108,139,140],{},"No",[108,142,143,144,147],{},"Maximum processors RSS may use per adapter (",[15,145,146],{},"Set-NetAdapterRss -MaxProcessors","). Only changed when supplied.",[87,149,150,155,157,159],{},[108,151,152],{},[15,153,154],{},"RssBaseProcessorNumber",[108,156,137],{},[108,158,140],{},[108,160,161,162,165,166,169],{},"First processor RSS may use (",[15,163,164],{},"-BaseProcessorNumber","), for example ",[15,167,168],{},"2"," to keep RSS off cores 0 and 1. Only changed when supplied.",[87,171,172,177,180,182],{},[108,173,174],{},[15,175,176],{},"EnableJumboFrame",[108,178,179],{},"switch",[108,181,140],{},[108,183,184,185,188,189,192],{},"Sets the standardized ",[15,186,187],{},"*JumboPacket"," keyword to ",[15,190,191],{},"JumboPacketSize",", if the driver exposes it.",[87,194,195,199,201,203],{},[108,196,197],{},[15,198,191],{},[108,200,137],{},[108,202,140],{},[108,204,205,206,209],{},"Frame size in bytes including the 14-byte Ethernet header. Default ",[15,207,208],{},"9014"," (a 9000-byte MTU).",[87,211,212,217,219,221],{},[108,213,214],{},[15,215,216],{},"NoRestart",[108,218,179],{},[108,220,140],{},[108,222,223,224,226],{},"Passes ",[15,225,67],{}," to the adapter cmdlets. Changes then apply at the next adapter or system restart.",[26,228,230],{"id":229},"usage","Usage",[11,232,233],{},"Audit and tune one adapter with the defaults (RSS on, RSC\u002Fchecksum\u002FLSO on, autotuning Normal):",[235,236,241],"pre",{"className":237,"code":238,"language":239,"meta":240,"style":240},"language-powershell shiki shiki-themes github-dark",".\\Optimize-TcpStackFor10GbE.ps1 -AdapterName \"SLOT 2 Port 1\"\n","powershell","",[15,242,243],{"__ignoreMap":240},[117,244,247,250,254,258,261],{"class":245,"line":246},"line",1,[117,248,24],{"class":249},"s95oV",[117,251,253],{"class":252},"sDLfK","\\Optimize-TcpStackFor10GbE.ps1",[117,255,257],{"class":256},"snl16"," -",[117,259,260],{"class":249},"AdapterName ",[117,262,264],{"class":263},"sU2Wk","\"SLOT 2 Port 1\"\n",[11,266,267],{},"Two storage ports, RSS kept off cores 0 and 1 and capped at 8 processors each, jumbo frames on (switch and array already at MTU 9000):",[235,269,271],{"className":237,"code":270,"language":239,"meta":240,"style":240},".\\Optimize-TcpStackFor10GbE.ps1 -AdapterName \"SLOT 2 Port 1\", \"SLOT 2 Port 2\" -RssBaseProcessorNumber 2 -RssMaxProcessors 8 -EnableJumboFrame\n",[15,272,273],{"__ignoreMap":240},[117,274,275,277,279,281,283,286,289,292,294,297,299,301,304,307,309],{"class":245,"line":246},[117,276,24],{"class":249},[117,278,253],{"class":252},[117,280,257],{"class":256},[117,282,260],{"class":249},[117,284,285],{"class":263},"\"SLOT 2 Port 1\"",[117,287,288],{"class":256},",",[117,290,291],{"class":263}," \"SLOT 2 Port 2\"",[117,293,257],{"class":256},[117,295,296],{"class":249},"RssBaseProcessorNumber ",[117,298,168],{"class":252},[117,300,257],{"class":256},[117,302,303],{"class":249},"RssMaxProcessors ",[117,305,306],{"class":252},"8",[117,308,257],{"class":256},[117,310,311],{"class":249},"EnableJumboFrame\n",[11,313,314],{},"Stage the changes without bouncing the adapters, then restart them in the window:",[235,316,318],{"className":237,"code":317,"language":239,"meta":240,"style":240},".\\Optimize-TcpStackFor10GbE.ps1 -AdapterName \"SLOT 2 Port 1\" -NoRestart\nRestart-NetAdapter -Name \"SLOT 2 Port 1\"\n",[15,319,320,337],{"__ignoreMap":240},[117,321,322,324,326,328,330,332,334],{"class":245,"line":246},[117,323,24],{"class":249},[117,325,253],{"class":252},[117,327,257],{"class":256},[117,329,260],{"class":249},[117,331,285],{"class":263},[117,333,257],{"class":256},[117,335,336],{"class":249},"NoRestart\n",[117,338,340,343,345,348],{"class":245,"line":339},2,[117,341,342],{"class":252},"Restart-NetAdapter",[117,344,257],{"class":256},[117,346,347],{"class":249},"Name ",[117,349,264],{"class":263},[11,351,352],{},"Sample output (values depend on the NIC and driver):",[235,354,359],{"className":355,"code":357,"language":358,"meta":240},[356],"language-text","WARNING: Legacy value TcpWindowSize is set under Tcpip\\Parameters. Windows ignores it; remove it to avoid confusion.\nWARNING: TCP Chimney global state is 'Enabled'. Chimney is deprecated; see Notes before changing it.\n\nName          Enabled Profile    BaseProcessorNumber MaxProcessors NumberOfReceiveQueues\n----          ------- -------    ------------------- ------------- ---------------------\nSLOT 2 Port 1    True NUMAStatic                   2             8                     8\nSLOT 2 Port 2    True NUMAStatic                   2             8                     8\n\nName          IPv4Enabled IPv4OperationalState IPv4FailureReason\n----          ----------- -------------------- -----------------\nSLOT 2 Port 1        True                 True NoFailure\nSLOT 2 Port 2        True                 True NoFailure\n\nName          JumboPacket\n----          -----------\nSLOT 2 Port 1 9014\nSLOT 2 Port 2 9014\n\nSettingName AutoTuningLevelLocal CongestionProvider\n----------- -------------------- ------------------\nDatacenter  Normal               CUBIC\nInternet    Normal               CUBIC\n","text",[15,360,357],{"__ignoreMap":240},[11,362,363,364,367,368,371],{},"Then prove the jumbo path end to end. ",[15,365,366],{},"ping -f"," sets Don't Fragment and ",[15,369,370],{},"-l"," is the ICMP payload: 9000 minus 20 bytes of IPv4 header and 8 bytes of ICMP header is 8972. If any hop is still at 1500, this fails with \"Packet needs to be fragmented but DF set\":",[235,373,375],{"className":237,"code":374,"language":239,"meta":240,"style":240},"ping.exe -f -l 8972 \u003Cstorage-target-ip>\n",[15,376,377],{"__ignoreMap":240},[117,378,379,382,385,387,390,393,396,399,402,405,407,410],{"class":245,"line":246},[117,380,381],{"class":252},"ping.exe",[117,383,384],{"class":256}," -f",[117,386,257],{"class":256},[117,388,389],{"class":249},"l ",[117,391,392],{"class":252},"8972",[117,394,395],{"class":256}," \u003C",[117,397,398],{"class":249},"storage",[117,400,401],{"class":256},"-",[117,403,404],{"class":249},"target",[117,406,401],{"class":256},[117,408,409],{"class":249},"ip",[117,411,412],{"class":256},">\n",[26,414,416],{"id":415},"script","Script",[235,418,420],{"className":237,"code":419,"language":239,"meta":240,"style":240},"\u003C#\n.SYNOPSIS\n    Audits and tunes NIC offloads and TCP autotuning on Windows Server for 10GbE (or faster) adapters.\n.DESCRIPTION\n    Enables Receive Side Scaling (optionally setting the base processor and\n    processor cap), Receive Segment Coalescing, checksum offload and Large Send\n    Offload on the named adapters, optionally sets the *JumboPacket keyword, and\n    makes sure TCP receive window autotuning is at its default, Normal. Reports,\n    without changing, the TCP Chimney global state and any legacy Tcpip registry\n    values that Windows ignores. Prints a summary of the resulting settings.\n.PARAMETER AdapterName\n    One or more network adapter names, as shown by Get-NetAdapter.\n.PARAMETER RssMaxProcessors\n    Maximum number of processors RSS may use per adapter. Only changed when supplied.\n.PARAMETER RssBaseProcessorNumber\n    First processor number RSS may use. Only changed when supplied.\n.PARAMETER EnableJumboFrame\n    Sets the *JumboPacket keyword to JumboPacketSize, if the adapter exposes it.\n.PARAMETER JumboPacketSize\n    Frame size in bytes including the Ethernet header. Default 9014.\n.PARAMETER NoRestart\n    Passes -NoRestart to the adapter cmdlets; changes apply at the next adapter restart.\n.EXAMPLE\n    .\\Optimize-TcpStackFor10GbE.ps1 -AdapterName \"SLOT 2 Port 1\", \"SLOT 2 Port 2\" -RssBaseProcessorNumber 2 -RssMaxProcessors 8 -EnableJumboFrame\n.NOTES\n    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n    Version : 1.0 (2025-04-10)\n    Requires: Windows Server 2016 or later, NetAdapter and NetTCPIP modules, Administrator\n.LINK\n    https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fnetworking\u002Ftechnologies\u002Fnetwork-subsystem\u002Fnet-sub-performance-tuning-nics\n#>\n[CmdletBinding()]\nparam (\n    [Parameter(Mandatory = $true)]\n    [string[]]$AdapterName,\n\n    [ValidateRange(1, 256)]\n    [int]$RssMaxProcessors,\n\n    [ValidateRange(0, 255)]\n    [int]$RssBaseProcessorNumber,\n\n    [switch]$EnableJumboFrame,\n\n    [ValidateRange(1514, 65535)]\n    [int]$JumboPacketSize = 9014,\n\n    [switch]$NoRestart\n)\n\n$restartParam = @{ NoRestart = [bool]$NoRestart }\n\n# Confirm every adapter exists before changing anything.\nforeach ($name in $AdapterName) {\n    Get-NetAdapter -Name $name -ErrorAction Stop | Out-Null\n}\n\n# Report legacy Windows Server 2003-era values that Microsoft documents as ignored.\n$tcpipParams = Get-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\"\n\nforeach ($legacy in @(\"TcpWindowSize\", \"NumTcbTablePartitions\", \"MaxHashTableSize\")) {\n    if ($null -ne $tcpipParams.$legacy) {\n        Write-Warning \"Legacy value $legacy is set under Tcpip\\Parameters. Windows ignores it; remove it to avoid confusion.\"\n    }\n}\n\n# Report TCP Chimney. Microsoft: deprecated in Windows Server 2016, don't use it.\n$offloadGlobal = Get-NetOffloadGlobalSetting\n\nif ($offloadGlobal.Chimney -ne \"Disabled\") {\n    Write-Warning \"TCP Chimney global state is '$($offloadGlobal.Chimney)'. Chimney is deprecated; see Notes before changing it.\"\n}\n\nif ($offloadGlobal.ReceiveSideScaling -ne \"Enabled\") {\n    Write-Warning \"Global Receive Side Scaling is '$($offloadGlobal.ReceiveSideScaling)'. Enable it with Set-NetOffloadGlobalSetting -ReceiveSideScaling Enabled.\"\n}\n\nforeach ($name in $AdapterName) {\n    # Receive Side Scaling: on, with an optional processor range.\n    try {\n        Enable-NetAdapterRss -Name $name @restartParam -ErrorAction Stop\n\n        $rssParams = @{}\n\n        if ($PSBoundParameters.ContainsKey(\"RssMaxProcessors\")) {\n            $rssParams.MaxProcessors = $RssMaxProcessors\n        }\n\n        if ($PSBoundParameters.ContainsKey(\"RssBaseProcessorNumber\")) {\n            $rssParams.BaseProcessorNumber = $RssBaseProcessorNumber\n        }\n\n        if ($rssParams.Count -gt 0) {\n            Set-NetAdapterRss -Name $name @rssParams @restartParam -ErrorAction Stop\n        }\n    } catch {\n        Write-Warning \"RSS on '$name': $($_.Exception.Message)\"\n    }\n\n    # Receive Segment Coalescing, checksum offload and LSO: on where the driver supports them.\n    try {\n        Enable-NetAdapterRsc -Name $name @restartParam -ErrorAction Stop\n    } catch {\n        Write-Warning \"RSC on '$name': $($_.Exception.Message)\"\n    }\n\n    try {\n        Enable-NetAdapterChecksumOffload -Name $name @restartParam -ErrorAction Stop\n    } catch {\n        Write-Warning \"Checksum offload on '$name': $($_.Exception.Message)\"\n    }\n\n    try {\n        Enable-NetAdapterLso -Name $name @restartParam -ErrorAction Stop\n    } catch {\n        Write-Warning \"LSO on '$name': $($_.Exception.Message)\"\n    }\n\n    # Jumbo frames through the standardized keyword, not the vendor display name.\n    if ($EnableJumboFrame) {\n        $jumbo = Get-NetAdapterAdvancedProperty -Name $name -RegistryKeyword \"*JumboPacket\" -ErrorAction SilentlyContinue\n\n        if (-not $jumbo) {\n            Write-Warning \"Adapter '$name' does not expose *JumboPacket. Skipping.\"\n        } elseif ($jumbo.ValidRegistryValues -and ($jumbo.ValidRegistryValues -notcontains [string]$JumboPacketSize)) {\n            Write-Warning \"Adapter '$name' accepts *JumboPacket values $($jumbo.ValidRegistryValues -join ', '), not $JumboPacketSize. Skipping.\"\n        } else {\n            Set-NetAdapterAdvancedProperty -Name $name -RegistryKeyword \"*JumboPacket\" -RegistryValue $JumboPacketSize @restartParam -ErrorAction Stop\n        }\n    }\n}\n\n# Receive window autotuning: make sure it is at the default, Normal.\n$tuning = Get-NetTCPSetting | Where-Object { $_.AutoTuningLevelLocal -and $_.AutoTuningLevelLocal -ne \"Normal\" }\n\nif ($tuning) {\n    Write-Warning \"AutoTuningLevelLocal is not Normal on: $(($tuning | ForEach-Object { $_.SettingName }) -join ', '). Setting Normal.\"\n    Set-NetTCPSetting -AutoTuningLevelLocal Normal\n}\n\n# Summary.\nGet-NetAdapterRss -Name $AdapterName |\n    Format-Table -Property Name, Enabled, Profile, BaseProcessorNumber, MaxProcessors, NumberOfReceiveQueues -AutoSize\n\nGet-NetAdapterRsc -Name $AdapterName |\n    Format-Table -Property Name, IPv4Enabled, IPv4OperationalState, IPv4FailureReason -AutoSize\n\nif ($EnableJumboFrame) {\n    Get-NetAdapterAdvancedProperty -Name $AdapterName -RegistryKeyword \"*JumboPacket\" -ErrorAction SilentlyContinue |\n        Format-Table -Property Name, @{ Name = \"JumboPacket\"; Expression = { $_.RegistryValue -join \",\" } } -AutoSize\n}\n\nGet-NetTCPSetting -SettingName Datacenter, Internet |\n    Format-Table -Property SettingName, AutoTuningLevelLocal, CongestionProvider -AutoSize\n",[15,421,422,428,435,441,449,455,461,467,473,479,485,496,502,512,518,528,534,544,550,560,566,576,582,590,596,604,610,616,622,630,636,642,654,663,688,701,708,728,740,745,764,776,781,793,798,817,835,840,850,856,861,886,891,897,912,934,940,945,951,970,975,1005,1023,1038,1044,1049,1054,1060,1071,1076,1094,1117,1122,1127,1142,1162,1167,1172,1183,1189,1198,1214,1219,1232,1237,1256,1267,1273,1278,1294,1305,1310,1315,1331,1346,1351,1362,1391,1396,1401,1407,1414,1428,1437,1461,1466,1471,1478,1492,1501,1525,1530,1535,1542,1556,1565,1589,1594,1599,1605,1613,1641,1646,1659,1673,1700,1736,1746,1771,1776,1781,1786,1791,1797,1837,1842,1850,1891,1902,1907,1912,1918,1932,1973,1978,1990,2018,2023,2030,2053,2099,2104,2109,2127],{"__ignoreMap":240},[117,423,424],{"class":245,"line":246},[117,425,427],{"class":426},"sAwPA","\u003C#\n",[117,429,430,432],{"class":245,"line":339},[117,431,24],{"class":252},[117,433,434],{"class":256},"SYNOPSIS\n",[117,436,438],{"class":245,"line":437},3,[117,439,440],{"class":426},"    Audits and tunes NIC offloads and TCP autotuning on Windows Server for 10GbE (or faster) adapters.\n",[117,442,444,446],{"class":245,"line":443},4,[117,445,24],{"class":252},[117,447,448],{"class":256},"DESCRIPTION\n",[117,450,452],{"class":245,"line":451},5,[117,453,454],{"class":426},"    Enables Receive Side Scaling (optionally setting the base processor and\n",[117,456,458],{"class":245,"line":457},6,[117,459,460],{"class":426},"    processor cap), Receive Segment Coalescing, checksum offload and Large Send\n",[117,462,464],{"class":245,"line":463},7,[117,465,466],{"class":426},"    Offload on the named adapters, optionally sets the *JumboPacket keyword, and\n",[117,468,470],{"class":245,"line":469},8,[117,471,472],{"class":426},"    makes sure TCP receive window autotuning is at its default, Normal. Reports,\n",[117,474,476],{"class":245,"line":475},9,[117,477,478],{"class":426},"    without changing, the TCP Chimney global state and any legacy Tcpip registry\n",[117,480,482],{"class":245,"line":481},10,[117,483,484],{"class":426},"    values that Windows ignores. Prints a summary of the resulting settings.\n",[117,486,488,490,493],{"class":245,"line":487},11,[117,489,24],{"class":252},[117,491,492],{"class":256},"PARAMETER",[117,494,495],{"class":256}," AdapterName\n",[117,497,499],{"class":245,"line":498},12,[117,500,501],{"class":426},"    One or more network adapter names, as shown by Get-NetAdapter.\n",[117,503,505,507,509],{"class":245,"line":504},13,[117,506,24],{"class":252},[117,508,492],{"class":256},[117,510,511],{"class":256}," RssMaxProcessors\n",[117,513,515],{"class":245,"line":514},14,[117,516,517],{"class":426},"    Maximum number of processors RSS may use per adapter. Only changed when supplied.\n",[117,519,521,523,525],{"class":245,"line":520},15,[117,522,24],{"class":252},[117,524,492],{"class":256},[117,526,527],{"class":256}," RssBaseProcessorNumber\n",[117,529,531],{"class":245,"line":530},16,[117,532,533],{"class":426},"    First processor number RSS may use. Only changed when supplied.\n",[117,535,537,539,541],{"class":245,"line":536},17,[117,538,24],{"class":252},[117,540,492],{"class":256},[117,542,543],{"class":256}," EnableJumboFrame\n",[117,545,547],{"class":245,"line":546},18,[117,548,549],{"class":426},"    Sets the *JumboPacket keyword to JumboPacketSize, if the adapter exposes it.\n",[117,551,553,555,557],{"class":245,"line":552},19,[117,554,24],{"class":252},[117,556,492],{"class":256},[117,558,559],{"class":256}," JumboPacketSize\n",[117,561,563],{"class":245,"line":562},20,[117,564,565],{"class":426},"    Frame size in bytes including the Ethernet header. Default 9014.\n",[117,567,569,571,573],{"class":245,"line":568},21,[117,570,24],{"class":252},[117,572,492],{"class":256},[117,574,575],{"class":256}," NoRestart\n",[117,577,579],{"class":245,"line":578},22,[117,580,581],{"class":426},"    Passes -NoRestart to the adapter cmdlets; changes apply at the next adapter restart.\n",[117,583,585,587],{"class":245,"line":584},23,[117,586,24],{"class":252},[117,588,589],{"class":256},"EXAMPLE\n",[117,591,593],{"class":245,"line":592},24,[117,594,595],{"class":426},"    .\\Optimize-TcpStackFor10GbE.ps1 -AdapterName \"SLOT 2 Port 1\", \"SLOT 2 Port 2\" -RssBaseProcessorNumber 2 -RssMaxProcessors 8 -EnableJumboFrame\n",[117,597,599,601],{"class":245,"line":598},25,[117,600,24],{"class":252},[117,602,603],{"class":256},"NOTES\n",[117,605,607],{"class":245,"line":606},26,[117,608,609],{"class":426},"    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n",[117,611,613],{"class":245,"line":612},27,[117,614,615],{"class":426},"    Version : 1.0 (2025-04-10)\n",[117,617,619],{"class":245,"line":618},28,[117,620,621],{"class":426},"    Requires: Windows Server 2016 or later, NetAdapter and NetTCPIP modules, Administrator\n",[117,623,625,627],{"class":245,"line":624},29,[117,626,24],{"class":252},[117,628,629],{"class":256},"LINK\n",[117,631,633],{"class":245,"line":632},30,[117,634,635],{"class":426},"    https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fnetworking\u002Ftechnologies\u002Fnetwork-subsystem\u002Fnet-sub-performance-tuning-nics\n",[117,637,639],{"class":245,"line":638},31,[117,640,641],{"class":426},"#>\n",[117,643,645,648,651],{"class":245,"line":644},32,[117,646,647],{"class":249},"[",[117,649,650],{"class":252},"CmdletBinding",[117,652,653],{"class":249},"()]\n",[117,655,657,660],{"class":245,"line":656},33,[117,658,659],{"class":256},"param",[117,661,662],{"class":249}," (\n",[117,664,666,669,672,675,679,682,685],{"class":245,"line":665},34,[117,667,668],{"class":249},"    [",[117,670,671],{"class":252},"Parameter",[117,673,674],{"class":249},"(",[117,676,678],{"class":677},"s9osk","Mandatory",[117,680,681],{"class":256}," =",[117,683,684],{"class":252}," $true",[117,686,687],{"class":249},")]\n",[117,689,691,693,695,698],{"class":245,"line":690},35,[117,692,668],{"class":249},[117,694,115],{"class":256},[117,696,697],{"class":249},"[]]$AdapterName",[117,699,700],{"class":256},",\n",[117,702,704],{"class":245,"line":703},36,[117,705,707],{"emptyLinePlaceholder":706},true,"\n",[117,709,711,713,716,718,721,723,726],{"class":245,"line":710},37,[117,712,668],{"class":249},[117,714,715],{"class":252},"ValidateRange",[117,717,674],{"class":249},[117,719,720],{"class":252},"1",[117,722,288],{"class":256},[117,724,725],{"class":252}," 256",[117,727,687],{"class":249},[117,729,731,733,735,738],{"class":245,"line":730},38,[117,732,668],{"class":249},[117,734,137],{"class":256},[117,736,737],{"class":249},"]$RssMaxProcessors",[117,739,700],{"class":256},[117,741,743],{"class":245,"line":742},39,[117,744,707],{"emptyLinePlaceholder":706},[117,746,748,750,752,754,757,759,762],{"class":245,"line":747},40,[117,749,668],{"class":249},[117,751,715],{"class":252},[117,753,674],{"class":249},[117,755,756],{"class":252},"0",[117,758,288],{"class":256},[117,760,761],{"class":252}," 255",[117,763,687],{"class":249},[117,765,767,769,771,774],{"class":245,"line":766},41,[117,768,668],{"class":249},[117,770,137],{"class":256},[117,772,773],{"class":249},"]$RssBaseProcessorNumber",[117,775,700],{"class":256},[117,777,779],{"class":245,"line":778},42,[117,780,707],{"emptyLinePlaceholder":706},[117,782,784,786,788,791],{"class":245,"line":783},43,[117,785,668],{"class":249},[117,787,179],{"class":256},[117,789,790],{"class":249},"]$EnableJumboFrame",[117,792,700],{"class":256},[117,794,796],{"class":245,"line":795},44,[117,797,707],{"emptyLinePlaceholder":706},[117,799,801,803,805,807,810,812,815],{"class":245,"line":800},45,[117,802,668],{"class":249},[117,804,715],{"class":252},[117,806,674],{"class":249},[117,808,809],{"class":252},"1514",[117,811,288],{"class":256},[117,813,814],{"class":252}," 65535",[117,816,687],{"class":249},[117,818,820,822,824,827,830,833],{"class":245,"line":819},46,[117,821,668],{"class":249},[117,823,137],{"class":256},[117,825,826],{"class":249},"]$JumboPacketSize ",[117,828,829],{"class":256},"=",[117,831,832],{"class":252}," 9014",[117,834,700],{"class":256},[117,836,838],{"class":245,"line":837},47,[117,839,707],{"emptyLinePlaceholder":706},[117,841,843,845,847],{"class":245,"line":842},48,[117,844,668],{"class":249},[117,846,179],{"class":256},[117,848,849],{"class":249},"]$NoRestart\n",[117,851,853],{"class":245,"line":852},49,[117,854,855],{"class":249},")\n",[117,857,859],{"class":245,"line":858},50,[117,860,707],{"emptyLinePlaceholder":706},[117,862,864,867,869,872,875,877,880,883],{"class":245,"line":863},51,[117,865,866],{"class":249},"$restartParam ",[117,868,829],{"class":256},[117,870,871],{"class":256}," @",[117,873,874],{"class":249},"{ NoRestart ",[117,876,829],{"class":256},[117,878,879],{"class":249}," [",[117,881,882],{"class":256},"bool",[117,884,885],{"class":249},"]$NoRestart }\n",[117,887,889],{"class":245,"line":888},52,[117,890,707],{"emptyLinePlaceholder":706},[117,892,894],{"class":245,"line":893},53,[117,895,896],{"class":426},"# Confirm every adapter exists before changing anything.\n",[117,898,900,903,906,909],{"class":245,"line":899},54,[117,901,902],{"class":256},"foreach",[117,904,905],{"class":249}," ($name ",[117,907,908],{"class":256},"in",[117,910,911],{"class":249}," $AdapterName) {\n",[117,913,915,918,920,923,925,928,931],{"class":245,"line":914},55,[117,916,917],{"class":252},"    Get-NetAdapter",[117,919,257],{"class":256},[117,921,922],{"class":249},"Name $name ",[117,924,401],{"class":256},[117,926,927],{"class":249},"ErrorAction Stop ",[117,929,930],{"class":256},"|",[117,932,933],{"class":252}," Out-Null\n",[117,935,937],{"class":245,"line":936},56,[117,938,939],{"class":249},"}\n",[117,941,943],{"class":245,"line":942},57,[117,944,707],{"emptyLinePlaceholder":706},[117,946,948],{"class":245,"line":947},58,[117,949,950],{"class":426},"# Report legacy Windows Server 2003-era values that Microsoft documents as ignored.\n",[117,952,954,957,959,962,964,967],{"class":245,"line":953},59,[117,955,956],{"class":249},"$tcpipParams ",[117,958,829],{"class":256},[117,960,961],{"class":252}," Get-ItemProperty",[117,963,257],{"class":256},[117,965,966],{"class":249},"Path ",[117,968,969],{"class":263},"\"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\"\n",[117,971,973],{"class":245,"line":972},60,[117,974,707],{"emptyLinePlaceholder":706},[117,976,978,980,983,985,987,989,992,994,997,999,1002],{"class":245,"line":977},61,[117,979,902],{"class":256},[117,981,982],{"class":249}," ($legacy ",[117,984,908],{"class":256},[117,986,871],{"class":256},[117,988,674],{"class":249},[117,990,991],{"class":263},"\"TcpWindowSize\"",[117,993,288],{"class":256},[117,995,996],{"class":263}," \"NumTcbTablePartitions\"",[117,998,288],{"class":256},[117,1000,1001],{"class":263}," \"MaxHashTableSize\"",[117,1003,1004],{"class":249},")) {\n",[117,1006,1008,1011,1014,1017,1020],{"class":245,"line":1007},62,[117,1009,1010],{"class":256},"    if",[117,1012,1013],{"class":249}," (",[117,1015,1016],{"class":252},"$null",[117,1018,1019],{"class":256}," -ne",[117,1021,1022],{"class":249}," $tcpipParams.$legacy) {\n",[117,1024,1026,1029,1032,1035],{"class":245,"line":1025},63,[117,1027,1028],{"class":252},"        Write-Warning",[117,1030,1031],{"class":263}," \"Legacy value ",[117,1033,1034],{"class":249},"$legacy",[117,1036,1037],{"class":263}," is set under Tcpip\\Parameters. Windows ignores it; remove it to avoid confusion.\"\n",[117,1039,1041],{"class":245,"line":1040},64,[117,1042,1043],{"class":249},"    }\n",[117,1045,1047],{"class":245,"line":1046},65,[117,1048,939],{"class":249},[117,1050,1052],{"class":245,"line":1051},66,[117,1053,707],{"emptyLinePlaceholder":706},[117,1055,1057],{"class":245,"line":1056},67,[117,1058,1059],{"class":426},"# Report TCP Chimney. Microsoft: deprecated in Windows Server 2016, don't use it.\n",[117,1061,1063,1066,1068],{"class":245,"line":1062},68,[117,1064,1065],{"class":249},"$offloadGlobal ",[117,1067,829],{"class":256},[117,1069,1070],{"class":252}," Get-NetOffloadGlobalSetting\n",[117,1072,1074],{"class":245,"line":1073},69,[117,1075,707],{"emptyLinePlaceholder":706},[117,1077,1079,1082,1085,1088,1091],{"class":245,"line":1078},70,[117,1080,1081],{"class":256},"if",[117,1083,1084],{"class":249}," ($offloadGlobal.Chimney ",[117,1086,1087],{"class":256},"-ne",[117,1089,1090],{"class":263}," \"Disabled\"",[117,1092,1093],{"class":249},") {\n",[117,1095,1097,1100,1103,1106,1108,1111,1114],{"class":245,"line":1096},71,[117,1098,1099],{"class":252},"    Write-Warning",[117,1101,1102],{"class":263}," \"TCP Chimney global state is '",[117,1104,1105],{"class":256},"$",[117,1107,674],{"class":263},[117,1109,1110],{"class":249},"$offloadGlobal.Chimney",[117,1112,1113],{"class":263},")",[117,1115,1116],{"class":263},"'. Chimney is deprecated; see Notes before changing it.\"\n",[117,1118,1120],{"class":245,"line":1119},72,[117,1121,939],{"class":249},[117,1123,1125],{"class":245,"line":1124},73,[117,1126,707],{"emptyLinePlaceholder":706},[117,1128,1130,1132,1135,1137,1140],{"class":245,"line":1129},74,[117,1131,1081],{"class":256},[117,1133,1134],{"class":249}," ($offloadGlobal.ReceiveSideScaling ",[117,1136,1087],{"class":256},[117,1138,1139],{"class":263}," \"Enabled\"",[117,1141,1093],{"class":249},[117,1143,1145,1147,1150,1152,1154,1157,1159],{"class":245,"line":1144},75,[117,1146,1099],{"class":252},[117,1148,1149],{"class":263}," \"Global Receive Side Scaling is '",[117,1151,1105],{"class":256},[117,1153,674],{"class":263},[117,1155,1156],{"class":249},"$offloadGlobal.ReceiveSideScaling",[117,1158,1113],{"class":263},[117,1160,1161],{"class":263},"'. Enable it with Set-NetOffloadGlobalSetting -ReceiveSideScaling Enabled.\"\n",[117,1163,1165],{"class":245,"line":1164},76,[117,1166,939],{"class":249},[117,1168,1170],{"class":245,"line":1169},77,[117,1171,707],{"emptyLinePlaceholder":706},[117,1173,1175,1177,1179,1181],{"class":245,"line":1174},78,[117,1176,902],{"class":256},[117,1178,905],{"class":249},[117,1180,908],{"class":256},[117,1182,911],{"class":249},[117,1184,1186],{"class":245,"line":1185},79,[117,1187,1188],{"class":426},"    # Receive Side Scaling: on, with an optional processor range.\n",[117,1190,1192,1195],{"class":245,"line":1191},80,[117,1193,1194],{"class":256},"    try",[117,1196,1197],{"class":249}," {\n",[117,1199,1201,1204,1206,1209,1211],{"class":245,"line":1200},81,[117,1202,1203],{"class":252},"        Enable-NetAdapterRss",[117,1205,257],{"class":256},[117,1207,1208],{"class":249},"Name $name @restartParam ",[117,1210,401],{"class":256},[117,1212,1213],{"class":249},"ErrorAction Stop\n",[117,1215,1217],{"class":245,"line":1216},82,[117,1218,707],{"emptyLinePlaceholder":706},[117,1220,1222,1225,1227,1229],{"class":245,"line":1221},83,[117,1223,1224],{"class":249},"        $rssParams ",[117,1226,829],{"class":256},[117,1228,871],{"class":256},[117,1230,1231],{"class":249},"{}\n",[117,1233,1235],{"class":245,"line":1234},84,[117,1236,707],{"emptyLinePlaceholder":706},[117,1238,1240,1243,1245,1248,1251,1254],{"class":245,"line":1239},85,[117,1241,1242],{"class":256},"        if",[117,1244,1013],{"class":249},[117,1246,1247],{"class":252},"$PSBoundParameters",[117,1249,1250],{"class":249},".ContainsKey(",[117,1252,1253],{"class":263},"\"RssMaxProcessors\"",[117,1255,1004],{"class":249},[117,1257,1259,1262,1264],{"class":245,"line":1258},86,[117,1260,1261],{"class":249},"            $rssParams.MaxProcessors ",[117,1263,829],{"class":256},[117,1265,1266],{"class":249}," $RssMaxProcessors\n",[117,1268,1270],{"class":245,"line":1269},87,[117,1271,1272],{"class":249},"        }\n",[117,1274,1276],{"class":245,"line":1275},88,[117,1277,707],{"emptyLinePlaceholder":706},[117,1279,1281,1283,1285,1287,1289,1292],{"class":245,"line":1280},89,[117,1282,1242],{"class":256},[117,1284,1013],{"class":249},[117,1286,1247],{"class":252},[117,1288,1250],{"class":249},[117,1290,1291],{"class":263},"\"RssBaseProcessorNumber\"",[117,1293,1004],{"class":249},[117,1295,1297,1300,1302],{"class":245,"line":1296},90,[117,1298,1299],{"class":249},"            $rssParams.BaseProcessorNumber ",[117,1301,829],{"class":256},[117,1303,1304],{"class":249}," $RssBaseProcessorNumber\n",[117,1306,1308],{"class":245,"line":1307},91,[117,1309,1272],{"class":249},[117,1311,1313],{"class":245,"line":1312},92,[117,1314,707],{"emptyLinePlaceholder":706},[117,1316,1318,1320,1323,1326,1329],{"class":245,"line":1317},93,[117,1319,1242],{"class":256},[117,1321,1322],{"class":249}," ($rssParams.Count ",[117,1324,1325],{"class":256},"-gt",[117,1327,1328],{"class":252}," 0",[117,1330,1093],{"class":249},[117,1332,1334,1337,1339,1342,1344],{"class":245,"line":1333},94,[117,1335,1336],{"class":252},"            Set-NetAdapterRss",[117,1338,257],{"class":256},[117,1340,1341],{"class":249},"Name $name @rssParams @restartParam ",[117,1343,401],{"class":256},[117,1345,1213],{"class":249},[117,1347,1349],{"class":245,"line":1348},95,[117,1350,1272],{"class":249},[117,1352,1354,1357,1360],{"class":245,"line":1353},96,[117,1355,1356],{"class":249},"    } ",[117,1358,1359],{"class":256},"catch",[117,1361,1197],{"class":249},[117,1363,1365,1367,1370,1373,1376,1378,1380,1383,1386,1388],{"class":245,"line":1364},97,[117,1366,1028],{"class":252},[117,1368,1369],{"class":263}," \"RSS on '",[117,1371,1372],{"class":249},"$name",[117,1374,1375],{"class":263},"': ",[117,1377,1105],{"class":256},[117,1379,674],{"class":263},[117,1381,1382],{"class":252},"$_",[117,1384,1385],{"class":249},".Exception.Message",[117,1387,1113],{"class":263},[117,1389,1390],{"class":263},"\"\n",[117,1392,1394],{"class":245,"line":1393},98,[117,1395,1043],{"class":249},[117,1397,1399],{"class":245,"line":1398},99,[117,1400,707],{"emptyLinePlaceholder":706},[117,1402,1404],{"class":245,"line":1403},100,[117,1405,1406],{"class":426},"    # Receive Segment Coalescing, checksum offload and LSO: on where the driver supports them.\n",[117,1408,1410,1412],{"class":245,"line":1409},101,[117,1411,1194],{"class":256},[117,1413,1197],{"class":249},[117,1415,1417,1420,1422,1424,1426],{"class":245,"line":1416},102,[117,1418,1419],{"class":252},"        Enable-NetAdapterRsc",[117,1421,257],{"class":256},[117,1423,1208],{"class":249},[117,1425,401],{"class":256},[117,1427,1213],{"class":249},[117,1429,1431,1433,1435],{"class":245,"line":1430},103,[117,1432,1356],{"class":249},[117,1434,1359],{"class":256},[117,1436,1197],{"class":249},[117,1438,1440,1442,1445,1447,1449,1451,1453,1455,1457,1459],{"class":245,"line":1439},104,[117,1441,1028],{"class":252},[117,1443,1444],{"class":263}," \"RSC on '",[117,1446,1372],{"class":249},[117,1448,1375],{"class":263},[117,1450,1105],{"class":256},[117,1452,674],{"class":263},[117,1454,1382],{"class":252},[117,1456,1385],{"class":249},[117,1458,1113],{"class":263},[117,1460,1390],{"class":263},[117,1462,1464],{"class":245,"line":1463},105,[117,1465,1043],{"class":249},[117,1467,1469],{"class":245,"line":1468},106,[117,1470,707],{"emptyLinePlaceholder":706},[117,1472,1474,1476],{"class":245,"line":1473},107,[117,1475,1194],{"class":256},[117,1477,1197],{"class":249},[117,1479,1481,1484,1486,1488,1490],{"class":245,"line":1480},108,[117,1482,1483],{"class":252},"        Enable-NetAdapterChecksumOffload",[117,1485,257],{"class":256},[117,1487,1208],{"class":249},[117,1489,401],{"class":256},[117,1491,1213],{"class":249},[117,1493,1495,1497,1499],{"class":245,"line":1494},109,[117,1496,1356],{"class":249},[117,1498,1359],{"class":256},[117,1500,1197],{"class":249},[117,1502,1504,1506,1509,1511,1513,1515,1517,1519,1521,1523],{"class":245,"line":1503},110,[117,1505,1028],{"class":252},[117,1507,1508],{"class":263}," \"Checksum offload on '",[117,1510,1372],{"class":249},[117,1512,1375],{"class":263},[117,1514,1105],{"class":256},[117,1516,674],{"class":263},[117,1518,1382],{"class":252},[117,1520,1385],{"class":249},[117,1522,1113],{"class":263},[117,1524,1390],{"class":263},[117,1526,1528],{"class":245,"line":1527},111,[117,1529,1043],{"class":249},[117,1531,1533],{"class":245,"line":1532},112,[117,1534,707],{"emptyLinePlaceholder":706},[117,1536,1538,1540],{"class":245,"line":1537},113,[117,1539,1194],{"class":256},[117,1541,1197],{"class":249},[117,1543,1545,1548,1550,1552,1554],{"class":245,"line":1544},114,[117,1546,1547],{"class":252},"        Enable-NetAdapterLso",[117,1549,257],{"class":256},[117,1551,1208],{"class":249},[117,1553,401],{"class":256},[117,1555,1213],{"class":249},[117,1557,1559,1561,1563],{"class":245,"line":1558},115,[117,1560,1356],{"class":249},[117,1562,1359],{"class":256},[117,1564,1197],{"class":249},[117,1566,1568,1570,1573,1575,1577,1579,1581,1583,1585,1587],{"class":245,"line":1567},116,[117,1569,1028],{"class":252},[117,1571,1572],{"class":263}," \"LSO on '",[117,1574,1372],{"class":249},[117,1576,1375],{"class":263},[117,1578,1105],{"class":256},[117,1580,674],{"class":263},[117,1582,1382],{"class":252},[117,1584,1385],{"class":249},[117,1586,1113],{"class":263},[117,1588,1390],{"class":263},[117,1590,1592],{"class":245,"line":1591},117,[117,1593,1043],{"class":249},[117,1595,1597],{"class":245,"line":1596},118,[117,1598,707],{"emptyLinePlaceholder":706},[117,1600,1602],{"class":245,"line":1601},119,[117,1603,1604],{"class":426},"    # Jumbo frames through the standardized keyword, not the vendor display name.\n",[117,1606,1608,1610],{"class":245,"line":1607},120,[117,1609,1010],{"class":256},[117,1611,1612],{"class":249}," ($EnableJumboFrame) {\n",[117,1614,1616,1619,1621,1624,1626,1628,1630,1633,1636,1638],{"class":245,"line":1615},121,[117,1617,1618],{"class":249},"        $jumbo ",[117,1620,829],{"class":256},[117,1622,1623],{"class":252}," Get-NetAdapterAdvancedProperty",[117,1625,257],{"class":256},[117,1627,922],{"class":249},[117,1629,401],{"class":256},[117,1631,1632],{"class":249},"RegistryKeyword ",[117,1634,1635],{"class":263},"\"*JumboPacket\"",[117,1637,257],{"class":256},[117,1639,1640],{"class":249},"ErrorAction SilentlyContinue\n",[117,1642,1644],{"class":245,"line":1643},122,[117,1645,707],{"emptyLinePlaceholder":706},[117,1647,1649,1651,1653,1656],{"class":245,"line":1648},123,[117,1650,1242],{"class":256},[117,1652,1013],{"class":249},[117,1654,1655],{"class":256},"-not",[117,1657,1658],{"class":249}," $jumbo) {\n",[117,1660,1662,1665,1668,1670],{"class":245,"line":1661},124,[117,1663,1664],{"class":252},"            Write-Warning",[117,1666,1667],{"class":263}," \"Adapter '",[117,1669,1372],{"class":249},[117,1671,1672],{"class":263},"' does not expose *JumboPacket. Skipping.\"\n",[117,1674,1676,1679,1682,1685,1688,1690,1693,1695,1697],{"class":245,"line":1675},125,[117,1677,1678],{"class":249},"        } ",[117,1680,1681],{"class":256},"elseif",[117,1683,1684],{"class":249}," ($jumbo.ValidRegistryValues ",[117,1686,1687],{"class":256},"-and",[117,1689,1684],{"class":249},[117,1691,1692],{"class":256},"-notcontains",[117,1694,879],{"class":249},[117,1696,115],{"class":256},[117,1698,1699],{"class":249},"]$JumboPacketSize)) {\n",[117,1701,1703,1705,1707,1709,1712,1714,1716,1719,1722,1725,1727,1730,1733],{"class":245,"line":1702},126,[117,1704,1664],{"class":252},[117,1706,1667],{"class":263},[117,1708,1372],{"class":249},[117,1710,1711],{"class":263},"' accepts *JumboPacket values ",[117,1713,1105],{"class":256},[117,1715,674],{"class":263},[117,1717,1718],{"class":249},"$jumbo.ValidRegistryValues",[117,1720,1721],{"class":256}," -join",[117,1723,1724],{"class":263}," ', '",[117,1726,1113],{"class":263},[117,1728,1729],{"class":263},", not ",[117,1731,1732],{"class":249},"$JumboPacketSize",[117,1734,1735],{"class":263},". Skipping.\"\n",[117,1737,1739,1741,1744],{"class":245,"line":1738},127,[117,1740,1678],{"class":249},[117,1742,1743],{"class":256},"else",[117,1745,1197],{"class":249},[117,1747,1749,1752,1754,1756,1758,1760,1762,1764,1767,1769],{"class":245,"line":1748},128,[117,1750,1751],{"class":252},"            Set-NetAdapterAdvancedProperty",[117,1753,257],{"class":256},[117,1755,922],{"class":249},[117,1757,401],{"class":256},[117,1759,1632],{"class":249},[117,1761,1635],{"class":263},[117,1763,257],{"class":256},[117,1765,1766],{"class":249},"RegistryValue $JumboPacketSize @restartParam ",[117,1768,401],{"class":256},[117,1770,1213],{"class":249},[117,1772,1774],{"class":245,"line":1773},129,[117,1775,1272],{"class":249},[117,1777,1779],{"class":245,"line":1778},130,[117,1780,1043],{"class":249},[117,1782,1784],{"class":245,"line":1783},131,[117,1785,939],{"class":249},[117,1787,1789],{"class":245,"line":1788},132,[117,1790,707],{"emptyLinePlaceholder":706},[117,1792,1794],{"class":245,"line":1793},133,[117,1795,1796],{"class":426},"# Receive window autotuning: make sure it is at the default, Normal.\n",[117,1798,1800,1803,1805,1808,1811,1814,1817,1819,1822,1824,1827,1829,1831,1834],{"class":245,"line":1799},134,[117,1801,1802],{"class":249},"$tuning ",[117,1804,829],{"class":256},[117,1806,1807],{"class":252}," Get-NetTCPSetting",[117,1809,1810],{"class":256}," |",[117,1812,1813],{"class":252}," Where-Object",[117,1815,1816],{"class":249}," { ",[117,1818,1382],{"class":252},[117,1820,1821],{"class":249},".AutoTuningLevelLocal ",[117,1823,1687],{"class":256},[117,1825,1826],{"class":252}," $_",[117,1828,1821],{"class":249},[117,1830,1087],{"class":256},[117,1832,1833],{"class":263}," \"Normal\"",[117,1835,1836],{"class":249}," }\n",[117,1838,1840],{"class":245,"line":1839},135,[117,1841,707],{"emptyLinePlaceholder":706},[117,1843,1845,1847],{"class":245,"line":1844},136,[117,1846,1081],{"class":256},[117,1848,1849],{"class":249}," ($tuning) {\n",[117,1851,1853,1855,1858,1860,1863,1866,1868,1871,1873,1875,1878,1881,1884,1886,1888],{"class":245,"line":1852},137,[117,1854,1099],{"class":252},[117,1856,1857],{"class":263}," \"AutoTuningLevelLocal is not Normal on: ",[117,1859,1105],{"class":256},[117,1861,1862],{"class":263},"((",[117,1864,1865],{"class":249},"$tuning",[117,1867,1810],{"class":256},[117,1869,1870],{"class":252}," ForEach-Object",[117,1872,1816],{"class":263},[117,1874,1382],{"class":252},[117,1876,1877],{"class":249},".SettingName",[117,1879,1880],{"class":263}," }) ",[117,1882,1883],{"class":256},"-join",[117,1885,1724],{"class":263},[117,1887,1113],{"class":263},[117,1889,1890],{"class":263},". Setting Normal.\"\n",[117,1892,1894,1897,1899],{"class":245,"line":1893},138,[117,1895,1896],{"class":252},"    Set-NetTCPSetting",[117,1898,257],{"class":256},[117,1900,1901],{"class":249},"AutoTuningLevelLocal Normal\n",[117,1903,1905],{"class":245,"line":1904},139,[117,1906,939],{"class":249},[117,1908,1910],{"class":245,"line":1909},140,[117,1911,707],{"emptyLinePlaceholder":706},[117,1913,1915],{"class":245,"line":1914},141,[117,1916,1917],{"class":426},"# Summary.\n",[117,1919,1921,1924,1926,1929],{"class":245,"line":1920},142,[117,1922,1923],{"class":252},"Get-NetAdapterRss",[117,1925,257],{"class":256},[117,1927,1928],{"class":249},"Name $AdapterName ",[117,1930,1931],{"class":256},"|\n",[117,1933,1935,1938,1940,1943,1945,1948,1950,1953,1955,1958,1960,1963,1965,1968,1970],{"class":245,"line":1934},143,[117,1936,1937],{"class":252},"    Format-Table",[117,1939,257],{"class":256},[117,1941,1942],{"class":249},"Property Name",[117,1944,288],{"class":256},[117,1946,1947],{"class":249}," Enabled",[117,1949,288],{"class":256},[117,1951,1952],{"class":249}," Profile",[117,1954,288],{"class":256},[117,1956,1957],{"class":249}," BaseProcessorNumber",[117,1959,288],{"class":256},[117,1961,1962],{"class":249}," MaxProcessors",[117,1964,288],{"class":256},[117,1966,1967],{"class":249}," NumberOfReceiveQueues ",[117,1969,401],{"class":256},[117,1971,1972],{"class":249},"AutoSize\n",[117,1974,1976],{"class":245,"line":1975},144,[117,1977,707],{"emptyLinePlaceholder":706},[117,1979,1981,1984,1986,1988],{"class":245,"line":1980},145,[117,1982,1983],{"class":252},"Get-NetAdapterRsc",[117,1985,257],{"class":256},[117,1987,1928],{"class":249},[117,1989,1931],{"class":256},[117,1991,1993,1995,1997,1999,2001,2004,2006,2009,2011,2014,2016],{"class":245,"line":1992},146,[117,1994,1937],{"class":252},[117,1996,257],{"class":256},[117,1998,1942],{"class":249},[117,2000,288],{"class":256},[117,2002,2003],{"class":249}," IPv4Enabled",[117,2005,288],{"class":256},[117,2007,2008],{"class":249}," IPv4OperationalState",[117,2010,288],{"class":256},[117,2012,2013],{"class":249}," IPv4FailureReason ",[117,2015,401],{"class":256},[117,2017,1972],{"class":249},[117,2019,2021],{"class":245,"line":2020},147,[117,2022,707],{"emptyLinePlaceholder":706},[117,2024,2026,2028],{"class":245,"line":2025},148,[117,2027,1081],{"class":256},[117,2029,1612],{"class":249},[117,2031,2033,2036,2038,2040,2042,2044,2046,2048,2051],{"class":245,"line":2032},149,[117,2034,2035],{"class":252},"    Get-NetAdapterAdvancedProperty",[117,2037,257],{"class":256},[117,2039,1928],{"class":249},[117,2041,401],{"class":256},[117,2043,1632],{"class":249},[117,2045,1635],{"class":263},[117,2047,257],{"class":256},[117,2049,2050],{"class":249},"ErrorAction SilentlyContinue ",[117,2052,1931],{"class":256},[117,2054,2056,2059,2061,2063,2065,2067,2070,2072,2075,2078,2080,2082,2084,2087,2089,2092,2095,2097],{"class":245,"line":2055},150,[117,2057,2058],{"class":252},"        Format-Table",[117,2060,257],{"class":256},[117,2062,1942],{"class":249},[117,2064,288],{"class":256},[117,2066,871],{"class":256},[117,2068,2069],{"class":249},"{ Name ",[117,2071,829],{"class":256},[117,2073,2074],{"class":263}," \"JumboPacket\"",[117,2076,2077],{"class":249},"; Expression ",[117,2079,829],{"class":256},[117,2081,1816],{"class":249},[117,2083,1382],{"class":252},[117,2085,2086],{"class":249},".RegistryValue ",[117,2088,1883],{"class":256},[117,2090,2091],{"class":263}," \",\"",[117,2093,2094],{"class":249}," } } ",[117,2096,401],{"class":256},[117,2098,1972],{"class":249},[117,2100,2102],{"class":245,"line":2101},151,[117,2103,939],{"class":249},[117,2105,2107],{"class":245,"line":2106},152,[117,2108,707],{"emptyLinePlaceholder":706},[117,2110,2112,2115,2117,2120,2122,2125],{"class":245,"line":2111},153,[117,2113,2114],{"class":252},"Get-NetTCPSetting",[117,2116,257],{"class":256},[117,2118,2119],{"class":249},"SettingName Datacenter",[117,2121,288],{"class":256},[117,2123,2124],{"class":249}," Internet ",[117,2126,1931],{"class":256},[117,2128,2130,2132,2134,2137,2139,2142,2144,2147,2149],{"class":245,"line":2129},154,[117,2131,1937],{"class":252},[117,2133,257],{"class":256},[117,2135,2136],{"class":249},"Property SettingName",[117,2138,288],{"class":256},[117,2140,2141],{"class":249}," AutoTuningLevelLocal",[117,2143,288],{"class":256},[117,2145,2146],{"class":249}," CongestionProvider ",[117,2148,401],{"class":256},[117,2150,1972],{"class":249},[26,2152,2154],{"id":2153},"notes","Notes",[31,2156,2157,2182,2217,2234,2279,2293,2303],{},[34,2158,2159,2163,2164,2167,2168,43,2171,2174,2175,2177,2178,2181],{},[2160,2161,2162],"strong",{},"What the script deliberately doesn't touch."," The congestion provider: Windows Server 2019 moved the Internet, Datacenter and both Custom templates to CUBIC (Compat stays NewReno), and the cmdlet only accepts ",[15,2165,2166],{},"Default",", ",[15,2169,2170],{},"CTCP",[15,2172,2173],{},"DCTCP",". ",[15,2176,2173],{}," relies on ECN marking from the switches, so it's a fabric decision, not a per-host tweak. TCP Chimney: Microsoft says don't use Chimney or IPsec Task Offload (\"deprecated in Windows Server 2016, and might adversely affect server and networking performance\"). If the warning fires, ",[15,2179,2180],{},"Set-NetOffloadGlobalSetting -Chimney Disabled"," accepts the value, but look at why it was enabled first.",[34,2183,2184,2187,2188,2167,2191,43,2194,2197,2198,2200,2201,2204,2205,2208,2209,2212,2213,2216],{},[2160,2185,2186],{},"Legacy registry tweaks."," Microsoft lists ",[15,2189,2190],{},"TcpWindowSize",[15,2192,2193],{},"NumTcbTablePartitions",[15,2195,2196],{},"MaxHashTableSize"," under ",[15,2199,17],{}," as \"no longer supported, and are ignored,\" and \"starting with Windows Server 2019, you can no longer use the registry to configure the TCP receive window size.\" Use ",[15,2202,2203],{},"Set-NetTCPSetting -AutoTuningLevelLocal"," (or ",[15,2206,2207],{},"netsh interface tcp set global autotuninglevel=",") instead. ",[15,2210,2211],{},"Normal"," is the default. ",[15,2214,2215],{},"Disabled"," pins the window at its default size (64 KB on links from 100 Mbps to 10 Gbps, 128 KB at 10 Gbps and up), which caps a single connection's throughput.",[34,2218,2219,2222,2223,2226,2227,43,2230,2233],{},[2160,2220,2221],{},"RSS profile."," The default profile is ",[15,2224,2225],{},"NUMAStatic",". Microsoft's cmdlet help says \"selecting the correct profile should be sufficient in most scenarios,\" so only set ",[15,2228,2229],{},"BaseProcessorNumber",[15,2231,2232],{},"MaxProcessors"," when you're partitioning cores between several adapters. Don't mix RSS-capable and non-RSS adapters for the same traffic; the tuning guide warns this can \"severely\" degrade performance.",[34,2235,2236,2239,2240,2243,2244,2247,2248,2251,2252,2255,2256,2259,2260,2263,2264,2267,2268,2271,2272,2255,2275,2278],{},[2160,2237,2238],{},"RSC can be enabled and still not operate."," If ",[15,2241,2242],{},"IPv4OperationalState"," is ",[15,2245,2246],{},"False",", read ",[15,2249,2250],{},"IPv4FailureReason",". The documented reasons are ",[15,2253,2254],{},"NicPropertyDisabled"," (run ",[15,2257,2258],{},"Enable-NetAdapterRsc","), ",[15,2261,2262],{},"WFPCompatibility"," (a Windows Filtering Platform filter, typically security software, is in the way), ",[15,2265,2266],{},"NDISCompatibility"," (driver older than NDIS 6.30), ",[15,2269,2270],{},"ForwardingEnabled"," (IP forwarding is on) and ",[15,2273,2274],{},"NetOffloadGlobalDisabled",[15,2276,2277],{},"Set-NetOffloadGlobalSetting -ReceiveSegmentCoalescing Enabled",").",[34,2280,2281,2284,2285,2288,2289,2292],{},[2160,2282,2283],{},"Receive buffers."," For receive-heavy workloads Microsoft recommends raising the driver's receive buffers (",[15,2286,2287],{},"*ReceiveBuffers",") to the maximum, because low values cause drops. The range is vendor-defined: check ",[15,2290,2291],{},"Get-NetAdapterAdvancedProperty -Name \"\u003Cadapter>\" -RegistryKeyword \"*ReceiveBuffers\""," before setting it.",[34,2294,2295,2298,2299,2302],{},[2160,2296,2297],{},"SMB storage traffic."," With one RSS-capable NIC, SMB Multichannel opens several TCP connections per session so a single file copy isn't stuck on one core. Check it with ",[15,2300,2301],{},"Get-SmbMultichannelConnection"," during a copy. It's on by default.",[34,2304,2305,2306,2309,2310,2313],{},"Validate before and after with a real throughput test (",[15,2307,2308],{},"ntttcp"," or ",[15,2311,2312],{},"iperf3",") between the two endpoints, not the settings alone. A firmware or driver bug can undo any of this.",[26,2315,2317],{"id":2316},"source","Source",[31,2319,2320,2328,2335,2342,2349,2356,2363,2370,2377],{},[34,2321,2322],{},[20,2323,2327],{"href":2324,"rel":2325},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fnetworking\u002Ftechnologies\u002Fnetwork-subsystem\u002Fnet-sub-performance-tuning-nics",[2326],"nofollow","Network adapter performance tuning in Windows Server",[34,2329,2330],{},[20,2331,2334],{"href":2332,"rel":2333},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnetadapter\u002Fset-netadapterrss",[2326],"Set-NetAdapterRss",[34,2336,2337],{},[20,2338,2341],{"href":2339,"rel":2340},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnetadapter\u002Fset-netadapteradvancedproperty",[2326],"Set-NetAdapterAdvancedProperty",[34,2343,2344],{},[20,2345,2348],{"href":2346,"rel":2347},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-hardware\u002Fdrivers\u002Fnetwork\u002Fkeywords-that-can-be-edited",[2326],"Standardized INF keywords that can be edited (*JumboPacket, *ReceiveBuffers)",[34,2350,2351],{},[20,2352,2355],{"href":2353,"rel":2354},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnettcpip\u002Fset-nettcpsetting",[2326],"Set-NetTCPSetting",[34,2357,2358],{},[20,2359,2362],{"href":2360,"rel":2361},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnettcpip\u002Fset-netoffloadglobalsetting",[2326],"Set-NetOffloadGlobalSetting",[34,2364,2365],{},[20,2366,2369],{"href":2367,"rel":2368},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fprevious-versions\u002Fwindows\u002Fdesktop\u002Flegacy\u002Fhh872380(v=vs.85)",[2326],"MSFT_NetAdapterRscSettingData class (RSC failure reasons)",[34,2371,2372],{},[20,2373,2376],{"href":2374,"rel":2375},"https:\u002F\u002Ftechcommunity.microsoft.com\u002Ft5\u002Fnetworking-blog\u002Fwindows-transport-converges-on-two-congestion-providers-cubic\u002Fba-p\u002F339819",[2326],"Windows Transport converges on two congestion providers: Cubic and LEDBAT",[34,2378,2379],{},[20,2380,2383],{"href":2381,"rel":2382},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fadministration\u002Fwindows-commands\u002Fping",[2326],"ping command reference",[2385,2386,2387],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":240,"searchDepth":339,"depth":339,"links":2389},[2390,2391,2392,2393,2394,2395],{"id":28,"depth":339,"text":29},{"id":78,"depth":339,"text":79},{"id":229,"depth":339,"text":230},{"id":415,"depth":339,"text":416},{"id":2153,"depth":339,"text":2154},{"id":2316,"depth":339,"text":2317},"techcolumnist",[2398,2399],"ps","scripts","2025-04-10T14:00:00Z","A PowerShell script that audits and tunes RSS, RSC, checksum\u002FLSO offloads, jumbo frames and TCP autotuning on Windows Server 10GbE adapters, and flags ignored legacy tweaks.","md",false,null,{},"\u002Fblog\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads",{"title":6,"description":2401},[2396],"blog\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads",[239,2411,2412,2413],"windows","tcp","network","\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads\u002F","lHcAatMPEF2-C5IjSznuz3mwwk6a3su7t6UKLnJYTWA",{"title":2417,"description":2418,"date":2419,"url":2420,"categories":2421,"tags":2422,"image":2404,"readingTime":437,"canonical":2396,"sites":2425,"series":2404,"seriesOrder":2404},"PowerShell: Intune – Bulk Assign App Protection Policies by Group","A Microsoft Graph PowerShell script that adds Entra ID groups to an Intune App Protection Policy through the v1.0 assign action without dropping existing assignments.","2025-04-17T14:00:00Z","\u002F2025\u002F04\u002F17\u002Fpowershell-intune-bulk-assign-app-protection-policies-by-group\u002F",[2398,2399],[239,2423,2424],"intune","entra-id",[2396],{"title":2427,"description":2428,"date":2429,"url":2430,"categories":2431,"tags":2432,"image":2404,"readingTime":451,"canonical":2396,"sites":2435,"series":2404,"seriesOrder":2404},"PowerShell: Windows – Disable IPv6 Fleet-Wide via GPO Startup Script","A Group Policy startup script that sets the Tcpip6 DisabledComponents value (prefer IPv4 by default, full disable on request) with logging, binding checks and rollback.","2025-04-03T14:00:00Z","\u002F2025\u002F04\u002F03\u002Fpowershell-windows-disable-ipv6-fleet-wide-via-group-policy-startup-script\u002F",[2398,2399],[239,2411,2433,2434],"ipv6","gpo",[2396],[2437,2445,2455],{"title":2438,"description":2439,"date":2440,"url":2441,"categories":2442,"tags":2443,"image":2404,"readingTime":443,"canonical":2396,"sites":2444,"series":2404,"seriesOrder":2404},"PowerShell: Windows Server – Disable SMBv1 Fleet-Wide and Verify","A script that audits SMBv1 access (event 3000), disables the SMBv1 server and optional feature across Windows servers, and reports which ones still need a restart.","2025-11-26T14:00:00Z","\u002F2025\u002F11\u002F26\u002Fpowershell-windows-server-disable-smbv1-fleet-wide-and-verify-it-stuck\u002F",[2398,2399],[239,2411],[2396],{"title":2446,"description":2447,"date":2448,"url":2449,"categories":2450,"tags":2451,"image":2404,"readingTime":451,"canonical":2396,"sites":2454,"series":2404,"seriesOrder":2404},"PowerShell: Windows – Discover Local Admins Across Every Workstation","A script that reads the local Administrators group on every workstation by SID, survives orphaned-SID errors, and flags members outside an approved allowlist.","2025-10-08T14:00:00Z","\u002F2025\u002F10\u002F08\u002Fpowershell-windows-discover-local-admins-across-every-workstation\u002F",[2398,2399],[239,2411,2452,2453],"discovery","active-directory",[2396],{"title":2456,"description":2457,"date":2458,"url":2459,"categories":2460,"tags":2461,"image":2404,"readingTime":451,"canonical":2396,"sites":2462,"series":2404,"seriesOrder":2404},"PowerShell: Windows Server – Harden RDP Without Breaking Access","A PowerShell script that locks down Windows Server RDP: NLA, TLS-only, session limits, redirection, a firewall allowlist, Restricted Admin support and legacy TLS off.","2025-09-17T14:00:00Z","\u002F2025\u002F09\u002F17\u002Fpowershell-windows-server-harden-rdp-without-breaking-access\u002F",[2398,2399],[239,2411],[2396],{"doc":2404,"posts":2464},[],1790052512553]