由于redis是一个大缓冲区,内核不需要为redis缓存缓冲区。
为什么不使用Direct IO?
最佳答案
直接 I/O 不是一个好的选择,原因如下:
对于 AOF,我们需要将写入操作与 fsync 操作分离,因为它们可能不在同一线程中发生。当您使用直接 IO 时,您不能这样做。
对于 AOF 重写和 RDB,使用 stdio(缓冲 IO),因为写入了很多小对象。我不认为你可以将 O_DIRECT 与 stdio 一起使用( O_DIRECT 有附加约束......)。要使用直接 IO,我们必须在低级 API 之上编写我们自己的缓冲系统。
O_DIRECT 并非对所有文件系统都可用,而且不可移植。
有时缓冲区缓存实际上很有用。例如,当一个 slave 连接到一个 master 时,它会请求一个 RDB 转储,然后读取这个转储。如果没有缓冲区缓存,此操作将产生两倍的 I/O。
转储文件通常比内存中的数据小得多。在很多情况下,您的收获并没有您想象的那么多。
虽然 O_DIRECT 可能不是 Redis 的好解决方案,但在某些情况下使用带有 POSIX_FADV_DONTNEED 选项的 posix_fadvise 可能会有用。过去,我为 RDB 转储玩过一个简单的实现。
关于caching - 为什么redis不使用Direct IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326864/