当前位置:  开发笔记 > 后端 > 正文

在Mac OS X Snow Leopard上执行磁盘I/O时,C程序坚持不间断等待

如何解决《在MacOSXSnowLeopard上执行磁盘I/O时,C程序坚持不间断等待》经验,为你挑选了1个好方法。

一行背景:我是Redis的开发者,一个NoSQL数据库.我正在实现的一个新功能是虚拟内存,因为Redis将所有数据都存储在内存中.由于VM Redis能够将很少使用的对象从内存传输到磁盘,因此有很多原因可以解释为什么这样做比让OS为我们进行交换工作要好得多(redis对象是由非连续分配的许多小对象构建的)地方,当Redis序列化到磁盘时,它们占用的空间比它们所在的内存页面少10倍,等等.

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

传输的数据量非常小,类似于256字节.因此,它不应该是执行大量I/O的问题.

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

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

非常感谢您的帮助.



1> Jason Watkin..:

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

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

交换文件是否线性写入?这意味着我们要么替换现有的块,要么在末尾写一个新的块并增加一个自由空间指针?如果是这样,也许更频繁地执行更小的ftruncate调用以扩展文件将导致更短的暂停.

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

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有