[{"data":1,"prerenderedAt":1818},["ShallowReactive",2],{"post:\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network\u002F":3},{"post":4,"newer":1766,"older":1777,"related":1787,"series":1816},{"id":5,"title":6,"body":7,"canonical":1747,"categories":1748,"date":1750,"description":1751,"extension":1752,"featured":1753,"hero":1754,"image":1754,"meta":1755,"navigation":113,"path":1756,"readingTime":605,"seo":1757,"series":1754,"seriesOrder":1754,"sites":1758,"source":1754,"stem":1759,"tags":1760,"updated":1754,"url":1764,"__hash__":1765},"blog\u002Fblog\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network.md","Windows Server: TCP Stack Tuning for a 10GbE Storage Network",{"type":8,"value":9,"toc":1737},"minimark",[10,14,19,47,151,158,162,170,173,226,229,260,282,286,312,329,369,376,380,387,418,429,433,444,516,527,556,560,563,1633,1647,1651,1657,1661,1733],[11,12,13],"p",{},"A 10GbE link between a Windows Server host and an iSCSI or SMB storage target should, in theory, move a little over a gigabyte a second. In practice, the box you just cabled up will often plateau well below that, and the reflex is to blame the switch, the cabling, or the storage array before anyone looks at the host's own network stack. I've chased that plateau enough times now to check the host first, because more often than not that's where the ceiling is. Most of the time it isn't a missing registry tweak, either. It's one of a handful of settings that Microsoft documents clearly and that have drifted from where they should be.",[15,16,18],"h2",{"id":17},"start-with-a-baseline-not-a-setting","Start with a baseline, not a setting",[11,20,21,22,26,27,30,31,34,35,38,39,42,43,46],{},"The tuning below only matters if you know what \"good\" looks like on that specific link. I always run a raw throughput test between the two endpoints with no storage protocol in the way before touching anything, so a marginal cable or a port negotiated at the wrong speed doesn't get misdiagnosed as a stack problem three settings into a change window. Microsoft's NTTTCP tool is what I use between Windows hosts. The receiver and sender commands differ only in ",[23,24,25],"code",{},"-r"," and ",[23,28,29],{},"-s",". ",[23,32,33],{},"-m"," takes threads, CPU (",[23,36,37],{},"*"," for any) and the receiver's IP; Microsoft's own guidance uses twice the receiver's core count for threads, so the ",[23,40,41],{},"16"," below is for an eight-core receiver. ",[23,44,45],{},"-t"," is the duration in seconds:",[48,49,54],"pre",{"className":50,"code":51,"language":52,"meta":53,"style":53},"language-powershell shiki shiki-themes github-dark","# On the receiver (the storage-side host).\nntttcp.exe -r -m 16,*,10.20.30.11 -t 60\n\n# On the sender.\nntttcp.exe -s -m 16,*,10.20.30.11 -t 60\n","powershell","",[23,55,56,65,108,115,121],{"__ignoreMap":53},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"sAwPA","# On the receiver (the storage-side host).\n",[57,66,68,72,76,80,83,86,88,91,94,97,100,102,105],{"class":59,"line":67},2,[57,69,71],{"class":70},"sDLfK","ntttcp.exe",[57,73,75],{"class":74},"snl16"," -",[57,77,79],{"class":78},"s95oV","r ",[57,81,82],{"class":74},"-",[57,84,85],{"class":78},"m ",[57,87,41],{"class":70},[57,89,90],{"class":74},",*,",[57,92,93],{"class":70},"10.20",[57,95,96],{"class":78},".",[57,98,99],{"class":70},"30.11",[57,101,75],{"class":74},[57,103,104],{"class":78},"t ",[57,106,107],{"class":70},"60\n",[57,109,111],{"class":59,"line":110},3,[57,112,114],{"emptyLinePlaceholder":113},true,"\n",[57,116,118],{"class":59,"line":117},4,[57,119,120],{"class":63},"# On the sender.\n",[57,122,124,126,128,131,133,135,137,139,141,143,145,147,149],{"class":59,"line":123},5,[57,125,71],{"class":70},[57,127,75],{"class":74},[57,129,130],{"class":78},"s ",[57,132,82],{"class":74},[57,134,85],{"class":78},[57,136,41],{"class":70},[57,138,90],{"class":74},[57,140,93],{"class":70},[57,142,96],{"class":78},[57,144,99],{"class":70},[57,146,75],{"class":74},[57,148,104],{"class":78},[57,150,107],{"class":70},[11,152,153,154,157],{},"Run it once with ",[23,155,156],{},"-m 1,*,\u003Cip>"," too. The gap between one thread and many is the whole story of the next section.",[15,159,161],{"id":160},"one-connection-lands-on-one-core","One connection lands on one core",[11,163,164,165,169],{},"Receive Side Scaling exists because a single CPU core can't keep up with a fast NIC. RSS hashes each incoming packet's headers and spreads different connections across cores. The key word is ",[166,167,168],"em",{},"connections",". Microsoft's SMB Multichannel documentation spells out the consequence for storage: with a single 10GbE adapter and one SMB session without Multichannel, \"SMB creates a single TCP\u002FIP connection. With only a single CPU core, this configuration inherently leads to congestion, especially when many small I\u002FO operations are performed,\" and \"if you use a single connection, RSS cannot help.\"",[11,171,172],{},"So there are two things to check, in order:",[174,175,176,220],"ol",{},[177,178,179,183,184,187,188,191,192,195,196,199,200,26,203,206,207,210,211,214,215,26,217,219],"li",{},[180,181,182],"strong",{},"RSS is on and has cores to use."," ",[23,185,186],{},"Get-NetAdapterRss"," shows ",[23,189,190],{},"Enabled",", the ",[23,193,194],{},"Profile"," (the default is ",[23,197,198],{},"NUMAStatic","), ",[23,201,202],{},"BaseProcessorNumber",[23,204,205],{},"MaxProcessors",". I've found RSS enabled at the driver level while every one of its queues was pinned to core 0, and I've found it switched off globally (",[23,208,209],{},"Get-NetOffloadGlobalSetting","); \"enabled\" in the adapter properties proves neither. The full object (",[23,212,213],{},"Get-NetAdapterRss -Name \u003Cadapter> | Format-List -Property *",") shows which processors are actually in the RSS array. Microsoft's own advice on the knobs is restrained: \"Selecting the correct profile should be sufficient in most scenarios.\" Set ",[23,216,202],{},[23,218,205],{}," only when you're deliberately dividing cores between several adapters. If Task Manager shows logical processors underused for receive traffic, the tuning guide suggests raising the number of RSS queues toward what the adapter supports.",[177,221,222,225],{},[180,223,224],{},"The storage protocol actually uses more than one connection."," For SMB 3.x that's SMB Multichannel, which is on by default and, with an RSS-capable NIC, \"creates multiple TCP\u002FIP connections for that particular session.\" Two traps: Multichannel ignores slower adapters when a faster one exists (\"network adapters that are the same type... and have the same speed are simultaneously used\"), and disabling it on either the client or the server disables it for both. For iSCSI, the equivalent is multiple sessions or connections through MPIO, which is a separate configuration on the initiator.",[11,227,228],{},"Verify Multichannel during a long copy, not at idle:",[48,230,232],{"className":50,"code":231,"language":52,"meta":53,"style":53},"Get-SmbClientConfiguration | Select-Object -Property EnableMultiChannel\nGet-SmbClientNetworkInterface\nGet-SmbMultichannelConnection\n",[23,233,234,250,255],{"__ignoreMap":53},[57,235,236,239,242,245,247],{"class":59,"line":60},[57,237,238],{"class":70},"Get-SmbClientConfiguration",[57,240,241],{"class":74}," |",[57,243,244],{"class":70}," Select-Object",[57,246,75],{"class":74},[57,248,249],{"class":78},"Property EnableMultiChannel\n",[57,251,252],{"class":59,"line":67},[57,253,254],{"class":70},"Get-SmbClientNetworkInterface\n",[57,256,257],{"class":59,"line":110},[57,258,259],{"class":70},"Get-SmbMultichannelConnection\n",[11,261,262,263,26,266,269,270,273,274,277,278,281],{},"If Multichannel isn't selecting an interface, Microsoft's troubleshooting guide checks the obvious first: ",[23,264,265],{},"ms_server",[23,267,268],{},"ms_msclient"," bound on the adapter (",[23,271,272],{},"Get-NetAdapterBinding -ComponentID ms_server,ms_msclient","), the interface listed by ",[23,275,276],{},"Get-SmbServerNetworkInterface",", the network profile not being Public, and nothing in the path blocking the SMB3 ",[23,279,280],{},"NETWORK_INTERFACE_INFO"," exchange. SMB2 and earlier don't do Multichannel at all.",[15,283,285],{"id":284},"the-tcp-window-is-autotuned-leave-it-that-way","The TCP window is autotuned; leave it that way",[11,287,288,289,292,293,292,296,292,299,292,302,305,306,308,309,311],{},"It's tempting to decide that small, low-latency storage I\u002FO never gives autotuning a fair chance and to pin the window instead. I've been down that road, and it isn't what Microsoft documents. Receive window autotuning has five levels (",[23,290,291],{},"Normal",", ",[23,294,295],{},"Disabled",[23,297,298],{},"Restricted",[23,300,301],{},"HighlyRestricted",[23,303,304],{},"Experimental",") and ",[23,307,291],{}," is the default, described as growing the window \"to accommodate almost all scenarios.\" ",[23,310,295],{}," is the one that hurts: the window stays at its default size, which depends on link speed (64 KB from 100 Mbps up to 10 Gbps, 128 KB at 10 Gbps and above). Microsoft's formula is throughput = window \u002F latency, so a fixed window caps a single connection no matter how fast the wire is.",[11,313,314,315,292,318,26,321,324,325,328],{},"The other half of the story is that the old registry method is gone. Microsoft lists ",[23,316,317],{},"TcpWindowSize",[23,319,320],{},"NumTcbTablePartitions",[23,322,323],{},"MaxHashTableSize"," under ",[23,326,327],{},"HKLM\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters"," 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.\" If a tuning guide tells you to create those values, it was written for Windows Server 2003. Check and set autotuning with the supported tools:",[48,330,332],{"className":50,"code":331,"language":52,"meta":53,"style":53},"Get-NetTCPSetting | Select-Object -Property SettingName, AutoTuningLevelLocal, CongestionProvider\nSet-NetTCPSetting -AutoTuningLevelLocal Normal\n",[23,333,334,359],{"__ignoreMap":53},[57,335,336,339,341,343,345,348,351,354,356],{"class":59,"line":60},[57,337,338],{"class":70},"Get-NetTCPSetting",[57,340,241],{"class":74},[57,342,244],{"class":70},[57,344,75],{"class":74},[57,346,347],{"class":78},"Property SettingName",[57,349,350],{"class":74},",",[57,352,353],{"class":78}," AutoTuningLevelLocal",[57,355,350],{"class":74},[57,357,358],{"class":78}," CongestionProvider\n",[57,360,361,364,366],{"class":59,"line":67},[57,362,363],{"class":70},"Set-NetTCPSetting",[57,365,75],{"class":74},[57,367,368],{"class":78},"AutoTuningLevelLocal Normal\n",[11,370,371,372,375],{},"Same for congestion control: since Windows Server 2019, the Internet, Datacenter and Custom templates use CUBIC (Compat stays on NewReno). ",[23,373,374],{},"DCTCP"," is only worth considering when the switches mark ECN end to end, which is a fabric project, not a host setting.",[15,377,379],{"id":378},"offloads-help-until-one-of-them-doesnt","Offloads help until one of them doesn't",[11,381,382,383,386],{},"Checksum offload, Large Send Offload and Receive Segment Coalescing reduce CPU cost per byte by pushing work onto the NIC, which matters at 10GbE rates. Microsoft's guidance: \"Enabling network adapter offload features is usually beneficial,\" with the caveat that a NIC without enough hardware resources can sustain ",[166,384,385],{},"less"," throughput with segmentation offload on. The two offloads Microsoft says not to use at all are TCP Chimney Offload and IPsec Task Offload: \"deprecated in Windows Server 2016, and might adversely affect server and networking performance.\" If you see Chimney in an old tuning checklist, that checklist predates Server 2016.",[11,388,389,390,393,394,397,398,401,402,405,406,409,410,413,414,417],{},"RSC deserves a specific check because it can be enabled and still not be working. ",[23,391,392],{},"Get-NetAdapterRsc"," reports ",[23,395,396],{},"IPv4OperationalState"," and, if it's off, ",[23,399,400],{},"IPv4FailureReason",": documented reasons include a Windows Filtering Platform filter in the path (",[23,403,404],{},"WFPCompatibility","), an old driver (",[23,407,408],{},"NDISCompatibility","), IP forwarding being on (",[23,411,412],{},"ForwardingEnabled","), or RSC disabled globally (",[23,415,416],{},"NetOffloadGlobalDisabled","). WFP is the one that surprises people: the tuning guide warns that \"a poorly written WFP filter can significantly decrease a server's networking performance,\" and firewall and antivirus products are the usual source.",[11,419,420,421,428],{},"The catch with offloads is the NIC doing the work. Microsoft's ",[422,423,427],"a",{"href":424,"rel":425},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fnetworking\u002Ftechnologies\u002Fnetwork-subsystem\u002Fnet-sub-performance-tuning-nics#offload-features",[426],"nofollow","network adapter tuning guide"," only goes as far as the resource caveat above (\"the network adapter might not be powerful enough to handle the offload capabilities with high throughput\"); it says nothing about firmware bugs. In my experience, though, offload bugs in NIC firmware and drivers turn up often enough that \"disable offloads and see if it gets faster\" is a legitimate diagnostic step, not folklore. I've hit at least one NIC generation where LSO corrupted iSCSI frames under sustained load in a way that only showed up as intermittent retransmits, not outright failures, the kind of problem that survives a quick smoke test. That's why the baseline script below records the retransmit rate.",[15,430,432],{"id":431},"jumbo-frames-only-pay-off-end-to-end","Jumbo frames only pay off end to end",[11,434,435,436,439,440,443],{},"Enabling 9000-byte jumbo frames on the server NIC without confirming every switch port and the storage target's NIC match doesn't just fail to help. The oversized frames get dropped or fragmented, which looks like intermittent packet loss under load rather than a configuration mismatch. On Windows, set it with the standardized driver keyword rather than a vendor display name. ",[23,437,438],{},"*JumboPacket"," is defined as the largest frame the hardware supports, counted including the Ethernet header, with a default of 1514 (a 1500-byte MTU), so a 9000-byte MTU is ",[23,441,442],{},"9014",". The valid range is vendor-defined, so check it first:",[48,445,447],{"className":50,"code":446,"language":52,"meta":53,"style":53},"Get-NetAdapterAdvancedProperty -Name \"SLOT 2 Port 1\" -RegistryKeyword \"*JumboPacket\" | Format-List -Property DisplayValue, RegistryValue, ValidRegistryValues\nSet-NetAdapterAdvancedProperty -Name \"SLOT 2 Port 1\" -RegistryKeyword \"*JumboPacket\" -RegistryValue 9014\n",[23,448,449,491],{"__ignoreMap":53},[57,450,451,454,456,459,463,465,468,471,473,476,478,481,483,486,488],{"class":59,"line":60},[57,452,453],{"class":70},"Get-NetAdapterAdvancedProperty",[57,455,75],{"class":74},[57,457,458],{"class":78},"Name ",[57,460,462],{"class":461},"sU2Wk","\"SLOT 2 Port 1\"",[57,464,75],{"class":74},[57,466,467],{"class":78},"RegistryKeyword ",[57,469,470],{"class":461},"\"*JumboPacket\"",[57,472,241],{"class":74},[57,474,475],{"class":70}," Format-List",[57,477,75],{"class":74},[57,479,480],{"class":78},"Property DisplayValue",[57,482,350],{"class":74},[57,484,485],{"class":78}," RegistryValue",[57,487,350],{"class":74},[57,489,490],{"class":78}," ValidRegistryValues\n",[57,492,493,496,498,500,502,504,506,508,510,513],{"class":59,"line":67},[57,494,495],{"class":70},"Set-NetAdapterAdvancedProperty",[57,497,75],{"class":74},[57,499,458],{"class":78},[57,501,462],{"class":461},[57,503,75],{"class":74},[57,505,467],{"class":78},[57,507,470],{"class":461},[57,509,75],{"class":74},[57,511,512],{"class":78},"RegistryValue ",[57,514,515],{"class":70},"9014\n",[11,517,518,519,522,523,526],{},"Then test the path, rather than trusting that three management consoles agree. ",[23,520,521],{},"ping -f"," sets Don't Fragment, and ",[23,524,525],{},"-l"," is the payload: 9000 minus 28 bytes of IPv4 and ICMP headers is 8972.",[48,528,530],{"className":50,"code":529,"language":52,"meta":53,"style":53},"ping.exe -f -l 8972 10.20.30.11\n",[23,531,532],{"__ignoreMap":53},[57,533,534,537,540,542,545,548,551,553],{"class":59,"line":60},[57,535,536],{"class":70},"ping.exe",[57,538,539],{"class":74}," -f",[57,541,75],{"class":74},[57,543,544],{"class":78},"l ",[57,546,547],{"class":70},"8972",[57,549,550],{"class":70}," 10.20",[57,552,96],{"class":78},[57,554,555],{"class":70},"30.11\n",[15,557,559],{"id":558},"a-baseline-script-for-the-host","A baseline script for the host",[11,561,562],{},"Before and after any change I capture the same snapshot on both ends, so \"it's faster\" is a comparison and not a feeling. This script is read-only. It records RSS, RSC and jumbo state per adapter and the host-wide offload state, flags ignored legacy registry values and the Chimney state, lists SMB Multichannel connections, and samples the TCP retransmit rate while you run a copy or NTTTCP. It needs Windows Server 2016 or later and an elevated session.",[48,564,566],{"className":50,"code":565,"language":52,"meta":53,"style":53},"\u003C#\n.SYNOPSIS\n    Captures a read-only network baseline for storage-facing adapters on Windows Server.\n.DESCRIPTION\n    Reports RSS, RSC, *JumboPacket and global offload state for the named adapters,\n    TCP autotuning and congestion provider per template, legacy Tcpip registry\n    values that Windows ignores, current SMB Multichannel connections, and the\n    TCPv4 retransmit rate sampled over a short window. Changes nothing.\n.PARAMETER AdapterName\n    Storage-facing adapter names, as shown by Get-NetAdapter.\n.PARAMETER SampleSeconds\n    How long to sample TCP counters. Default 30. Run a copy or NTTTCP meanwhile.\n.EXAMPLE\n    .\\Get-StorageNicBaseline.ps1 -AdapterName \"SLOT 2 Port 1\", \"SLOT 2 Port 2\" -SampleSeconds 60\n.NOTES\n    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n    Version : 1.0 (2026-07-01)\n    Requires: Windows Server 2016 or later, NetAdapter, NetTCPIP and SmbShare modules\n#>\n[CmdletBinding()]\nparam (\n    [Parameter(Mandatory = $true)]\n    [string[]]$AdapterName,\n\n    [ValidateRange(5, 600)]\n    [int]$SampleSeconds = 30\n)\n\nWrite-Host \"== Adapters\"\nGet-NetAdapter -Name $AdapterName |\n    Format-Table -Property Name, InterfaceDescription, Status, LinkSpeed, DriverVersion -AutoSize\n\nWrite-Host \"== RSS\"\nGet-NetAdapterRss -Name $AdapterName |\n    Format-Table -Property Name, Enabled, Profile, BaseProcessorNumber, MaxProcessors, NumberOfReceiveQueues -AutoSize\n\nWrite-Host \"== RSC (enabled vs actually operating)\"\nGet-NetAdapterRsc -Name $AdapterName |\n    Format-Table -Property Name, IPv4Enabled, IPv4OperationalState, IPv4FailureReason -AutoSize\n\nWrite-Host \"== Jumbo packet\"\nGet-NetAdapterAdvancedProperty -Name $AdapterName -RegistryKeyword \"*JumboPacket\" -ErrorAction SilentlyContinue |\n    Format-Table -Property Name, DisplayValue, @{ Name = \"RegistryValue\"; Expression = { $_.RegistryValue -join \",\" } } -AutoSize\n\nWrite-Host \"== Global offloads\"\nGet-NetOffloadGlobalSetting |\n    Format-List -Property ReceiveSideScaling, ReceiveSegmentCoalescing, Chimney, TaskOffload\n\nWrite-Host \"== TCP templates\"\nGet-NetTCPSetting |\n    Where-Object { $_.AutoTuningLevelLocal } |\n    Format-Table -Property SettingName, AutoTuningLevelLocal, CongestionProvider -AutoSize\n\nWrite-Host \"== Legacy registry values (ignored by Windows)\"\n$tcpipParams = Get-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\"\n$legacyFound = $false\n\nforeach ($legacy in @(\"TcpWindowSize\", \"NumTcbTablePartitions\", \"MaxHashTableSize\")) {\n    if ($null -ne $tcpipParams.$legacy) {\n        Write-Warning \"$legacy = $($tcpipParams.$legacy) (ignored; safe to remove)\"\n        $legacyFound = $true\n    }\n}\n\nif (-not $legacyFound) {\n    Write-Host \"None found.\"\n}\n\nWrite-Host \"== SMB Multichannel\"\nGet-SmbClientConfiguration | Format-List -Property EnableMultiChannel\nGet-SmbMultichannelConnection -ErrorAction SilentlyContinue | Format-Table -AutoSize\n\nWrite-Host \"== TCPv4 retransmits over $SampleSeconds seconds\"\n$counters = \"\\TCPv4\\Segments Sent\u002Fsec\", \"\\TCPv4\\Segments Retransmitted\u002Fsec\"\n$samples = Get-Counter -Counter $counters -SampleInterval 1 -MaxSamples $SampleSeconds\n\n$sent = ($samples.CounterSamples | Where-Object { $_.Path -like \"*segments sent\u002Fsec\" } | Measure-Object -Property CookedValue -Sum).Sum\n$retrans = ($samples.CounterSamples | Where-Object { $_.Path -like \"*segments retransmitted\u002Fsec\" } | Measure-Object -Property CookedValue -Sum).Sum\n\nif ($sent -gt 0) {\n    \"Retransmitted {0:N0} of {1:N0} segments ({2:P3})\" -f $retrans, $sent, ($retrans \u002F $sent)\n} else {\n    \"No TCPv4 segments sent during the sample.\"\n}\n",[23,567,568,573,580,585,592,597,603,609,615,626,632,642,648,656,662,670,676,682,688,694,706,715,740,754,759,779,796,802,807,816,830,866,871,879,890,928,933,941,952,980,985,993,1015,1069,1074,1082,1090,1116,1121,1129,1136,1151,1173,1178,1186,1205,1216,1221,1253,1271,1304,1315,1321,1327,1332,1346,1355,1360,1365,1373,1386,1406,1411,1425,1441,1470,1475,1522,1561,1566,1583,1610,1622,1628],{"__ignoreMap":53},[57,569,570],{"class":59,"line":60},[57,571,572],{"class":63},"\u003C#\n",[57,574,575,577],{"class":59,"line":67},[57,576,96],{"class":70},[57,578,579],{"class":74},"SYNOPSIS\n",[57,581,582],{"class":59,"line":110},[57,583,584],{"class":63},"    Captures a read-only network baseline for storage-facing adapters on Windows Server.\n",[57,586,587,589],{"class":59,"line":117},[57,588,96],{"class":70},[57,590,591],{"class":74},"DESCRIPTION\n",[57,593,594],{"class":59,"line":123},[57,595,596],{"class":63},"    Reports RSS, RSC, *JumboPacket and global offload state for the named adapters,\n",[57,598,600],{"class":59,"line":599},6,[57,601,602],{"class":63},"    TCP autotuning and congestion provider per template, legacy Tcpip registry\n",[57,604,606],{"class":59,"line":605},7,[57,607,608],{"class":63},"    values that Windows ignores, current SMB Multichannel connections, and the\n",[57,610,612],{"class":59,"line":611},8,[57,613,614],{"class":63},"    TCPv4 retransmit rate sampled over a short window. Changes nothing.\n",[57,616,618,620,623],{"class":59,"line":617},9,[57,619,96],{"class":70},[57,621,622],{"class":74},"PARAMETER",[57,624,625],{"class":74}," AdapterName\n",[57,627,629],{"class":59,"line":628},10,[57,630,631],{"class":63},"    Storage-facing adapter names, as shown by Get-NetAdapter.\n",[57,633,635,637,639],{"class":59,"line":634},11,[57,636,96],{"class":70},[57,638,622],{"class":74},[57,640,641],{"class":74}," SampleSeconds\n",[57,643,645],{"class":59,"line":644},12,[57,646,647],{"class":63},"    How long to sample TCP counters. Default 30. Run a copy or NTTTCP meanwhile.\n",[57,649,651,653],{"class":59,"line":650},13,[57,652,96],{"class":70},[57,654,655],{"class":74},"EXAMPLE\n",[57,657,659],{"class":59,"line":658},14,[57,660,661],{"class":63},"    .\\Get-StorageNicBaseline.ps1 -AdapterName \"SLOT 2 Port 1\", \"SLOT 2 Port 2\" -SampleSeconds 60\n",[57,663,665,667],{"class":59,"line":664},15,[57,666,96],{"class":70},[57,668,669],{"class":74},"NOTES\n",[57,671,673],{"class":59,"line":672},16,[57,674,675],{"class":63},"    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n",[57,677,679],{"class":59,"line":678},17,[57,680,681],{"class":63},"    Version : 1.0 (2026-07-01)\n",[57,683,685],{"class":59,"line":684},18,[57,686,687],{"class":63},"    Requires: Windows Server 2016 or later, NetAdapter, NetTCPIP and SmbShare modules\n",[57,689,691],{"class":59,"line":690},19,[57,692,693],{"class":63},"#>\n",[57,695,697,700,703],{"class":59,"line":696},20,[57,698,699],{"class":78},"[",[57,701,702],{"class":70},"CmdletBinding",[57,704,705],{"class":78},"()]\n",[57,707,709,712],{"class":59,"line":708},21,[57,710,711],{"class":74},"param",[57,713,714],{"class":78}," (\n",[57,716,718,721,724,727,731,734,737],{"class":59,"line":717},22,[57,719,720],{"class":78},"    [",[57,722,723],{"class":70},"Parameter",[57,725,726],{"class":78},"(",[57,728,730],{"class":729},"s9osk","Mandatory",[57,732,733],{"class":74}," =",[57,735,736],{"class":70}," $true",[57,738,739],{"class":78},")]\n",[57,741,743,745,748,751],{"class":59,"line":742},23,[57,744,720],{"class":78},[57,746,747],{"class":74},"string",[57,749,750],{"class":78},"[]]$AdapterName",[57,752,753],{"class":74},",\n",[57,755,757],{"class":59,"line":756},24,[57,758,114],{"emptyLinePlaceholder":113},[57,760,762,764,767,769,772,774,777],{"class":59,"line":761},25,[57,763,720],{"class":78},[57,765,766],{"class":70},"ValidateRange",[57,768,726],{"class":78},[57,770,771],{"class":70},"5",[57,773,350],{"class":74},[57,775,776],{"class":70}," 600",[57,778,739],{"class":78},[57,780,782,784,787,790,793],{"class":59,"line":781},26,[57,783,720],{"class":78},[57,785,786],{"class":74},"int",[57,788,789],{"class":78},"]$SampleSeconds ",[57,791,792],{"class":74},"=",[57,794,795],{"class":70}," 30\n",[57,797,799],{"class":59,"line":798},27,[57,800,801],{"class":78},")\n",[57,803,805],{"class":59,"line":804},28,[57,806,114],{"emptyLinePlaceholder":113},[57,808,810,813],{"class":59,"line":809},29,[57,811,812],{"class":70},"Write-Host",[57,814,815],{"class":461}," \"== Adapters\"\n",[57,817,819,822,824,827],{"class":59,"line":818},30,[57,820,821],{"class":70},"Get-NetAdapter",[57,823,75],{"class":74},[57,825,826],{"class":78},"Name $AdapterName ",[57,828,829],{"class":74},"|\n",[57,831,833,836,838,841,843,846,848,851,853,856,858,861,863],{"class":59,"line":832},31,[57,834,835],{"class":70},"    Format-Table",[57,837,75],{"class":74},[57,839,840],{"class":78},"Property Name",[57,842,350],{"class":74},[57,844,845],{"class":78}," InterfaceDescription",[57,847,350],{"class":74},[57,849,850],{"class":78}," Status",[57,852,350],{"class":74},[57,854,855],{"class":78}," LinkSpeed",[57,857,350],{"class":74},[57,859,860],{"class":78}," DriverVersion ",[57,862,82],{"class":74},[57,864,865],{"class":78},"AutoSize\n",[57,867,869],{"class":59,"line":868},32,[57,870,114],{"emptyLinePlaceholder":113},[57,872,874,876],{"class":59,"line":873},33,[57,875,812],{"class":70},[57,877,878],{"class":461}," \"== RSS\"\n",[57,880,882,884,886,888],{"class":59,"line":881},34,[57,883,186],{"class":70},[57,885,75],{"class":74},[57,887,826],{"class":78},[57,889,829],{"class":74},[57,891,893,895,897,899,901,904,906,909,911,914,916,919,921,924,926],{"class":59,"line":892},35,[57,894,835],{"class":70},[57,896,75],{"class":74},[57,898,840],{"class":78},[57,900,350],{"class":74},[57,902,903],{"class":78}," Enabled",[57,905,350],{"class":74},[57,907,908],{"class":78}," Profile",[57,910,350],{"class":74},[57,912,913],{"class":78}," BaseProcessorNumber",[57,915,350],{"class":74},[57,917,918],{"class":78}," MaxProcessors",[57,920,350],{"class":74},[57,922,923],{"class":78}," NumberOfReceiveQueues ",[57,925,82],{"class":74},[57,927,865],{"class":78},[57,929,931],{"class":59,"line":930},36,[57,932,114],{"emptyLinePlaceholder":113},[57,934,936,938],{"class":59,"line":935},37,[57,937,812],{"class":70},[57,939,940],{"class":461}," \"== RSC (enabled vs actually operating)\"\n",[57,942,944,946,948,950],{"class":59,"line":943},38,[57,945,392],{"class":70},[57,947,75],{"class":74},[57,949,826],{"class":78},[57,951,829],{"class":74},[57,953,955,957,959,961,963,966,968,971,973,976,978],{"class":59,"line":954},39,[57,956,835],{"class":70},[57,958,75],{"class":74},[57,960,840],{"class":78},[57,962,350],{"class":74},[57,964,965],{"class":78}," IPv4Enabled",[57,967,350],{"class":74},[57,969,970],{"class":78}," IPv4OperationalState",[57,972,350],{"class":74},[57,974,975],{"class":78}," IPv4FailureReason ",[57,977,82],{"class":74},[57,979,865],{"class":78},[57,981,983],{"class":59,"line":982},40,[57,984,114],{"emptyLinePlaceholder":113},[57,986,988,990],{"class":59,"line":987},41,[57,989,812],{"class":70},[57,991,992],{"class":461}," \"== Jumbo packet\"\n",[57,994,996,998,1000,1002,1004,1006,1008,1010,1013],{"class":59,"line":995},42,[57,997,453],{"class":70},[57,999,75],{"class":74},[57,1001,826],{"class":78},[57,1003,82],{"class":74},[57,1005,467],{"class":78},[57,1007,470],{"class":461},[57,1009,75],{"class":74},[57,1011,1012],{"class":78},"ErrorAction SilentlyContinue ",[57,1014,829],{"class":74},[57,1016,1018,1020,1022,1024,1026,1029,1031,1034,1037,1039,1042,1045,1047,1050,1053,1056,1059,1062,1065,1067],{"class":59,"line":1017},43,[57,1019,835],{"class":70},[57,1021,75],{"class":74},[57,1023,840],{"class":78},[57,1025,350],{"class":74},[57,1027,1028],{"class":78}," DisplayValue",[57,1030,350],{"class":74},[57,1032,1033],{"class":74}," @",[57,1035,1036],{"class":78},"{ Name ",[57,1038,792],{"class":74},[57,1040,1041],{"class":461}," \"RegistryValue\"",[57,1043,1044],{"class":78},"; Expression ",[57,1046,792],{"class":74},[57,1048,1049],{"class":78}," { ",[57,1051,1052],{"class":70},"$_",[57,1054,1055],{"class":78},".RegistryValue ",[57,1057,1058],{"class":74},"-join",[57,1060,1061],{"class":461}," \",\"",[57,1063,1064],{"class":78}," } } ",[57,1066,82],{"class":74},[57,1068,865],{"class":78},[57,1070,1072],{"class":59,"line":1071},44,[57,1073,114],{"emptyLinePlaceholder":113},[57,1075,1077,1079],{"class":59,"line":1076},45,[57,1078,812],{"class":70},[57,1080,1081],{"class":461}," \"== Global offloads\"\n",[57,1083,1085,1087],{"class":59,"line":1084},46,[57,1086,209],{"class":70},[57,1088,1089],{"class":74}," |\n",[57,1091,1093,1096,1098,1101,1103,1106,1108,1111,1113],{"class":59,"line":1092},47,[57,1094,1095],{"class":70},"    Format-List",[57,1097,75],{"class":74},[57,1099,1100],{"class":78},"Property ReceiveSideScaling",[57,1102,350],{"class":74},[57,1104,1105],{"class":78}," ReceiveSegmentCoalescing",[57,1107,350],{"class":74},[57,1109,1110],{"class":78}," Chimney",[57,1112,350],{"class":74},[57,1114,1115],{"class":78}," TaskOffload\n",[57,1117,1119],{"class":59,"line":1118},48,[57,1120,114],{"emptyLinePlaceholder":113},[57,1122,1124,1126],{"class":59,"line":1123},49,[57,1125,812],{"class":70},[57,1127,1128],{"class":461}," \"== TCP templates\"\n",[57,1130,1132,1134],{"class":59,"line":1131},50,[57,1133,338],{"class":70},[57,1135,1089],{"class":74},[57,1137,1139,1142,1144,1146,1149],{"class":59,"line":1138},51,[57,1140,1141],{"class":70},"    Where-Object",[57,1143,1049],{"class":78},[57,1145,1052],{"class":70},[57,1147,1148],{"class":78},".AutoTuningLevelLocal } ",[57,1150,829],{"class":74},[57,1152,1154,1156,1158,1160,1162,1164,1166,1169,1171],{"class":59,"line":1153},52,[57,1155,835],{"class":70},[57,1157,75],{"class":74},[57,1159,347],{"class":78},[57,1161,350],{"class":74},[57,1163,353],{"class":78},[57,1165,350],{"class":74},[57,1167,1168],{"class":78}," CongestionProvider ",[57,1170,82],{"class":74},[57,1172,865],{"class":78},[57,1174,1176],{"class":59,"line":1175},53,[57,1177,114],{"emptyLinePlaceholder":113},[57,1179,1181,1183],{"class":59,"line":1180},54,[57,1182,812],{"class":70},[57,1184,1185],{"class":461}," \"== Legacy registry values (ignored by Windows)\"\n",[57,1187,1189,1192,1194,1197,1199,1202],{"class":59,"line":1188},55,[57,1190,1191],{"class":78},"$tcpipParams ",[57,1193,792],{"class":74},[57,1195,1196],{"class":70}," Get-ItemProperty",[57,1198,75],{"class":74},[57,1200,1201],{"class":78},"Path ",[57,1203,1204],{"class":461},"\"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\"\n",[57,1206,1208,1211,1213],{"class":59,"line":1207},56,[57,1209,1210],{"class":78},"$legacyFound ",[57,1212,792],{"class":74},[57,1214,1215],{"class":70}," $false\n",[57,1217,1219],{"class":59,"line":1218},57,[57,1220,114],{"emptyLinePlaceholder":113},[57,1222,1224,1227,1230,1233,1235,1237,1240,1242,1245,1247,1250],{"class":59,"line":1223},58,[57,1225,1226],{"class":74},"foreach",[57,1228,1229],{"class":78}," ($legacy ",[57,1231,1232],{"class":74},"in",[57,1234,1033],{"class":74},[57,1236,726],{"class":78},[57,1238,1239],{"class":461},"\"TcpWindowSize\"",[57,1241,350],{"class":74},[57,1243,1244],{"class":461}," \"NumTcbTablePartitions\"",[57,1246,350],{"class":74},[57,1248,1249],{"class":461}," \"MaxHashTableSize\"",[57,1251,1252],{"class":78},")) {\n",[57,1254,1256,1259,1262,1265,1268],{"class":59,"line":1255},59,[57,1257,1258],{"class":74},"    if",[57,1260,1261],{"class":78}," (",[57,1263,1264],{"class":70},"$null",[57,1266,1267],{"class":74}," -ne",[57,1269,1270],{"class":78}," $tcpipParams.$legacy) {\n",[57,1272,1274,1277,1280,1283,1286,1289,1291,1294,1296,1298,1301],{"class":59,"line":1273},60,[57,1275,1276],{"class":70},"        Write-Warning",[57,1278,1279],{"class":461}," \"",[57,1281,1282],{"class":78},"$legacy",[57,1284,1285],{"class":461}," = ",[57,1287,1288],{"class":74},"$",[57,1290,726],{"class":461},[57,1292,1293],{"class":78},"$tcpipParams",[57,1295,96],{"class":461},[57,1297,1282],{"class":78},[57,1299,1300],{"class":461},")",[57,1302,1303],{"class":461}," (ignored; safe to remove)\"\n",[57,1305,1307,1310,1312],{"class":59,"line":1306},61,[57,1308,1309],{"class":78},"        $legacyFound ",[57,1311,792],{"class":74},[57,1313,1314],{"class":70}," $true\n",[57,1316,1318],{"class":59,"line":1317},62,[57,1319,1320],{"class":78},"    }\n",[57,1322,1324],{"class":59,"line":1323},63,[57,1325,1326],{"class":78},"}\n",[57,1328,1330],{"class":59,"line":1329},64,[57,1331,114],{"emptyLinePlaceholder":113},[57,1333,1335,1338,1340,1343],{"class":59,"line":1334},65,[57,1336,1337],{"class":74},"if",[57,1339,1261],{"class":78},[57,1341,1342],{"class":74},"-not",[57,1344,1345],{"class":78}," $legacyFound) {\n",[57,1347,1349,1352],{"class":59,"line":1348},66,[57,1350,1351],{"class":70},"    Write-Host",[57,1353,1354],{"class":461}," \"None found.\"\n",[57,1356,1358],{"class":59,"line":1357},67,[57,1359,1326],{"class":78},[57,1361,1363],{"class":59,"line":1362},68,[57,1364,114],{"emptyLinePlaceholder":113},[57,1366,1368,1370],{"class":59,"line":1367},69,[57,1369,812],{"class":70},[57,1371,1372],{"class":461}," \"== SMB Multichannel\"\n",[57,1374,1376,1378,1380,1382,1384],{"class":59,"line":1375},70,[57,1377,238],{"class":70},[57,1379,241],{"class":74},[57,1381,475],{"class":70},[57,1383,75],{"class":74},[57,1385,249],{"class":78},[57,1387,1389,1392,1394,1396,1399,1402,1404],{"class":59,"line":1388},71,[57,1390,1391],{"class":70},"Get-SmbMultichannelConnection",[57,1393,75],{"class":74},[57,1395,1012],{"class":78},[57,1397,1398],{"class":74},"|",[57,1400,1401],{"class":70}," Format-Table",[57,1403,75],{"class":74},[57,1405,865],{"class":78},[57,1407,1409],{"class":59,"line":1408},72,[57,1410,114],{"emptyLinePlaceholder":113},[57,1412,1414,1416,1419,1422],{"class":59,"line":1413},73,[57,1415,812],{"class":70},[57,1417,1418],{"class":461}," \"== TCPv4 retransmits over ",[57,1420,1421],{"class":78},"$SampleSeconds",[57,1423,1424],{"class":461}," seconds\"\n",[57,1426,1428,1431,1433,1436,1438],{"class":59,"line":1427},74,[57,1429,1430],{"class":78},"$counters ",[57,1432,792],{"class":74},[57,1434,1435],{"class":461}," \"\\TCPv4\\Segments Sent\u002Fsec\"",[57,1437,350],{"class":74},[57,1439,1440],{"class":461}," \"\\TCPv4\\Segments Retransmitted\u002Fsec\"\n",[57,1442,1444,1447,1449,1452,1454,1457,1459,1462,1465,1467],{"class":59,"line":1443},75,[57,1445,1446],{"class":78},"$samples ",[57,1448,792],{"class":74},[57,1450,1451],{"class":70}," Get-Counter",[57,1453,75],{"class":74},[57,1455,1456],{"class":78},"Counter $counters ",[57,1458,82],{"class":74},[57,1460,1461],{"class":78},"SampleInterval ",[57,1463,1464],{"class":70},"1",[57,1466,75],{"class":74},[57,1468,1469],{"class":78},"MaxSamples $SampleSeconds\n",[57,1471,1473],{"class":59,"line":1472},76,[57,1474,114],{"emptyLinePlaceholder":113},[57,1476,1478,1481,1483,1486,1488,1491,1493,1495,1498,1501,1504,1507,1509,1512,1514,1517,1519],{"class":59,"line":1477},77,[57,1479,1480],{"class":78},"$sent ",[57,1482,792],{"class":74},[57,1484,1485],{"class":78}," ($samples.CounterSamples ",[57,1487,1398],{"class":74},[57,1489,1490],{"class":70}," Where-Object",[57,1492,1049],{"class":78},[57,1494,1052],{"class":70},[57,1496,1497],{"class":78},".Path ",[57,1499,1500],{"class":74},"-like",[57,1502,1503],{"class":461}," \"*segments sent\u002Fsec\"",[57,1505,1506],{"class":78}," } ",[57,1508,1398],{"class":74},[57,1510,1511],{"class":70}," Measure-Object",[57,1513,75],{"class":74},[57,1515,1516],{"class":78},"Property CookedValue ",[57,1518,82],{"class":74},[57,1520,1521],{"class":78},"Sum).Sum\n",[57,1523,1525,1528,1530,1532,1534,1536,1538,1540,1542,1544,1547,1549,1551,1553,1555,1557,1559],{"class":59,"line":1524},78,[57,1526,1527],{"class":78},"$retrans ",[57,1529,792],{"class":74},[57,1531,1485],{"class":78},[57,1533,1398],{"class":74},[57,1535,1490],{"class":70},[57,1537,1049],{"class":78},[57,1539,1052],{"class":70},[57,1541,1497],{"class":78},[57,1543,1500],{"class":74},[57,1545,1546],{"class":461}," \"*segments retransmitted\u002Fsec\"",[57,1548,1506],{"class":78},[57,1550,1398],{"class":74},[57,1552,1511],{"class":70},[57,1554,75],{"class":74},[57,1556,1516],{"class":78},[57,1558,82],{"class":74},[57,1560,1521],{"class":78},[57,1562,1564],{"class":59,"line":1563},79,[57,1565,114],{"emptyLinePlaceholder":113},[57,1567,1569,1571,1574,1577,1580],{"class":59,"line":1568},80,[57,1570,1337],{"class":74},[57,1572,1573],{"class":78}," ($sent ",[57,1575,1576],{"class":74},"-gt",[57,1578,1579],{"class":70}," 0",[57,1581,1582],{"class":78},") {\n",[57,1584,1586,1589,1591,1594,1596,1599,1601,1604,1607],{"class":59,"line":1585},81,[57,1587,1588],{"class":461},"    \"Retransmitted {0:N0} of {1:N0} segments ({2:P3})\"",[57,1590,539],{"class":74},[57,1592,1593],{"class":78}," $retrans",[57,1595,350],{"class":74},[57,1597,1598],{"class":78}," $sent",[57,1600,350],{"class":74},[57,1602,1603],{"class":78}," ($retrans ",[57,1605,1606],{"class":74},"\u002F",[57,1608,1609],{"class":78}," $sent)\n",[57,1611,1613,1616,1619],{"class":59,"line":1612},82,[57,1614,1615],{"class":78},"} ",[57,1617,1618],{"class":74},"else",[57,1620,1621],{"class":78}," {\n",[57,1623,1625],{"class":59,"line":1624},83,[57,1626,1627],{"class":461},"    \"No TCPv4 segments sent during the sample.\"\n",[57,1629,1631],{"class":59,"line":1630},84,[57,1632,1326],{"class":78},[11,1634,1635,1636,1638,1639,1643,1644,96],{},"Run it on both hosts, save the output with the change ticket, and run it again after each change. The one-setting-at-a-time version of the fixes (RSS, RSC, checksum and LSO on, jumbo frames, autotuning back to ",[23,1637,291],{},") is packaged as ",[422,1640,1642],{"href":1641},"\u002F2025\u002F04\u002F10\u002Fpowershell-windows-server-optimize-the-tcp-stack-for-10gbe-workloads\u002F","PowerShell: Windows Server – Tune the TCP Stack for 10GbE Workloads",", which also warns that the adapter cmdlets bounce the NIC unless you pass ",[23,1645,1646],{},"-NoRestart",[15,1648,1650],{"id":1649},"none-of-this-replaces-the-baseline","None of this replaces the baseline",[11,1652,1653,1654,1656],{},"If I had to reduce this to an order of operations: measure the raw link with NTTTCP, confirm RSS is spreading load and the storage protocol is using more than one connection, confirm autotuning is ",[23,1655,291],{}," and delete any 2003-era registry values, check that RSC and the offloads are actually operating, then do jumbo frames last and prove them with a Don't Fragment ping. Each step is cheap to check and hard to argue with, which is exactly what you want at 2 a.m. when the storage team is sure it's the network and the network team is sure it's storage.",[15,1658,1660],{"id":1659},"references","References",[1662,1663,1664,1671,1678,1685,1692,1698,1705,1712,1719,1726],"ul",{},[177,1665,1666],{},[422,1667,1670],{"href":1668,"rel":1669},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fnetworking\u002Ftechnologies\u002Fnetwork-subsystem\u002Fnet-sub-performance-tuning-nics",[426],"Network adapter performance tuning in Windows Server",[177,1672,1673],{},[422,1674,1677],{"href":1675,"rel":1676},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fstorage\u002Fstorage-spaces\u002Fmanage-smb-multichannel",[426],"Manage SMB Multichannel",[177,1679,1680],{},[422,1681,1684],{"href":1682,"rel":1683},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Ftroubleshoot\u002Fwindows-server\u002Fnetworking\u002Fsmb-multichannel-troubleshooting",[426],"SMB Multichannel troubleshooting",[177,1686,1687],{},[422,1688,1691],{"href":1689,"rel":1690},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnetadapter\u002Fset-netadapterrss",[426],"Set-NetAdapterRss",[177,1693,1694],{},[422,1695,363],{"href":1696,"rel":1697},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fpowershell\u002Fmodule\u002Fnettcpip\u002Fset-nettcpsetting",[426],[177,1699,1700],{},[422,1701,1704],{"href":1702,"rel":1703},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-hardware\u002Fdrivers\u002Fnetwork\u002Fkeywords-that-can-be-edited",[426],"Standardized INF keywords that can be edited (*JumboPacket)",[177,1706,1707],{},[422,1708,1711],{"href":1709,"rel":1710},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fprevious-versions\u002Fwindows\u002Fdesktop\u002Flegacy\u002Fhh872380(v=vs.85)",[426],"MSFT_NetAdapterRscSettingData class (RSC failure reasons)",[177,1713,1714],{},[422,1715,1718],{"href":1716,"rel":1717},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fvirtual-network\u002Fvirtual-network-bandwidth-testing",[426],"Test VM network throughput by using NTTTCP",[177,1720,1721],{},[422,1722,1725],{"href":1723,"rel":1724},"https:\u002F\u002Ftechcommunity.microsoft.com\u002Ft5\u002Fnetworking-blog\u002Fwindows-transport-converges-on-two-congestion-providers-cubic\u002Fba-p\u002F339819",[426],"Windows Transport converges on two congestion providers: Cubic and LEDBAT",[177,1727,1728],{},[422,1729,1732],{"href":1730,"rel":1731},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows-server\u002Fadministration\u002Fwindows-commands\u002Fping",[426],"ping command reference",[1734,1735,1736],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}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 .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":53,"searchDepth":67,"depth":67,"links":1738},[1739,1740,1741,1742,1743,1744,1745,1746],{"id":17,"depth":67,"text":18},{"id":160,"depth":67,"text":161},{"id":284,"depth":67,"text":285},{"id":378,"depth":67,"text":379},{"id":431,"depth":67,"text":432},{"id":558,"depth":67,"text":559},{"id":1649,"depth":67,"text":1650},{"id":1659,"depth":67,"text":1660},"techcolumnist",[1749],"engineering","2026-07-01T14:00:00Z","Field notes on getting 10GbE-class throughput from Windows Server storage links: RSS, SMB Multichannel, autotuning, offloads, jumbo frames, and a baseline script.","md",false,null,{},"\u002Fblog\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network",{"title":6,"description":1751},[1747],"blog\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network",[1761,1762,1763],"windows","tcp","network","\u002F2026\u002F07\u002F01\u002Fwindows-server-tcp-stack-tuning-for-a-10gbe-storage-network\u002F","P7c2Lfz7iJ6eNNA1woH-ruQJokBQzF_jrkaoY6Jwnsg",{"title":1767,"description":1768,"date":1769,"url":1770,"categories":1771,"tags":1772,"image":1754,"readingTime":605,"canonical":1747,"sites":1776,"series":1754,"seriesOrder":1754},"Kubernetes: Running Talos Alongside a Legacy Hyper-V Estate","Introducing a Talos Kubernetes cluster into an existing Hyper-V estate: VM build script, Image Factory schematic, VLAN, VIP, firewall and storage boundaries.","2026-07-08T14:00:00Z","\u002F2026\u002F07\u002F08\u002Fkubernetes-running-talos-alongside-a-legacy-hyper-v-estate\u002F",[1749],[1773,1774,1775],"talos","kubernetes","hyper-v",[1747],{"title":1778,"description":1779,"date":1780,"url":1781,"categories":1782,"tags":1783,"image":1754,"readingTime":605,"canonical":1747,"sites":1786,"series":1754,"seriesOrder":1754},"Windows Server: Disabling IPv6 Company-Wide — What Actually Broke","Field notes on disabling IPv6 across a Windows Server estate: what Microsoft says, what breaks, why prefer-IPv4 (0x20) beats 0xFF, and an audit script.","2026-06-24T14:00:00Z","\u002F2026\u002F06\u002F24\u002Fwindows-server-disabling-ipv6-company-wide-what-actually-broke\u002F",[1749],[1761,1784,1785],"ipv6","gpo",[1747],[1788,1799,1806],{"title":1789,"description":1790,"date":1791,"url":1792,"categories":1793,"tags":1795,"image":1754,"readingTime":110,"canonical":1747,"sites":1798,"series":1754,"seriesOrder":1754},"Python: Discovery – Crawling DNS Zones for Orphaned Records","A dnspython script that transfers a zone with AXFR, probes every A\u002FAAAA record for signs of life, flags dangling CNAMEs, and reports orphan cleanup candidates.","2026-01-28T14:00:00Z","\u002F2026\u002F01\u002F28\u002Fpython-discovery-crawling-dns-zones-for-orphaned-records\u002F",[1794,1749],"scripts",[1796,1797,1763,1761],"python","discovery",[1747],{"title":1642,"description":1800,"date":1801,"url":1641,"categories":1802,"tags":1804,"image":1754,"readingTime":117,"canonical":1747,"sites":1805,"series":1754,"seriesOrder":1754},"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.","2025-04-10T14:00:00Z",[1803,1794],"ps",[52,1761,1762,1763],[1747],{"title":1807,"description":1808,"date":1809,"url":1810,"categories":1811,"tags":1813,"image":1754,"readingTime":123,"canonical":1747,"sites":1815,"series":1754,"seriesOrder":1754},"Windows Management: A Discovery Inventory Nobody Maintains by Hand","Why a self-refreshing Windows inventory built from AD and CIM discovery outlasts a spreadsheet, with the sweep script, staleness report and schedule.","2026-09-02T14:00:00Z","\u002F2026\u002F09\u002F02\u002Fwindows-management-building-a-discovery-inventory-nobody-has-to-maintain-by-hand\u002F",[1749,1812],"strategy",[1797,1761,1814],"active-directory",[1747],{"doc":1754,"posts":1817},[],1790052514056]