SMB2协议特性之oplock与lease(上)
Posted 刘爱贵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SMB2协议特性之oplock与lease(上)相关的知识,希望对你有一定的参考价值。
引言
当我们在多个操作系统之间共享文件时,常常需要用到网络文件共享协议,常见的有NFS(Network File System)和SMB(Server Message Block)协议,它们也是企业级文件存储系统的标准访问协议。简单地说,NFS主要应用于UNIX和类UNIX(如Linux等)操作系统环境的文件共享,SMB主要应用于Windows操作系统环境的文件共享。这两个协议都有着几十年的历史,发展至今,协议本身都已具备了丰富的功能特性。
本文主要来聊一聊SMB2协议中的oplock与lease特性,介绍一下它们分别是什么?两者之间有什么关系?用来解决什么问题?以及在不同场景下是如何工作的?
SMB简介
服务器消息块(SMB)协议是一种远程文件访问协议,采用C/S架构,最初由IBM制定,后来主要由Microsoft进一步发展,是Windows系列操作系统最常用的协议之一。SMB简要的发展历史如下:
值得一提的是,SMB协议版本2和3,以下统称为“SMB2协议”,是对原来的SMB协议的扩展。这个扩展是做了重大调整的,一方面精简了协议命令数量,另一方面提供了许多新特性,主要都是围绕增强安全和提高性能两个主题而设计。有了简要的背景信息,接下来介绍今天的主角,SMB2协议的oplock与lease特性。
Oplock与lease简介
我们先来看看Microsoft协议文档中的定义:
Oplock定义
译文:
Oplock:一种允许客户端以一致的方式动态改变缓存策略的机制,以提高性能并减少网络使用。如果客户端可以在本地缓存文件数据,从而减少或消除发送和接收网络数据包的需要,那么远程文件操作的网络性能可能会提高。例如,如果客户端知道没有其他进程正在访问数据,则客户端可能不需要将信息立即写入远程服务器上的文件。同样,如果客户端知道没有其他进程正在向远程文件写入数据,则客户端可以缓存从远程文件读取的预读数据。
Lease定义
译文:
Lease:一种允许客户端以一致的方式动态改变缓存策略的机制,以提高性能并减少网络使用……翻译到这里,细心的读者可能会发现,这与oplock的第一句翻译是一模一样的。没错,因为英文原文就是一样的,它们都是客户端缓存机制,只是具体实现不同而已。
为了便于理解,下面通过一些对比项来介绍两者的异同。
Oplock与lease关系
总结一下:
Oplock和lease都是一种客户端缓存机制。
Oplock是SMB 2.0协议及以前的客户端缓存机制,而lease是SMB 2.1协议及之后的客户端缓存机制,协议版本商定后,只能使用其中一种,即在同一个版本下不能同时使用。
Lease和Oplock的目的相同,都是为了提高网络文件操作的性能。两者工作原理也类似,但是lease的类型划分粒度更细(参见后面内容),并可以组合使用,为客户端缓存提供了更大的灵活性,在oplock基础上进一步提高了SMB协议性能。
Oplock模型基于文件句柄,而lease模型基于客户端生成的lease key,简单来说,区别在于同一个客户端打开的同一个文件的不同句柄时,会触发该客户端的oplock状态变化,但是同样情况下,如果lease key是相同的,则lease状态不会受到影响。
Oplock与lease类型
Lease包含三种基本类型:read caching、write caching和handle caching。可以同时启用和禁止。
Oplock/lease break
如果一份数据在不同的客户端进行了缓存,那么就需要处理缓存一致性问题。SMB2协议也不例外,根据oplock和lease的定义,我们知道客户端缓存策略会动态变化,当触发变化时,称为发生了oplock/lease break,而它就是用来保证多客户端缓存一致性的。下面给出相关命令的简要说明:
Oplock/lease break notification
一种由SMB2协议服务器发送给SMB2协议客户端的主动请求,以通知客户端更改文件的oplock/lease状态。
Oplock/lease break acknowledgment(可选的)
客户端发送SMB2 oplock/Lease Break Acknowledgment报文是为了响应服务器发送的SMB2 oplock/Lease Break Notification报文。
Oplock/lease break response(可选的)
Oplock Break Response报文是服务器响应客户端发送的Oplock Break Acknowledgment报文。
当发生oplock/lease break时,服务端与客户端会通过以上命令进行信息同步,使得客户端及时调整缓存策略,从而可以避免出现多客户端访问到不一致数据的问题。
工作原理
由于习惯问题,lease有时也被称作oplock,可以理解为增强版的oplock。随着SMB协议的发展,当前和以后应用主要都是以lease机制为主。接下来主要介绍lease的工作原理。
Lease申请与授予
根据SMB2协议文档,客户端通过SMB2 CREATE请求(可以是创建不存在的文件,也可以是打开已存在文件)携带的申请的lease类型(参见前面内容)。
服务端通过SMB2 CREATE响应返回给客户端授予它的实际的lease类型,这里实际授予的lease类型有可能与申请的lease类型不一致,取决于当前操作的文件是被一个客户端独占访问,还是被多个客户端共享访问。
R lease原理
以R lease为例分析,省略了lease请求与授予的过程,如图所示,当应用程序在第一次读取服务器端的数据后会将数据保留在客户端的缓存当中,以便于应用随后对于此数据的再次使用。并且,考虑到顺序局部性,被缓存的数据通常是多个页的大小而并非仅仅是应用所请求的那一部分。借此以提高应用程序的后续请求的读性能(建立在顺序局部性的基础之上),通常我们称这种行为为预读。
RW lease原理
以RW lease为例分析,同样省略lease请求与授予的过程,和传统操作系统的内存管理策略近似,当应用程序写文件时,以回写(write back)的方式现将数据写到缓存当中,再在适当的时机(通过Close Request等触发)将缓存数据同步到服务器端,从而显著提高写文件性能。
RWH lease原理
以单客户端读写为例,说明RWH lease原理:
1、客户端以读写方式打开文件f,并请求RWH lease。(第一次打开文件f)
2、服务端判断是否有lease冲突后,没有冲突则授予客户端对该文件的RWH lease,返回文件句柄fh1。
3、客户端通过fh1向服务端发送读数据请求。
4、服务端应答返回客户端读数据请求。
5、客户端将读取的数据存入缓存,同时返回给应用程序。
6、客户端再次通过fh1向服务端发起读请求(假设本次请求的数据是上一次的读请求数据的子集)。
7、由于持有RWH lease,优先检查客户端缓存,则会发现读请求命中缓存,直接读取缓存数据返回给应用程序,不需要发到服务端。
8、客户端以只读方式再次打开文件f。(第二次打开文件f)
9、服务端判断是否是同一个客户端的请求,如果是,则不打破其已有lease状态,返回文件句柄fh2。
10、客户端再次通过fh2向服务端发起读请求(假设请求的数据包含在之前的缓存数据中)。
11、客户端缓存命中,直接返回给应用,不需要发到服务端。
12、客户端通过fh1向服务端发起写请求。
13、由于持有RWH lease,优先写入客户端缓存,返回写入成功。
顺便提一下,对于上述过程,如果是oplock,则在第8步后,授予的batch oplock会被打破(即发生了oplock break,感兴趣的读者可以思考下为什么),为了保证缓存一致性,客户端缓存的数据需要同步到服务端,并且第8步之后的读写请求都要通过网络发送到服务端来处理,从而降低了性能。这是lease相对于oplock的一个优化点。
总结与展望
本文简要介绍了SMB2协议中的oplock与lease特性,包括两者的定义、联系与区别、lease的工作原理。实际上关于oplock和lease还有很多细节值得进一步研究,本文简单的介绍只是抛砖引玉,期望能激发更多读者的思考与讨论。
另外,对于对SMB2协议不熟悉的读者来说,本文偏向于介绍协议相关概念术语以及基本原理阐述,理解起来可能不够生动形象。但是没有关系,让“概念和原理”先飞会儿,下篇文章我们将通过具体应用场景,结合抓取的客户端与服务端网络通信数据包,为大家详细分析一下lease在实际场景中是如何运作的,同时如果读者对于lease能带来多大的性能提升感兴趣,那么敬请期待本系列文章的下一篇吧。
参考资料:
[1] [MS-SMB2].pdf
https://msdn.microsoft.com/en-us/library/cc246482(PROT.13).aspx
[2] client caching features oplock vs lease
[3] 深入SMB2协议之oplock vs lease
https://www.jianshu.com/p/fc6cd66a7a43
[4] SMB v2.1
[5] SMB 2.2 Advancements for WAN
以上是关于SMB2协议特性之oplock与lease(上)的主要内容,如果未能解决你的问题,请参考以下文章