缓存已注册的内存

SAN 服务提供商可以缓存为本地或远程访问公开的 RDMA 缓冲区,以提高性能。

缓存为本地访问公开的 RDMA 缓冲区

Windows 套接字交换机代表应用程序调用 SAN 服务提供商的 WSPRegisterMemory 扩展函数,以注册所有数据缓冲区,这些数据缓冲区在调用 WSPRdmaRead 扩展函数时充当本地接收 RDMA 缓冲区,或者在调用 WSPRdmaWrite 扩展函数时注册本地 RDMA 源。 在此注册过程中,SAN 服务提供商必须将这些缓冲区锁定到物理内存区域,并将其注册到 SAN NIC。 这两种操作都是资源密集型操作。 因此,SAN 服务提供商应使用缓存来减少这些注册的开销。 如果 SAN 服务提供程序使用缓存,则重复使用缓冲区进行数据传输的应用程序的性能会提高。

SAN 服务提供商应缓存并释放为本地访问公开的 RDMA 缓冲区,如以下列表所述:

  1. 当交换机调用 WSPDeregisterMemory 扩展函数来释放缓冲区时,SAN 服务提供商应保留向 SAN NIC 注册的缓冲区,并锁定到物理内存区域。 SAN 服务提供程序还应将缓冲区添加到已注册缓冲区的缓存中,以防缓冲区在后续 RDMA 操作中再次使用,并按下一个列表项中所述安全地拥有缓冲区。

  2. SAN 服务提供商根据虚拟地址缓存内存注册。 当 SAN 服务提供商缓存缓冲区的注册时,SAN 服务提供商的代理驱动程序必须调用 MmSecureVirtualMemory 函数来保护该已注册缓冲区的所有权,以便操作系统在缓冲区 (释放缓冲区时通知交换机,例如,如果应用程序调用 VirtualFree 函数以将虚拟地址范围释放回操作系统) 。

  3. 当交换机随后调用 WSPRegisterMemory 来注册缓冲区时,SAN 服务提供商应检查其缓存,以确定缓冲区是否已注册。 如果 SAN 服务提供商在其缓存中找到缓冲区,则 SAN 服务提供商不应执行任何进一步的注册操作。

  4. 在随后更改已注册缓冲区的虚拟到物理映射之前,交换机会调用每个 SAN 服务提供商的 WSPMemoryRegistrationCacheCallback 扩展函数。 反过来,每个 SAN 服务提供商的代理驱动程序必须调用 MmUnsecureVirtualMemory 函数来释放缓冲区的所有权。 此外,每个 SAN 服务提供程序都必须从其缓存中删除缓冲区,并且必须从 SAN NIC 中删除缓冲区注册。

  5. 在本地 SAN 套接字与远程对等方之间的连接关闭之前,SAN 服务提供商应释放所有缓存的缓冲区。

注意 代理驱动程序必须围绕代码使用 try/except 机制,该机制访问通过调用 MmSecureVirtualMemory 保护的用户模式缓冲区,以防止操作系统崩溃。 有关代理驱动程序如何保护和释放缓冲区的详细信息,请参阅 保护和释放虚拟地址的所有权

缓存为远程访问公开的 RDMA 缓冲区

Windows 套接字交换机调用 SAN 服务提供商的 WSPRegisterRdmaMemory 扩展函数来注册作为远程 WSPRdmaWrite 调用的远程 RDMA 目标或远程 WSPRdmaRead 调用的远程 RDMA 源的所有数据缓冲区。 也就是说,交换机公开这些缓冲区供远程对等方访问。 从这些缓冲区完成数据传输后,交换机会调用 SAN 服务提供商的 WSPDeregisterRdmaMemory 扩展函数来释放这些缓冲区,以便无法再从远程对等方访问它们。

SAN 服务提供商应缓存为远程访问公开的 RDMA 缓冲区,如以下列表所述:

  1. 当 Switch 调用 WSPDeregisterRdmaMemory 来释放缓冲区时,SAN 服务提供程序应将缓冲区保留在物理内存中锁定,并在 SAN NIC 中注册。 SAN 服务提供程序还应将缓冲区添加到已注册缓冲区的缓存中,以防缓冲区在后续 RDMA 操作中再次使用。 但是,SAN 服务提供程序应采取适当的操作,以确保远程对等方无法再访问缓冲区。 注意 如果只有从 SAN NIC 中删除缓冲区注册的 SAN 服务提供商才能访问缓冲区,则 SAN 服务提供商必须这样做。 但是,SAN 服务提供商应将缓冲区锁定到物理内存区域。 此方案不提供可能的最佳性能,但优于没有缓存。

  2. 若要缓存为远程访问公开的 RDMA 缓冲区,SAN 服务提供程序及其代理驱动程序应使用缓存技术,如前面为本地访问公开的 RDMA 缓冲区列表中所述。

  3. 当交换机随后调用 WSPRegisterRdmaMemory 来注册缓冲区时,SAN 服务提供商应检查其缓存,以确定缓冲区是否已注册。 如果 SAN 服务提供商在其缓存中找到缓冲区,则 SAN 服务提供商应仅公开缓冲区以供远程访问,无需执行进一步的注册操作。 但是,如果以前从 SAN NIC 中删除了缓冲区注册,则 SAN 服务提供商应再次注册缓冲区。

  4. 若要释放为远程访问公开的 RDMA 缓冲区,SAN 服务提供商及其代理驱动程序应使用上述列表中所述的技术。