引言
随着科技的发展和网络技术的进步,计算机存储空间愈加紧张,存储空间对文件系统的功能需求越来越大,大规模的数据增长为文件存储、非结构化数据存储提出了新的挑战。
对于许多物联网设备而言,拥有一个小型且具有弹性的文件系统至关重要,littlefs文件系统应运而生。littlefs文件系统在2017年由Christopher Haster开发,遵循Apache 2.0协议,被应用在ARM的IoT设备Mbed操作系统。littlefs文件系统能够让嵌入式系统在ROM和RAM资源有限的情况下,还具备文件系统基本的掉电恢复、磨损均衡的功能。
littlefs是一种极简的嵌入式文件系统,适配于norflash,它所采用的文件系统结构与运行机制,使得文件系统的存储结构更加紧凑,运行中对RAM的消耗更小。它的设计策略采用了与传统“使用空间换时间”完全相反的“使用时间换空间”的策略,虽然它极大地压缩了文件系统存储空间,但是运行时也增加了RAM的消耗,不可避免地带来了随机读写时IO性能的降低。
目前,OpenAtom OpenHarmony(以下简称“OpenHarmony”) liteos_m内核采用了littlefs作为默认的文件系统。本文着重介绍了littlefs文件系统的存储结构,并根据对读写过程的分析,解析引起littlefs文件系统随机读写IO性能瓶颈的根本原因,然后提出一些提升littlefs随机读写IO性能优化策略。
littlefs文件系统结构
文件系统存储结构信息基本以SuperBlock为开端,然后寻找到文件系统根节点,再根据根节点,逐步拓展成一个文件系统树形结构体。littlefs也与此类似,以SuperBlock和根目录为起点,构建了一个树形存储结构。不同的是littlefs的根(“/”)直接附加在SuperBlock之后,与其共享元数据对(metadata pair)。littlefs中目录或者文件都是以该根节点为起点,构建了与其他文件系统类似的树形结构。
littlefs文件系统树形存储结构如下:
图1 littlefs文件系统树形存储结构示意图如图1所示,存储littlefs文件系统元数据的结构为元数据对,即两个相互轮转、互为表里的Block。存储SuperBlock的元数据对固定存储在block 0和block 1,并且文件系统根目录附加在SuperBlock的尾部,与SuperBlock共享元数据对。元数据的存储是以