16

一条背景:我是Redis 的开发者,一个 NoSQL 数据库。我正在实现的新功能之一是虚拟内存,因为 Redis 将所有数据都存储在内存中。多亏了 VM Redis 能够将很少使用的对象从内存传输到磁盘,这比让操作系统为我们交换工作要好得多的原因有很多(redis 对象是由许多不连续分配的小对象构建的位置,当通过 Redis 序列化到磁盘时,它们占用的空间比它们所在的内存页面少 10 倍,依此类推)。

现在我有一个在 Linux 上完美运行的 alpha 实现,但在 Mac OS X Snow Leopard 上运行得不是很好。有时,当 Redis 尝试将页面从内存移动到磁盘时,redis 进程会进入几分钟的不间断等待状态。我无法对此进行调试,但这发生在对fseeko()或的调用中fwrite()。几分钟后,调用终于返回,redis 继续毫无问题地工作:没有崩溃。

传输的数据量非常小,大约 256 字节。因此,这不应该是执行大量 I/O 的问题。

但是关于作为写操作目标的交换文件有一个有趣的细节。这是一个大文件(26 GB),fopen()使用ftruncate(). 最后,文件被unlink()编辑,以便 Redis 继续引用它,但我们确信当 Redis 进程退出时,操作系统将真正释放交换文件。

好的,这就是全部,但我在这里了解更多细节。顺便说一句,您甚至可以在 Redis git 中找到实际代码,但鉴于这是一个相当复杂的系统,在五分钟内理解它并非易事。

非常感谢您的帮助。

4

5 回答 5

11

据我了解,HFS+ 对稀疏文件的支持很差。因此,您的写入可能会触发文件扩展,该文件扩展正在初始化/实现大部分文件。

例如,我知道 mmap'ing 一个新的大空文件,然后在几个随机位置写入会在磁盘上使用 HFS+ 生成一个非常大的文件。这很烦人,因为 mmap 和稀疏文件是一种非常方便的数据处理方式,几乎所有其他平台/文件系统都可以优雅地处理这个问题。

交换文件是线性写入的吗?这意味着我们要么替换现有块,要么在最后写入一个新块并增加一个可用空间指针?如果是这样,也许更频繁地进行较小的 ftruncate 调用来扩展文件会导致更短的暂停。

顺便说一句,我很好奇为什么 redis VM 不使用 mmap 然后只是移动块以试图将热块集中到热页中。

于 2010-01-07T00:34:06.950 回答
1

antirez,我不确定我会不会有多大帮助,因为我的 Apple 经验仅限于Apple ][,但我会试一试。

首先是一个问题。我会认为,对于虚拟内存,操作速度将是比磁盘空间更重要的衡量标准(尤其是对于速度是重点的 NoSQL DB,否则您会使用 SQL,不是吗?)。但是,如果你的交换文件是 26G,也许不是 :-)

有些事情要尝试(如果可能的话)。

  1. 尝试将问题实际隔离到查找或写入。我很难相信一次查找可能需要这么长时间,因为在最坏的情况下,它应该是缓冲区指针的更改。不过,我没有编写 OSX,所以我不能确定。
  2. 尝试调整交换文件的大小,看看是否是导致问题的原因。
  3. 您是否曾经动态扩展交换文件(而不是预分配)?如果你这样做,那可能就是导致问题的原因。
  4. 你总是尽可能地写在文件中吗?可能是创建一个 26G 文件实际上可能不会用数据填充它,但是,如果您创建它然后写入最后一个字节,操作系统可能必须在此之前将字节清零(延迟初始化,如果有的话)。
  5. 如果您只是预先分配整个文件(写入每个字节)而不取消链接,会发生什么?换句话说,在程序运行之间将文件保留在那里(当然,如果它不存在,则创建它)。然后在 Redis 的启动代码中,只需初始化文件(指针等)。这可能会消除上面第 4 点中的任何问题。
  6. 也可以在各种 BSD 网站上询问。我不确定Apple在幕后改变了多少,但OSX只是最低级别的BSD(Pax鸭子作为掩护)。
  7. 还可以考虑在 Apple 网站上询问(如果您还没有这样做的话)。

好吧,这是我的小贡献,希望它会有所帮助。祝你的项目好运。

于 2010-01-07T00:46:28.300 回答
0

您是否关闭了文件的文件缓存?即 fcntl(fd, F_GLOBAL_NOCACHE, 1)

于 2010-01-07T00:24:43.687 回答
0

您是否尝试过使用 DTrace 和/或 Instruments(Apple 的实验性 dtrace 前端)进行调试?

使用 DTrace 探索 Leopard

在 OS X 上调试 Chrome

于 2010-01-07T00:33:54.093 回答
-1

正如 Linus 在 Git 邮件列表中所说:

“我意识到 OS X 的人很难接受它,但 OS X 文件系统通常都是完全的垃圾——甚至比 Windows 还要糟糕。”

于 2010-01-07T00:26:21.180 回答