linux 文件打洞

13 篇文章 0 订阅


在许多文件存储场景中,时常存在文件内容的删除和更新,每当删除一些文件中内容时,会存在空间回收问题。正好最近遇到这个问题,在这里记录一下。

文件空间回收的常见解决方案

  1. 将文件中有效内容拷贝到新的文件中,删除旧的文件从而释放空间;
  2. 类比数组,将后面的数据向前移动,移动的偏移为删除的数据长度;
  3. 文件打洞。

场景分析

在一般的场景下,数据量不大(小于10G)或者数据与其他文件没有关联性,移动数据或者拷贝数据相对于文件打洞性能区别不打。如果当前的数据和其他数据存在数据关联,数据的位置的变更很大程度会影响其他数据(如索引数据)。存在数据关联的大数据,使用移动和拷贝(理论上也是移动数据),会削减系统的性能和工作效率。

基于linux的文件打洞

命令调用

fallocate 是一个不可移植的、特定于 Linux 的系统调用。

fallocate -p [-o offset] -l length [-n] filename

可以通过下面的方式查看,命令帮助文档

fallocate --help

这里重点介绍一下 -p
在以offset为起点的位置连续长度位length的区域,进行打洞,如果没有范围,便会移除整个文件系统块从文件中,调用成功后,后面的读便会返回为0;

函数原型

int fallocate(int fd, int mode, off_t offset, off_t len)
// fd: 		文件描述符
// mode: 	模式,处理文件的模式
// offset: 	偏移量 
// len: 	长度

在linux环境下,通过下面的方式查看源文档

man 2 fallocate

在文档中,mode有如下选择:
DEFAULT(等于0): 预分配空间。fallocate() 的默认操作(即mode = 0)在 offset 和 len 指定的范围内分配磁盘空间。 如果 offset+len 大于文件大小,则文件大小(由 stat(2) 报告)将更改。 由 offset 和 len 指定的范围内的任何不包含调用前数据的子区域都将被初始化为零。 此默认行为与 posix_fallocate(3) 库函数的行为非常相似,旨在作为最佳实现该函数的方法。
FALLOC_FL_KEEP_SZIE: 这个模式和默认模式相似,区别在于当offst+len>文件的大小,文件大小不会不会改变文件大小,以这种方式预分配超出文件末尾的零块对于优化附加工作负载很有用。
FALLOC_FL_PUNCH_HOLE: 文件打洞,在从 offset 开始并持续 len 个字节的字节范围内释放空间(即,创建一个空洞)。 在指定范围内,部分文件系统块清零,整个文件系统块从文件中删除。 成功调用后,从此范围内的后续读取将返回零。特别注意: 尽管给文件打洞,但是文件大小不会被改变(换句话说,文件中数据的位移没有被改变,继而文件的大小自然也不会被改变)。
FALLOC_FL_ZERO_RANGE: 清零文件空间在模式下指定 FALLOC_FL_ZERO_RANGE 标志(自 Linux 3.15 起可用)将字节范围中的空间清零,从偏移量开始并继续 len 字节。 在指定范围内,为跨越文件中的孔的区域预先分配块。 成功调用后,从此范围内的后续读取将返回零。
FALLOCATE_FL_INSERT_RANGE: 通过文件穿孔来增加文件的大小,不用写入外部数据,这个孔将从offset到接下来的连续空间(长度为len),在文件中插入孔时,从 offset 开始的文件内容将向上移动(即,到更高的文件偏移量)len 字节。 在文件中插入一个洞会使文件大小增加 len 个字节。等价于在文件中插入数据,插入点之后的数据的位移向后平移len的长度

总结

总的来说,本文结合linux的函数介绍,简要介绍了fallocate()函数中的参数细节。无论如何,基于系统调用的文件操作,在文件整合与回收有很大的帮助,能够提升系统的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值