文件打洞

  • 文件空间回收的常见解决方案
  • 场景分析
  • 基于linux的文件打洞
    • 命令调用
    • 函数原型
  • 总结

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

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

  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()函数中的参数细节。无论如何,基于系统调用的文件操作,在文件整合与回收有很大的帮助,能够提升系统的性能。

linux 文件打洞相关推荐

  1. Linux文件中的stat结构

    结构体stat Linux文件系统以块为单位存储信息,为了找到某一个文件所在的存储空间的位置用一个数据结构来对每个文件进行索引,而stat显示的就是该结构体信息,下面我们可以来看下这个结构体. str ...

  2. linux文件权限详解

    linux文件权限详解 一.文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限: ...

  3. Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换

    题目描述: 编写一个函数实现Linux文件寻址的算法,即读取文件当前位置到物理存储位置的转换函数,需要给出运行的测试数据,可以假设和模拟需要的数据和结构.即编写一个函数unsigned long lt ...

  4. linux文件时间属性的详解

    linux文件会有三个时间. stat file 可以查看三个时间 如: Access: 2019-01-26 19:11:10.482357682 +0800 Modify: 2019-01-26 ...

  5. 查看linux文件的权限:ls -l 文件名称

    查看linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...

  6. [转]Linux文件搜索

    简述Linux文件搜索 1 .关于搜索: 在Linux文件系统中,搜索概念有两种,一种是搜索文件名,另一种是在一个文件中搜索指定的内容:这两种搜索,我们都简要的介绍一下,但不一定极为专业.想到哪写到哪 ...

  7. linux文件的权限模式,Linux文件权限和访问模式

    为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限: 所有者权限:文件所有者能够进行的操作 组权限:文件所属用户组能够进行的操作 外部权限(其他权限):其他用户 ...

  8. linux学习随笔——linux文件权限管理和网络配置

    一.linux文件权限管理 查看某个文件的权限命令:ls -l linux文件权限有4种:读(r).写(w).执行(x)和无权限(-) 一般用10个字符表示其权限,按照(1-3-3-3)来分组划分 1 ...

  9. [转帖]linux文件描述符文件/etc/security/limits.conf

    linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...

最新文章

  1. [转]后期-快速消除痘痘,完美修复MM肌肤
  2. 一秒刹停!让特斯拉都「拜服」的无人车,竟送起了外卖!
  3. 一般判五年几年能出来_判刑五年能减刑多少年
  4. linux命令之awk命令
  5. DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较
  6. Elasticsearch之Query DSL语法入门
  7. Towards a topological-geometrical theory of group equivariant non-expansive operators for data analy
  8. PHP如何处理emoji表情存入utf8的数据库
  9. 使用report PRC_SHOW_PRICING_DOCUMENT查看SAP CRM订单的pricing数据
  10. python学习感悟第3节
  11. python语言的核心理念是_学习Python语言四大核心优势
  12. 洛谷 P1344 [USACO4.4]追查坏牛奶Pollutant Control 解题报告
  13. 公众号的秘密,知道一个biz就够了
  14. pod trunk push --verbose 失败的原因总结
  15. 第二届太原理工大学程序设计新生赛预赛(公开赛)题解
  16. 《C陷阱与缺陷》 阅读总结
  17. 基于YOLOv5的血细胞识别和计数
  18. 计算机硬件输出设备有哪些,输出设备有哪些,输出设备的作用
  19. 台式电脑网络连接配置异常_专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机...
  20. 12306 抢票,极限并发带来的思考

热门文章

  1. 在IOS中实现导入导出文档
  2. 聊聊大数据与人工智能
  3. 环洋市场咨询:全球军用无人机收入预计2028年达到171亿美元
  4. 2010十大新兴技术展望
  5. 简单记录一次华硕主板安装 奥创 armoury create
  6. 关于多租户系统的思考
  7. transform的高级用法
  8. 音乐播放器:打开文件对话框
  9. 阿里巴巴2016校园招聘 研发工程师(四)详解
  10. ROS-Academy-for-Beginners依赖包报错问题