Diagnose SMB Performance and Multichannel Bottlenecks
Slow file copies can come from client storage, server storage, CPU, network paths, or the workload’s file layout. This guide investigates SMB on Windows Server 2019, 2022, and 2025 using measured transfers and negotiated connection state. It treats Multichannel as one part of the path rather than assuming every slow transfer needs another NIC.
Define the Workload and Record Both Endpoints
BaselineRecord the client and server builds, share name, file sizes, file count, direction, concurrency, and whether the application opens many small files or transfers a few large ones. Use a direct server path for the initial test so DFS referrals or name aliases do not obscure the endpoint. A single large-file copy and a small-file workload have different limits; keep the data set unchanged when comparing runs.
# Run locally on client and server.Get-CimInstance Win32_OperatingSystem | Select-Object CSName, Caption, Version, BuildNumberGet-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeedGet-Volume | Select-Object DriveLetter, HealthStatus, SizeRemaining, Size# On the client:Resolve-DnsName FILE01.contoso.comTest-NetConnection FILE01.contoso.com -Port 445❯ What to Verify
The measured server is FILE01, TCP 445 is reachable, and both endpointbuilds, NIC speeds, storage volumes, and workload properties are recorded.Inspect the Negotiated SMB Connection
ProtocolOpen the approved share from the client, then inspect the actual connection. Check the negotiated dialect, encryption state, and authenticated user. Inspect the configuration on the respective endpoints, but distinguish a configured preference from a negotiated connection property. An empty connection list can simply mean there is no open SMB session yet; do not infer a protocol failure from that result.
# Client: access the approved share first.Get-ChildItem '\\FILE01.contoso.com\Bench' | Select-Object -First 5Get-SmbConnection | Where-Object ServerName -Match '^FILE01' | Format-List *Get-SmbClientConfiguration | Select-Object EnableMultiChannel, RequireSecuritySignature
# Server:Get-SmbServerConfiguration | Select-Object EnableMultiChannel, RequireSecuritySignature, EncryptDataGet-SmbShare -Name Bench | Select-Object Name, Path, EncryptData❯ What to Verify
Dialect and security state are recorded for the live connection.Configuration is checked on the correct endpoint, with no policy changes.Find the Paths Multichannel Actually Selected
Network SelectionSMB Multichannel can use multiple network connections where endpoint capabilities and policy allow it. Inspect selected and unselected interface pairs, their addresses, and RSS/RDMA capabilities. Compare these with the intended client/server networks. Multiple channels do not guarantee proportional speed: a single RSS-capable adapter can use multiple channels, and slow storage or CPU can cap throughput. An RDMA-capable NIC also needs a correctly configured, supported end-to-end fabric for SMB Direct.
# Client, while an SMB session/transfer is active:Get-SmbMultichannelConnection -ServerName FILE01.contoso.com ` -IncludeNotSelected | Format-List *Get-SmbClientNetworkInterface | Format-Table -AutoSize
# Server:Get-SmbServerNetworkInterface | Format-Table -AutoSize❯ What to Verify
Selected channel pairs use the intended addresses and interface capabilities.Unselected pairs are investigated against policy, reachability, and NIC support.Correlate NIC Errors, Routes, and Interface Configuration
Path HealthRead NIC statistics before and after the transfer. Rising discard/error counts are more useful than lifetime totals. Inspect RSS and RDMA support without changing them, and verify the route to each selected server address. Resolve unexpected path choices before changing adapter settings. Driver counter meanings vary, so compare suspicious values with the hardware vendor’s documentation and switch-port telemetry.
Get-NetAdapterStatistics | Format-List *Get-NetAdapterRss | Format-List *Get-NetAdapterRdma | Format-List *# Replace with a server address selected in Step 3.Find-NetRoute -RemoteIPAddress '10.20.0.20'Get-NetIPConfiguration# Repeat NIC statistics after the same bounded workload.❯ What to Verify
Route/source interface selection agrees with the intended SMB network.Error and discard deltas are compared with the transfer interval.Measure CPU, Storage, and SMB Counters Together
BottleneckCollect counters on both endpoints while reproducing the slow transfer. Discover SMB counter sets locally because availability, instance names, and language differ. Compare CPU use and disk latency with network bytes and application throughput. For a server that is slow only on small files, look at metadata operations, per-file latency, and application concurrency; link speed alone is a poor predictor of that workload.
Get-Counter -ListSet '*SMB*' | Select-Object CounterSetName, PathsWithInstances
# English Windows counter paths; select equivalents on localized systems.Get-Counter -Counter @( '\Processor(_Total)\% Processor Time' '\PhysicalDisk(*)\Avg. Disk sec/Read' '\PhysicalDisk(*)\Avg. Disk sec/Write' '\Network Interface(*)\Bytes Total/sec') -SampleInterval 1 -MaxSamples 15❯ What to Verify
The same interval includes client/server CPU, storage latency, network activity,and workload throughput. No single universal disk-latency threshold is assumed.Run a Repeatable Copy Without Deletion Flags
Controlled TestFor one approved large file, use unbuffered Robocopy I/O and disable retries so a failed connection does not become a long test. First list the operation with /L. Use a new destination directory for each run; otherwise a skipped file can look like a fast copy. Save the exit code immediately: values 8 or higher indicate copy failures, while lower values encode outcomes such as copied or extra files. Measure from the copy summary and correlate with Step 5.
$source = 'C:\BenchSource'$destination = '\\FILE01.contoso.com\Bench\Run01' # New approved directoryif (-not (Test-Path -LiteralPath "$source\test-data.bin" -PathType Leaf)) { throw 'The approved source file is missing.'}if (Test-Path -LiteralPath $destination) { throw 'Choose a new destination directory for this test.'}
robocopy $source $destination test-data.bin /L /J /R:0 /W:0 /NP# After reviewing the listing and capacity, perform the approved copy:robocopy $source $destination test-data.bin /J /R:0 /W:0 /NP$copyExitCode = $LASTEXITCODE"Robocopy exit code: $copyExitCode"if ($copyExitCode -ge 8) { Write-Warning 'Copy failed; inspect the summary.' }❯ What to Verify
The intended file is copied once to the new test directory.Bytes, duration, failures, and exit code are retained alongside endpoint counters.Choose a Repair Based on the Limiting Resource
RemediationUse the evidence to assign the repair: stale or unreachable channel addresses to networking; rising NIC errors to the driver/fabric owner; high storage latency to the storage owner; CPU saturation under signing/encryption to capacity and supported-version review. If Multichannel is configured off, investigate why before enabling it. Make one canary change with a recorded baseline and rollback. Do not disconnect every SMB session or update every NIC during a live incident.
# Client: retain events around the test window.Get-WinEvent -FilterHashtable @{ LogName = 'Microsoft-Windows-SMBClient/Connectivity' StartTime = (Get-Date).AddMinutes(-30)} -MaxEvents 50 | Select-Object TimeCreated, Id, Message
# Server: inspect current sessions instead of terminating them.Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens❯ What to Verify
The proposed repair addresses a measured path, CPU, storage, or workload limit.Its owner, canary scope, original settings, and rollback are recorded.Validate Performance and Application Behavior
CloseoutRepeat the same test with a new destination and the same concurrency. Reinspect negotiated security, selected channels, NIC deltas, storage latency, and CPU. Then test the original application; a faster bulk copy does not establish that small-file or metadata operations improved. Remove only the test directory through the share owner’s approved cleanup process, and retain enough evidence to reproduce the comparison after the next driver or OS update.
Get-SmbConnection | Where-Object ServerName -Match '^FILE01' | Format-List *Get-SmbMultichannelConnection -ServerName FILE01.contoso.com | Format-List *Get-NetAdapterStatistics | Format-List *# Repeat Steps 5-6 with a new destination and the original workload.❯ What to Verify
Measured throughput or latency improves without new errors or weakened security.The application's original operation also succeeds under comparable load.