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