|
楼主 |
发表于 2005-5-13 22:55:06
|
显示全部楼层
文件系统缓存是可以绕开的,只需在打开文件时用O_DIRECT标志:
#define _GNU_SOURCE
int fd = open("filename", O_RDONLY | O_DIRECT);
但是在读写的时候,缓冲区,传输长度,以及文件偏移三个量都必须是页面对齐(2.6内核只要求512字节对齐),所以使用起来比较麻烦。在这种方式下,文件系统直接把数据从磁盘传到用户空间,不通过内核空间交换。一般情况下这么做会使IO性能降低,文件系统没有了cache。但是,在一些特殊的应用下,性能会提高,例如你要自己组织cache。
图3.4是让我最疑惑的,为什么cache越大性能越低?现在搞清楚了,是由于内存碎片引起的。由为我使用了变长的cache块,频繁的申请和释放内存之后,物理内存产生大量碎片,因此当我再申请大块内存的时候,找不到连续的空间,某些页面被换到外存使得磁盘访问的开消增大。
我又在一台16GB内存的机器上做了一次实验,此时不用担心页面被换出,可以看到当cache增大时,性能有一定的提高,但也不明显,说明文件系统的cache很利害。
回到那台2GB的机器上,使用O_DIRECT,此时cache的作用就比较明显了。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|