专栏首页coderhuo文件碎片对Flash性能的影响

文件碎片对Flash性能的影响

本文主要介绍文件碎片对Flash性能的影响。

阅读本文前,建议先阅读下这两篇文章:《NAND Flash基础知识简介》《Flash写入性能下降问题》

一、簇(cluster)

前面的文章介绍了flash里面的两个概念:block(flash的最小擦除单元)和page(flash读写的最小单元)。

文件系统层面有个簇(cluster, 有些地方也称为allocation unit)的概念,它是文件系统为文件分配存储空间的最小单元。簇在存储介质格式化的时候指定,必须是page的整数倍,如果要更改簇大小,必须重新格式化存储介质。

一个文件由若干个簇组成,如下图所示。文件实际占用空间大小是簇的整数倍,这在一定程度上会造成存储空间浪费(假设簇大小是1KB,文件实际大小是512B,那么它实际占用空间是1KB,浪费512B)。

cluster、page、block的关系可以用下图来表示(这里假设cluster小于block,实际上不排除一个cluser包含多个block的情况)。下面的例子中一个block包含16个page,一个cluster包含4个page。

二、文件碎片

如果无并发写文件的情况,那么每个文件的簇应该是连续的;否则,多个文件交叉申请存储空间,必然会造成簇的交叉分布,如下面左图所示,file1和file2的簇是交叉排列的(交叉程度和业务层的写卡策略有关)。这种簇不连续的现象就是文件碎片。

假设在某个时刻file1被删除了(上面右图所示),这会导致file1所占用的page处于stale状态,在整个block被擦除前,无法再次使用。如果后来由于磨损均衡策略或者垃圾回收策略需要回收该block,必须先将file2所占用page中的数据拷贝到其他block,才能回收该block。这必然会造成TF卡性能的下降。

如果一个block被同一个文件占用,如下图所示,file1删除的时候,整个block可以直接被擦除回收,这可以避免不必要的数据搬运,有利于TF卡性能提升。

如果簇大小是block的整数倍,就可以保证一个block中不会存在多个文件的情况了。当然,这带来的后果就是潜在的空间浪费。

不过,即使一个block中只有一个文件,修改文件也会造成文件碎片。如下图所示,file1的一部分被修改,由于flash不支持原址更新,所以必须重新为它分配空间。这个没好办法,只能尽量避免修改文件,如果无法避免,尽量以簇为单位去修改。

另外,不同于传统的机械硬盘,文件碎片对Flash的读操作影响很小,因为Flash不需要像机械硬盘那样转动磁盘去寻址。

三、参考资料

  1. https://bbs.huaweicloud.com/blogs/136714
  2. https://www.man7.org/linux/man-pages/man2/fallocate.2.html
  3. https://superuser.com/questions/974824/what-is-the-difference-between-sector-and-cluster

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NAND Flash基础知识简介

    NAND Flash是一种非易失存储介质(掉电后数据不会丢失),常见的U盘、TF卡/SD卡,以及大部分SSD(固态硬盘)都是由它组成的。 本文主要介绍其组成及工...

    coderhuo
  • Flash写入性能下降问题

    在《NAND Flash基础知识简介》中,我们介绍了NAND Flash的一些特征。本文主要从文件操作的角度看下写入性能问题。

    coderhuo
  • AVB简介--第一篇:概述

    这也是AVB要解决的主要问题。不同的是,我们观看网络视频一般是经由广域网传输,而AVB解决的是局域网内的音视频传输问题。

    coderhuo
  • 由一次磁盘告警引发的血案

    如果你完全不明白或者完全明白图片含义, 那么你不用继续往下看了. 否则, 这篇文章也许正是你需要的.

    程序猿石头
  • php中的header跳转常用方式

    header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出 但是很多时候在head...

    貟王軍
  • iOS---小经验分享

    用户1941540
  • 2018-04-21 搭建Python官

    参考PEP 545 -- Python Documentation Translations

    py3study
  • 算法(二)蓄水池抽样算法快速随机抽取reads

    fastq文件往往都很大,出于测试目的,我们经常要从fastq文件中随机抽取reads,生成一个小一点的fastq文件,以加快测试效率。假设我们要从一个包含大约...

    一只羊
  • setInterval与clearInterval使用示例

    setInterval是一个很有用的js函数,可以用来重复执行某些功能,利用这个我们可以实现一些很有趣的功能,比如: 不刷新页面的情况下,"实时"获取其它会员给...

    菩提树下的杨过
  • C#中的bin和obj文件夹有什么用?

    Bin目录用来保存项目生成后程序集,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin/Release,这个文件夹是默认的输出...

    zls365

扫码关注云+社区

领取腾讯云代金券