0

我只是设置了 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

不幸的是,其他节点仍然保留此文件。

所以实际上我有两个问题:

  1. 真的是因为缓存吗?它是如何工作的?
  2. 清理缓存以便其他节点无需重新挂载即可看到删除的正确方法是什么?

任何帮助将不胜感激!

4

2 回答 2

0

相对简短的答案

就像鲍里斯说的那样,你不想这样做(存储的分布式一致性是一个难题),你需要别的东西来做你想做的事。刷新缓存可能不起作用,因为您有多个不同的系统视图 + 缓存行为

更长的答案:

正如 Boris 所提到的,NVMeoF 是一种协议。这意味着在广泛的层面上(有些挥手)它所能做的就是在特定地址读取和写入块。在实践中,我们通常在 NVMe/NVMeoF 通信层之上有层,例如处理这种抽象的文件系统。

我现在无法判断您是使用文件系统还是直接读取/写入设备,但无论哪种情况,您至少部分正确地认为页面缓存可能会妨碍您,即使使用 RDMA 也是如此。

现在,如果您在客户端节点上使用本地文件系统,您很快就会得到不一致的视图。文件系统(以及整个操作系统及其对页面缓存和块存储状态的视图)不知道其他人写了什么。因此,即使您在一个客户端上写入和同步,您也可能必须绕过另一个客户端上的页面缓存(例如,使用 O_DIRECT 读取,它们有自己的复杂性集)并确保您的目标最终指向相同的地址是从您的其他客户端写在 NVMe 目标上的。

从理论上讲,如果一切都正确排列,这将允许您读取另一个写入的数据,但实际上这可能会导致混淆,特别是如果一个客户端上的文件系统或应用程序在某个位置写入某些内容,而另一个客户端尝试读取或在不知不觉中写下那个位置。现在你有一个一致性问题。

于 2021-12-08T17:37:53.150 回答
0

NVMeoF(使用 RDMA 或任何其他传输)是块级存储协议,而不是文件级存储协议。因此,无法保证 NVMeoF 系统中跨节点的文件操作的原子性。即使一个节点删除了一个文件,也不能保证:

  1. 删除操作实际上被翻译为块擦除操作并发送到存储服务器;
  2. 即使存储服务器删除了这些块,也不能保证其他缓存了这些数据的客户端不会继续读取它。此外,另一个客户端可以覆盖已删除的文件。

总的来说,我认为要在文件级别有任何保证,您应该考虑分布式文件系统,而不是 NVMeoF。

清理缓存以便其他节点无需重新挂载即可看到删除的正确方法是什么?

没有好的方法可以做到这一点。刷新所有节点上的缓存,然后才读取可能有效,但这取决于文件系统。

于 2021-10-30T11:38:11.883 回答