为什么redis不使用Direct IO?

时间:2013-08-20 04:14:07

标签: caching redis buffer

由于redis是一个大缓冲区,因此内核无需为redis缓存缓冲区。



为什么不使用Direct IO?

1 个答案:

答案 0 :(得分:2)

由于以下原因,直接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转储使用了一个简单的实现方法。