SMB 文件服务器的性能优化

SMB 配置注意事项

确保根据需要调整 BIOS 和操作系统的电源管理模式,这可能包括高性能模式或修改的 C 状态。 在配置任何服务器消息块 (SMB) 优化之前,请确保安装最新的、最具弹性且最快的存储和网络设备驱动程序。

不要启用文件服务器和客户端不需要的任何服务或功能。 请考虑禁用不必要的服务或功能,例如:

  • 客户端缓存
  • 文件系统微型筛选器
  • 防火墙筛选器
  • IPSEC
  • NTFS 压缩
  • NTFS 加密
  • 计划任务
  • 搜索服务
  • SMB 加密
  • SMB 签名
  • Teredo

复制文件是在文件服务器上执行的常见作。 Windows Server 具有多个内置文件复制实用工具,你可以使用命令提示符运行。 对于这些操作,建议使用 Robocopy。 Windows Server 2008 R2 引入了 /mt Robocopy 选项,在复制多个小文件时使用多个线程显著提高远程文件传输的速度。 我们还建议使用此选项 /log 通过将日志重定向到 NUL 设备或文件来减少控制台输出。 使用 xcopy时,建议将 /q/k 选项添加到现有参数。 前一个选项通过减少控制台输出来减少 CPU 开销,后者可减少网络流量。

SMB 性能优化

文件服务器性能和可用优化取决于在每个客户端和服务器之间协商的 SMB 协议,以及部署的文件服务器功能。 当前可用的最高协议版本是 Windows Server 2022、Windows Server 2016 和 Windows 10 中的 SMB 3.1.1。 可以通过在客户端和Get-SMBConnection服务器上使用 Windows PowerShell Get-SMBSession | FL 来检查网络上正在使用的 SMB 版本。

SMB 3.0 协议系列

SMB 3.0 在 Windows Server 2012 中引入,并在 Windows Server 2012 R2(SMB 3.02)和 Windows Server 2016(SMB 3.1.1)中进一步增强。 此版本引入了可能会显著提高文件服务器性能和可用性的技术。 有关详细信息,请参阅 Windows Server 2012 和 2012 R2 2012 中的 SMBSMB 3.1.1 中的新增功能

SMB 直通

SMB Direct 引入了使用 RDMA 网络接口实现高吞吐量和低延迟和 CPU 利用率低的能力。

每当 SMB 检测到支持 RDMA 的网络时,它都会自动尝试使用 RDMA 功能。 如果 SMB 客户端无法使用 RDMA 路径进行连接,则会回退到使用 TCP/IP 连接。 与 SMB Direct 兼容的所有 RDMA 接口还必须实现 TCP/IP 堆栈,并且 SMB 多通道可识别这一点。

任何 SMB 配置中都不需要 SMB 直通,但对于想要降低延迟和降低 CPU 利用率的用户,始终建议这样做。

有关 SMB 直通的详细信息,请参阅 使用 SMB Direct 提高文件服务器的性能

SMB 多通道

SMB 多通道允许文件服务器同时使用多个网络连接,并提供更高的吞吐量。

有关 SMB 多通道的详细信息,请参阅 部署 SMB 多通道

SMB Scale-Out

SMB 横向扩展允许群集配置中的 SMB 3.0 在群集的所有节点中显示共享。 通过此活动/主动配置,可以进一步缩放文件服务器群集,而无需使用具有多个卷、共享和群集资源的复杂配置。 最大共享带宽是所有文件服务器群集节点的总带宽。 总带宽不再受单个群集节点的带宽限制,而是取决于支持存储系统的功能。 你可以通过添加节点来增加总带宽。

有关 SMB 横向扩展的详细信息,请参阅 Scale-Out 应用程序数据的文件服务器概述 和博客文章 :横向扩展或不横向扩展,这就是问题

SMB 3.0 的性能计数器

Windows Server 2012 中引入了以下 SMB 性能计数器,在监视 SMB 2 及更高版本的资源使用情况时,这些计数器被视为基本计数器集。 将性能计数器记录到本地原始(.blg)性能计数器日志。 使用通配符 }收集所有实例的成本更低,然后使用 Relog.exe在后期处理期间提取特定实例。

  • SMB 客户端共享

    这些计数器显示有关使用 SMB 2.0 或更高版本的客户端访问的服务器上的文件共享的信息。

    如果你熟悉 Windows 中的常规磁盘计数器,你可能会注意到某种相似之处。 这不是偶然的。 SMB 客户端共享性能计数器旨在与磁盘计数器完全匹配。 这样,就可以轻松地重复使用当前拥有的应用程序磁盘性能优化的任何指南。 有关计数器映射的详细信息,请参阅 Per share 客户端性能计数器博客

  • SMB 服务器共享

    这些计数器显示有关服务器上的 SMB 2.0 或更高版本文件共享的信息。

  • SMB 服务器会话

    这些计数器显示有关使用 SMB 2.0 或更高版本的 SMB 服务器会话的信息。

    在服务器端(服务器共享或服务器会话)上启用计数器可能会对高 IO 工作负荷产生重大性能影响。

  • 恢复密钥筛选器

    这些计数器显示有关简历关键筛选器的信息。

  • SMB 直接连接

    这些计数器测量连接活动的不同方面。 计算机可以有多个 SMB 直接连接。 SMB 直接连接计数器将每个连接表示为一对 IP 地址和端口。 第一个 IP 地址和端口表示连接的本地终结点,第二个 IP 地址和端口表示连接的远程终结点。

  • 物理磁盘、SMB、CSV FS 性能计数器关系

    有关物理磁盘、SMB 和 CSV FS(文件系统)计数器如何相关的详细信息,请参阅以下博客文章: 群集共享卷性能计数器

优化 SMB 文件服务器的参数

以下 REG_DWORD 注册表设置可能会影响 SMB 文件服务器的性能:

  • Smb2CreditsMinSmb2CreditsMax

    HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters\Smb2CreditsMin
    
    HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters\Smb2CreditsMax
    

    对于 Windows Server,默认值分别为 512 和 8192。 这些参数允许服务器在指定的边界内动态控制客户端操作并发性。 某些客户端可能会通过更高的并发限制来实现更高的吞吐量,例如,通过高带宽、高延迟链接复制文件。 这些默认值适用于 Windows Server,不适用于 Windows。

    Tip

    在 Windows 10 和 Windows Server 2016 之前,授予客户端的额度数根据尝试根据网络延迟和信用使用量确定要授予的最佳信用额度数的算法在 Smb2CreditsMinSmb2CreditsMax 之间动态变化。 在 Windows 10 和 Windows Server 2016 中,SMB 服务器更改为在请求时无条件地授予信用,直到达到配置的最大值。 作为此项更改的一部分,取消了信用限制机制,该机制会在服务器面临内存压力时减小每个连接的信用窗口的大小。 仅当服务器内存太低(< 几 MB)以致于无用时,才会发出触发限制的内核内存不足事件。 由于服务器不再收缩信用窗口, 因此不再需要 Smb2CreditsMin 设置,现在将被忽略。

    可以监视每秒 SMB 客户端共享数/信用停止次数,以查看信用是否存在任何问题。

  • AdditionalCriticalWorkerThreads

    HKLM\System\CurrentControlSet\Control\Session Manager\Executive\AdditionalCriticalWorkerThreads
    

    默认值为 0,这意味着不会添加更多关键的内核工作线程。 此值会影响文件系统缓存用于预读和写隐藏请求的线程数。 提高此值可以在存储子系统中允许更多排队的 I/O,并且可以提高 I/O 性能,尤其是在具有许多逻辑处理器和功能强大的存储硬件的系统上。

    Note

    此设置主要适用于 Windows 7、Windows Server 2008 R2 和较旧的作系统。 在以后的作系统中,虽然缓存管理器仍然间接使用此值,但缓存管理器不会在以后的作系统中创建专用工作线程;相反,此值间接影响每种类型的工作项数(泛型辅助角色、延迟编写器等)缓存管理器将分配供以后提交到内核线程池。

    Tip

    如果缓存管理器的脏数据(性能计数器缓存\脏页)超过大约 25% 的内存,或者如果系统正在执行大量同步读取I/O,请考虑增加该值。

  • MaxThreadsPerNumaNode

    HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters\MaxThreadsPerNumaNode
    

    默认值为 20。 增加此值会增加文件服务器可用于处理并发请求的线程数。 需要为大量活动连接提供服务时,当低效的第三方筛选器驱动程序影响 IO 时,增加此值可能会提高性能。 最好安装更新的第三方筛选器驱动程序和打印驱动程序,以便更高效地处理 IO,而不是更改此设置。

    Tip

    如果 SMB2 工作队列的长度相对较大(性能计数器“服务器工作队列\队列长度\SMB2 NonBlocking *”始终超过约100),则可能需要增加该值。

    Note

    在 SMB1 和 Windows Server 2012 和 Windows Server 2008 中, MaxThreadsPerQueue 用于控制此设置。 SMB1 已弃用,不再安装,此设置本身现已失效。

  • AsynchronousCredits

    HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters\AsynchronousCredits
    

    默认值为 512。 此参数限制单个连接上允许的并发异步 SMB 命令数。 在某些情况下(例如,前端服务器连接到后端 IIS 服务器时),需要大规模的并发量(尤其是对于文件更改通知请求)。 可以增加此条目的值以支持这些情况。 默认值为 Windows Server,而不是 Windows。

  • RemoteFileDirtyPageThreshold

    HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\RemoteFileDirtyPageThreshold
    

    默认值为 5 GB。 该值决定了执行内联刷新之前缓存中用于远程写入的最大脏页数(按每个文件)。 建议不要更改此值,除非系统在大量远程写入期间遇到一致的减速。 减速情况通常会出现在客户端的存储 IO 性能比远程服务器的存储 IO 性能更快的情况。 设置更改将应用于服务器。 客户端和服务器是指分布式系统体系结构,而不是特定的作系统;例如,通过 SMB 将数据复制到另一个 Windows Server 的 Windows Server 仍涉及 SMB 客户端和 SMB 服务器。 有关详细信息,请参阅 排查缓存和内存管理器性能问题

SMB 服务器优化示例

在许多情况下,以下设置可以针对文件服务器性能优化计算机。 这些设置在所有计算机上都不是最佳或合适的。 在应用各个设置之前,应评估各个设置的影响。

Parameter Value Default
AdditionalCriticalWorkerThreads 64 0

SMB 客户端性能监视器计数器

有关 SMB 客户端计数器的详细信息,请参阅 Windows Server 2012 文件服务器提示:新的逐个共享 SMB 客户端性能计数器提供了很好的见解