【问题标题】:NVMeOF/RDMA sync file modificationsNVMeOF/RDMA 同步文件修改
【发布时间】:2021-11-29 21:16:15
【问题描述】:
我只是设置了 NVMeOF/RDMA 环境来玩。我有一个目标节点,一些客户端节点可以访问 NVMe SSD。但是,当我在一个客户端节点上删除一个文件说test时,其余节点看不到此操作,仍然可以正常读取test的内容。我知道 RDMA 绕过内核,所以我猜这是因为缓存?然后我尝试使用这些命令清理缓存:
sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
sudo sync; echo 1 | sudo tee /proc/sys/vm/drop_caches
sudo sync; echo 2 | sudo tee /proc/sys/vm/drop_caches
不幸的是,其他节点仍然保留此文件。
所以实际上我有两个问题:
- 是否完全是由于缓存?它是如何工作的?
- 什么是清理缓存的正确方法,以便其他节点可以看到删除而无需重新挂载?
任何帮助将不胜感激!
【问题讨论】:
标签:
caching
operating-system
solid-state-drive
rdma
nvme
【解决方案1】:
NVMeoF(使用 RDMA 或任何其他传输)是块级存储协议,而不是文件级存储协议。因此,无法保证 NVMeoF 系统中跨节点的文件操作的原子性。即使一个节点删除了一个文件,也不能保证:
- 删除操作实际上被翻译为块擦除操作并发送到存储服务器;
- 即使存储服务器删除了这些块,也不能保证已经缓存了这些数据的其他客户端不会继续读取它。此外,另一个客户端可以覆盖已删除的文件。
总的来说,我认为要在文件级别有任何保证,您应该考虑分布式文件系统,而不是 NVMeoF。
清理缓存的正确方法是什么,以便其他节点可以看到删除而无需重新挂载?
没有好办法。刷新所有节点上的缓存,然后才读取可能有效,但这取决于文件系统。
【解决方案2】:
相对简短的回答
就像 Boris 所说,您不想这样做(存储的分布式一致性是一个困难问题),并且您需要其他东西来做您想做的事情。刷新缓存可能不起作用,因为您有多个不同的系统视图 + 缓存行为
更长的答案:
正如 Boris 所提到的,NVMeoF 是一个 block 协议。这意味着在广泛的层面上(有些挥手)它所能做的就是在特定地址读取和写入块。在实践中,我们通常在 NVMe/NVMeoF 通信层之上有层,例如处理这种抽象的文件系统。
我现在无法判断您是使用文件系统还是直接读取/写入设备,但无论哪种情况,您至少部分正确地认为页面缓存可能会妨碍您,即使使用 RDMA。
现在,如果您在客户端节点上使用本地文件系统,您很快就会得到不一致的视图。文件系统(以及整个操作系统及其对页面缓存和块存储状态的视图)不知道其他任何人写了什么。因此,即使您在一个客户端上编写和同步,您也可能必须绕过另一个客户端上的页面缓存(例如,使用 O_DIRECT 读取,它们具有自己的复杂性集)并确保您的目标最终指向相同的 阻止从您的其他客户端写入 NVMe 目标的地址。
理论上,如果所有内容都正确排列,这将允许您读取另一个写入的数据,但实际上这可能会导致混乱,特别是如果一个客户端上的文件系统或应用程序在某个位置写入内容,而另一个客户端尝试在不知不觉中读取或写入该位置。现在您遇到了一致性问题。