延迟能力发布
Ceph MDS 服务器向客户端发布“能力”,以授予它们读取或写入特定文件的对象的权限。我添加了在文件关闭后延迟发布能力的功能,因为许多工作负载会快速重新打开相同的文件。在这种情况下,我们可以重用现有的能力(并由元数据租约保证我们正确解析了路径名到正确的 inode),而无需额外的 MDS 交互。这对于 find 来说是一个巨大的胜利,find 的访问模式在退出目录时非常奇特
open("..", O_RDONLY|O_NOFOLLOW) = 4 fchdir(4) = 0 close(4) = 0 open("..", O_RDONLY|O_NOFOLLOW) = 4 fchdir(4) = 0 close(4) = 0 fchdir(3) = 0 open(".", O_RDONLY|O_NOFOLLOW) = 4 fchdir(4) = 0 close(4) = 0 close(1) = 0
显式打开操作几乎使 MDS 操作的数量翻倍。在添加延迟能力发布后,工作负载(从 MDS 的角度来看)现在看起来很整洁
mds0 <== client0 ==== client_request(client0.22 open /a) ==== mds0 <== client0 ==== client_request(client0.23 readdir #10000000000) ==== mds0 <== client0 ==== client_request(client0.24 open /a/b) ==== mds0 <== client0 ==== client_request(client0.25 readdir #10000000001) ==== mds0 <== client0 ==== client_request(client0.26 open /a/b/c) ==== mds0 <== client0 ==== client_request(client0.27 readdir #10000000002) ==== mds0 <== client0 ==== client_request(client0.28 open /a/b/d) ==== mds0 <== client0 ==== client_request(client0.29 readdir #10000000003) ==== mds0 <== client0 ==== client_request(client0.30 open /a/e) ==== mds0 <== client0 ==== client_request(client0.31 readdir #10000000004) ==== mds0 <== client0 ==== client_file_caps(ack ino 10000000000 seq 2 caps [ ] wanted[ ] size 0/0) ==== mds0 <== client0 ==== client_file_caps(ack ino 10000000001 seq 2 caps [ ] wanted[ ] size 0/0) ==== mds0 <== client0 ==== client_file_caps(ack ino 10000000002 seq 2 caps [ ] wanted[ ] size 0/0) ==== mds0 <== client0 ==== client_file_caps(ack ino 10000000003 seq 2 caps [ ] wanted[ ] size 0/0) ==== mds0 <== client0 ==== client_file_caps(ack ino 10000000004 seq 2 caps [ ] wanted[ ] size 0/0) ====
..其中最后 5 条消息在几秒钟后发布能力。
