SMB 文件服务器的性能优化

SMB 配置注意事项

请勿启用你的文件服务器和客户端不必要的任何服务或功能。 不必要的服务或功能可能包括 SMB 签名、客户端缓存、文件系统微筛选器、搜索服务、计划任务、NTFS 加密、NTFS 压缩、IPSEC、防火墙筛选器、Teredo 或 SMB 加密。

确保根据需要设置 BIOS 和操作系统电源管理模式,其中可能包括高性能模式或更改的 C-State。 确保安装了最新、最具复原能力且速度最快的存储和网络设备驱动程序。

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

SMB 性能优化

文件服务器性能和可用优化取决于每个客户端和服务器之间协商的 SMB 协议,以及部署的文件服务器功能。 当前可用的最高协议版本是 Windows Server 2022、Windows Server 2016 和 Windows 10 中的 SMB 3.1.1。 可以通过在客户端上使用 Windows PowerShell Get-SMBConnection,在服务器上使用 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 中的 SMBSMB 3.1.1 中的新增功能

SMB 直通

SMB 直通引入了使用 RDMA 网络接口的功能,以实现高吞吐量、低延迟和低 CPU 使用率。

每当 SMB 检测到支持 RDMA 的网络时,它都会自动尝试使用 RDMA 功能。 但是,如果 SMB 客户端由于任何原因而无法使用 RDMA 路径进行连接,它会继续使用 TCP/IP 连接。 所有与 SMB 直通兼容的 RDMA 接口也需要实现 TCP/IP 堆栈,并且 SMB 多通道知道这一点。

SMB 直通在任何 SMB 配置中都不是必需的,但对于希望降低延迟和降低 CPU 使用率的用户,始终建议启用此功能。

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

SMB 多通道

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

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

SMB 横向扩展

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

有关 SMB 横向扩展的详细信息,请参阅适用于应用程序数据的横向扩展文件服务器概述和博客文章横向扩展还是不横向扩展,这是个问题

SMB 3.0 的性能计数器

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

  • SMB 客户端共享

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

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

  • 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 文件服务器的性能:

  • Smb2CreditsMin 和 Smb2CreditsMax

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

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

    提示

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

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

  • AdditionalCriticalWorkerThreads

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

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

    注意

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

    提示

    如果缓存管理器脏数据量(性能计数器“缓存\脏页”)增长而消耗大量内存(超过大约 25%),或者系统正在执行大量同步读取 I/O,则可能需要增加该值。

  • MaxThreadsPerNumaNode

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

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

    提示

    如果 SMB2 工作队列增长到非常大(性能计数器“Server Work Queues\Queue Length\SMB2 NonBlocking *”稳定高于 ~100),则表明可能需要增加该值。

    注意

    在 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

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

SMB 服务器优化示例

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

参数 默认值
AdditionalCriticalWorkerThreads 64 0

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

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