Oplock と SMB2 プロトコル機能のリース (パート 1)

序章

複数のオペレーティング システム間でファイルを共有する場合、多くの場合、ネットワーク ファイル共有プロトコルを使用する必要があります。一般的なプロトコルは、エンタープライズ レベルのファイル ストレージ システムの標準アクセスでもある NFS (ネットワーク ファイル システム) プロトコルと SMB (サーバー メッセージ ブロック) プロトコルです。 .プロトコル。簡単に言うと、NFS は主に UNIX および UNIX 系 (Linux など) オペレーティング システム環境でのファイル共有に使用され、SMB は主に Windows オペレーティング システム環境でのファイル共有に使用されます。どちらのプロトコルも数十年の歴史があり、現在に至るまでプロトコル自体が豊富な機能を備えています。

この記事では主にSMB2 プロトコルの oplock とリース機能について説明し、それらが何であるかについて紹介します。二人の関係は何ですか?どのような問題を解決するために使用されますか? そして、さまざまなシナリオでどのように機能するのでしょうか?

SMB の概要

サーバー メッセージ ブロック (SMB) プロトコルは、C/S アーキテクチャを採用したリモート ファイル アクセス プロトコルで、元々は IBM によって策定され、その後 Microsoft によって主に開発され、Windows シリーズで最もよく使用されているプロトコルの 1 つです。システム。SMB の簡単な開発の歴史は次のとおりです。

SMB プロトコル バージョン 2 および 3 (以下、総称して「SMB2 プロトコル」と呼びます) は、元の SMB プロトコルの拡張であることに注意してください。この拡張機能では大幅な調整が行われており、一方ではプロトコル コマンドの数が簡素化され、他方では、主にセキュリティの強化とパフォーマンスの向上という 2 つのテーマを中心に設計された多くの新機能が提供されています。簡単な背景情報を踏まえて、今日の主役である SMB2 プロトコルの oplock およびリース機能を紹介しましょう。

Oplock とリースの概要

まず、Microsoft プロトコル文書の定義を見てみましょう。

Oplock の定義

翻訳:

Oplock: クライアントが一貫した方法でキャッシュ ポリシーを動的に変更して、パフォーマンスを向上させ、ネットワーク使用量を削減できるメカニズム。クライアントがファイル データをローカルにキャッシュし、ネットワーク パケットの送受信の必要性を軽減または排除できる場合、リモート ファイル操作のネットワーク パフォーマンスが向上する可能性があります。たとえば、他のプロセスがデータにアクセスしていないことがわかっている場合、クライアントはリモート サーバー上のファイルに情報をすぐに書き込む必要がない場合があります。同様に、クライアントは、他のプロセスがリモート ファイルに書き込んでいないことがわかっている場合、リモート ファイルから読み取られた先読みデータをキャッシュできます。

リースの定義

翻訳:

リース: クライアントが一貫した方法でキャッシュ ポリシーを動的に変更して、パフォーマンスを向上させ、ネットワーク使用量を削減できるメカニズム...ここで翻訳すると、注意深い読者は、これが oplock の最初の翻訳とまったく同じであることに気づくかもしれません。そうです。英語の原文は同じなので、これらはすべてクライアント側のキャッシュ メカニズムですが、具体的な実装は異なります。

理解を容易にするために、いくつかの比較項目を通じて 2 つの類似点と相違点を以下に紹介します。

Oplock とリースの関係

結論は:

  • Oplock とリースはどちらもクライアント側のキャッシュ メカニズムです。

  • Oplock は SMB 2.0 プロトコル以前のクライアント キャッシュ メカニズム、リースは SMB 2.1 プロトコル以降のクライアント キャッシュ メカニズムであり、プロトコル バージョンの合意後は、どちらか 1 つだけを使用できます。同じバージョンで同時に使用されます。

  • リースと Oplock の目的は同じで、どちらもネットワーク ファイル操作のパフォーマンスを向上させることです。2 つの動作原理も似ていますが、リースのタイプはよりきめ細かく (次の内容を参照)、組み合わせて使用​​できるため、クライアント キャッシュの柔軟性が向上し、SMB プロトコルのパフォーマンスがさらに向上します。 oplockに基づいています。

  • Oplock モデルはファイル ハンドルに基づいていますが、リース モデルはクライアントによって生成されたリース キーに基づいています。簡単に言えば、違いは、同じクライアントが同じファイルの異なるハンドルを開くと、クライアントの oplock がトリガーされることです。ステータスが変更されますが、同じ場合、リース キーが同じであれば、リース ステータスは影響を受けません。

Oplock とリースのタイプ

リースには、読み取りキャッシュ、書き込みキャッシュ、ハンドル キャッシュという 3 つの基本タイプが含まれています。有効化と無効化を同時に行うことができます。

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

https://docs.microsoft.com/en-us/archive/blogs/openspecification/client-caching-features-oplock-vs-lease

[3] 深入SMB2协议之oplock vs lease

https://www.jianshu.com/p/fc6cd66a7a43

[4] SMB v2.1

https://www.snia.org/sites/default/orig/sdc_archives/2009_presentations/tuesday/DavidKruse_SMBv21.pdf

[5] SMB 2.2 Advancements for WAN

https://www.snia.org/sites/default/orig/SDC2011/presentations/tuesday/MollyBrownMatthewGeorge_SMB-2-2_WAN_v4.pdf

おすすめ

転載: blog.csdn.net/liuben/article/details/128886866