免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7082 | 回复: 0

[其他DFS] 程序中如何禁用Linux文件预读和缓存机制 [复制链接]

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2022-04-24 20:05 |显示全部楼层
本文主要供C/C++开发人员参考,其他技术人员酌情自取。


文件预读和缓存机制在Linux下是默认开启的。对于随机读,预读机制往往会导致读放大。如果应用程序自己实现了数据缓存,通常就不再需要操作系统提供的文件内容缓存,比如数据库。


Linux下有两种方法可以禁用文件预读和文件缓存机制。


第一种方法是使用 direct IO,这种方式操作系统既不会预读,也不会启用文件缓存。调用open函数时将flags参数加上标记位O_DIRECT即可,简单直接有没有?噢,No!这只是万里长征第一步,direct IO的噩梦在于:读写buffer的内存地址、文件偏移量和读写长度都需要按设备的block size(注意:block size通常为512,不是通常为4KB的page size)对齐!对于数据读取,对齐后可能会多读出一些数据,返回对应位置和长度的数据即可。对于数据写入,如果程序天然按对齐方式写入,比如数据库,此时不需要额外处理,否则就是噩梦了。如果支持任意偏移量和长度写入,对于原地修改数据的方式,需要读出原有数据和新数据组合,然后以对齐方式写入。而对于追加写入方式,如果不做合并写的话,可能存在明显浪费硬盘空间的问题。


第二种方法是使用函数 posix_fadvise,函数原型为:int posix_fadvise(int fd, off_t offset, off_t len, int advice); 其中的参数len取值为0,表示针对整个文件。advice为POSIX_FADV_RANDOM 关闭预读机制,为POSIX_FADV_DONTNEED清除文件缓存。POSIX_FADV_RANDOM要在打开文件后立即设置(即事前设置),而POSIX_FADV_DONTNEED是清除缓存操作,在需要时调用(即事后调用),比如写完一个文件后在close之前调用。如何在事前禁用Linux的文件缓存,有知道的朋友请不吝赐教。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP