我有一个共享存储,它安装在 SERVER1 上(只读),并且安装在 SERVER2 上(读写)。
SERVER2 正在将数据写入文件。SERVER1 正在从该文件读取数据。
文件轮询时间<100ms,速度很快,但我们只能说这是必要的。
SERVER1 正在访问文件系统缓存,但文件中未显示新数据。我可以使用 drop_caches 返回该文件中的最新数据,但此过程会删除 SERVER1 上的所有文件缓存,这不是我想要的,而且处理时间太长。
我尝试使用 cat 命令以及 dd if=/path/to/file -iflag=direct,但这些命令都不起作用。它返回错误。文件似乎不支持该标志。有没有关于如何直接从磁盘读取文件或如何禁用文件/目录/挂载点的文件系统缓存的想法?
我也会考虑在系统范围内禁用文件缓存,但这不是我的首选,这只适用于一个文件。Google 也没有提供执行此操作的方法,因为大多数论坛帖子都反对这种操作。
谢谢!
答案1
不要这样做。我再说一遍:不要这样做!
您将因此而感到头疼。如果元数据在此期间发生变化,则可能导致崩溃和/或返回无效数据。这些文件系统并非设计为这样工作的。请勿以这种方式使用它们。对于 ZFS 来说,这尤其糟糕。如果您真的必须这样做,请使用非常基本的、没有日志和高级功能的东西(例如 ext2 或 vfat)。
要么使用集群文件系统(gfs、ocfs、cxfs),要么使用某些网络文件系统(glusterfs、cifs、nfs)。
顺便说一下。DirectIO 是未实现在 Linux 上的 ZFS 中。它将在基本文件系统(ext{2,3,4}、xfs 等)上工作。