littlefs性能分析提升

littlefs性能分析

分析的目的很简单:希望支持掉电安全,或者说具有奔溃一致性特性的文件系统,他的读写速度能得到提升。如果了解了瓶颈所在,也可触类旁通。

本次分析,使用了大量的对比测试:

littlefs读(KB/S)写(KB/S)分析
lfs初始速度 read_size=512, prog_size=512, block_size=512, lookahead_size=80.76517810118.980361328初始速度
lookahead_size=25618.69552148418.400935547
更新littlefs到最新版本,lookahead_size=25618.78165039118.402720703-
lookahead_size=819234.64910546918.399744141
block_cycles从-1改为100034.79537890618.393941406-
lookahead_size=8k ,block_size=120k=240sector3729.26653441.53175需要同步更改lfs_io文件
lookahead_size=8k,block_size=1024sector5603.0857898.793
取消fal9439.2227844.319取消fal对读速度影响很大,对写没有影响
直接使用块驱动接口,不使用驱动框架9323.1667871.461-
更改测试用例11524.0758597.326
read_size=128sector, prog_size=1024sector, block_size=1024sector13287.46119012.166减小了readsize
一次性写1024block26.10 MB/s28.44 MB/s直接调用驱动接口os_device_write_nonblock
一次性写4block0.25MB/s0.27MB/s-

为何驱动接口一次性读取更多的block会更快?

在eMMC存储中,一次性读取更多的数据块可能会更快的因素包括:

  1. 减少命令开销:每次读取操作之前,主机需要向eMMC发送命令。如果一次性读取更多的数据块,可以减少命令的发送次数,从而降低命令传输的开销。
  2. 提高数据传输带宽利用率:eMMC接口支持高速数据传输,一次性读取更多的数据块可以更充分地利用接口的带宽,从而提高数据传输的效率。
  3. 利用eMMC的缓存:eMMC设备内部通常包含一定大小的缓存,用于优化数据传输。一次性读取更多的数据块可以更有效地利用这个缓存,减少访问实际闪存介质的次数。
  4. 减少事务处理次数:eMMC的读写操作是通过事务来管理的,每个事务包括命令、响应和数据传输。减少事务处理的次数可以提高整体的传输效率。
  5. 优化闪存操作:eMMC使用的是闪存存储技术,闪存的读取操作在处理大量数据时更为高效。一次性读取更多的数据块可以减少对闪存的编程/擦除操作,从而提高读取速度。
  6. 减少接口切换:eMMC接口支持多种操作模式,包括数据传输模式和命令模式。一次性读取更多的数据块可以减少在这些模式之间切换的次数,从而节省时间。

为何lfs的读写操作要比直接调用驱动接口更慢?

  1. 抽象层开销:LFS作为文件系统,提供了文件和目录的抽象。这意味着在进行读写操作时,LFS需要处理文件系统的元数据,如目录结构、文件属性等,这增加了额外的开销。
  2. 缓存和缓冲:文件系统通常会使用缓存来优化对存储设备的访问。LFS可能有自己的缓存策略,这可能会增加读写操作的复杂性,尤其是在缓存失效或需要刷新缓存到存储设备时。
  3. 事务日志:LFS可能使用事务日志来确保文件系统的原子性和一致性。这意味着每次写操作可能需要额外的步骤来记录日志,这会增加写操作的延迟。
  4. 额外的写入操作:为了维护文件系统的结构,LFS可能需要进行额外的写入操作,比如更新文件系统的分配位图或者索引数据结构。
  5. 碎片处理:文件系统可能会随着时间的推移产生碎片,这需要LFS进行额外的管理工作,如动态地分配和回收存储空间,这可能会导致读写操作变慢。
  6. 同步和异步操作:直接调用驱动接口的读写操作可能更直接地控制同步和异步行为。而文件系统可能会为了数据的完整性而默认使用同步操作,这会阻塞直到数据完全写入或读取。
  7. 文件系统的一致性检查:LFS可能需要在启动或特定操作时执行一致性检查,以确保文件系统的完整性,这可能会导致额外的延迟。
  8. 系统调用开销:使用文件系统通常涉及到系统调用,这比直接在用户空间操作硬件驱动接口要慢,因为系统调用涉及到用户空间与内核空间之间的上下文切换。

总的来说,LFS提供了丰富的文件管理功能,但这些功能在提供便利的同时也带来了额外的性能开销。对于需要极高读写性能的应用,直接操作存储设备驱动接口可能会更高效,但这通常需要更复杂的错误处理和设备管理逻辑

为何fal让写速率变慢?

在接口fal_blk_write_block中调用了fal_part_erase擦除接口,他会执行擦除操作,把所有的位都置1。

但其实对于eMMC存储设备,开发者通常不需要手动调用擦除接口。eMMC设备的控制器已经对底层的闪存操作进行了抽象和封装,包括必要的擦除操作。这意味着当应用程序写入数据到eMMC时,控制器会自动处理闪存块的管理,包括在必要时擦除和重写数据。

为何提高block_size,read_size,prog_size会让性能提升?

修改它们的同时,需要同步修改lfs_io.c文件,之间的lfs_flash_write/lfs_flash_read只能一次写入一个block,导致性能较弱。提高size大小,最终对应到os_device_write_nonblock,可以让驱动接口一次性读写多个块,从而提升性能。

直接从存储介质读取:如果数据既不在预缓存也不在读缓存中,且满足一定条件(如:大小大于等于缓存提示值并且读取位置对齐),则跳过缓存,直接从存储介质读取数据到用户缓冲区。

在这里插入图片描述

选择数据块:如果当前文件不在读取模式或当前块已读完,函数会找到包含文件当前位置的数据块。对于非内联文件,使用lfs_ctz_find查找数据块。

加载数据到读缓存:如果上述条件不满足,将数据加载到读缓存中,确保读取位置对齐,并读取尽可能多的数据,但不超过缓存大小和块大小。
在这里插入图片描述
在这里插入图片描述

为何提高littlefs的lookahead_size,能让性能提升?

  1. 减少查找开销:当LittleFS需要分配新的存储块时,它会使用lookahead buffer来预先检查和标记一系列可用块。一个更大的lookahead buffer意味着可以预先检查更多的块,从而减少在实际写入数据时寻找可用块所需的时间和开销。这在连续分配多个块时特别有效,因为它减少了对闪存的重复扫描。
  2. 优化块分配策略:由于lookahead buffer是按位图形式组织的,更大的尺寸意味着能够覆盖更多的物理块状态。这样,文件系统可以在更宽的范围内进行块分配选择,有助于实现更好的磨损平衡,避免某些块过早达到擦写极限,从而延长存储介质的寿命。
  3. 减少写入放大:通过更有效的块分配,可以减少不必要的擦除和重写操作(写入放大),因为文件系统可以更好地规划数据的存放位置,避免频繁地移动数据来腾出空间。这对于基于闪存的存储介质(如eMMC、NAND Flash)尤为重要,因为这些介质的擦写操作相比读取操作要慢得多且寿命有限。
  4. 提高顺序写入速度:对于连续的大块数据写入,较大的lookahead_size可以确保文件系统有足够多的连续空闲块来满足需求,从而减少碎片化,提高顺序写入的速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Visual Studio Code中使用pytest进行AWS Lambda函数测试的最佳实践

背景/引言 在现代软件开发中,自动化测试已经成为保证代码质量的重要一环。对于AWS Lambda函数开发者来说,使用pytest进行单元测试和集成测试是一个高效且可靠的方法。本文将介绍在Visual Studio Code中使用pytest测试AWS Lambda函数的最佳实践&#xff…

RESTful API最佳实践:Python构建指南

目录 一、引言 二、RESTful API设计原则 三、Python构建RESTful API的技术栈 四、Flask构建RESTful API实践 安装Flask 定义路由和资源 处理HTTP方法 错误处理 数据验证和序列化 使用Flask扩展 五、最佳实践案例 七、结论 一、引言 在当今的软件开发领域&#…

SpringBoot 项目创建和 IDEA 常见问题

1、 Cannot save Files 问题(无法自动保存项目文件) Cannot save ....../HelloWord.java. Unable to create a backup file (HelloWord.java~). The file left unchanged. 原因:DIEA无法在保存前备份文件 解决办法:找到 Files --> Settings... -->…

谁是最会写作文的AI“考生”?“阅卷老师”ChatGPT直呼惊艳!

文章推荐 粽叶飘香,端午安康!AI视频送祝福啦~ AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了! ⭐️搜索“可信AI进展“关注公众号,获取当日最新AI资讯 一年一…

Claude3 注册及升级教程(包含封号解决方法)

前言 最近大家呼声很高的 Claude3 ,它的 注册以及升级 教程来了!!! (还有封号情况的解决方式放在了后面) 废话不多说,直接进入教程。 Claude 3 注册 前期准备工作 一个国外的邮箱账号&#…

HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现(一) HarmonyOS Next 系列之验证码输入组件实现(二) HarmonyOS Next 系列之底部标签栏TabBar实现(三) HarmonyOS Next 系列之HTTP请求封装和Token…

windows上修改Podman的镜像配置源加速

目录 前言解决办法1. 打开window的Powershell 2. 修改registries.conf3. 重启podman即可 扩展内容1. 国内镜像源地址2. 阿里加速地址 前言 今天在电脑上准备通过podman安装mysql,结果执行安装命令后,网络不通没法下载镜像。 解决办法 将默认镜像源修改…

释放创意潜力:AI写作助手如何助力内容创作?

内容为王,在内容创作的世界中尤为重要。然而,面对写作时常常感到无从下手:有时缺乏灵感,有时难以表达清楚自己的想法。AI写作助手的出现,为这些问题提供了创新的解决方案,极大地改变了内容创作的过程。 今…

C++: shared_ptr是线程安全的吗

导读 C面试中有时会有这样一个问题,shared_ptr是线程安全的吗?对此问题,我们需要从三个并发场景进行考虑,拷贝shared_ptr的安全性、对shared_ptr赋值的安全性和读写shared_ptr指向内存区域的安全性。 对于以上问题,首…

奥特曼28亿「投资帝国」曝光!不要OpenAI股份,当CEO最不赚钱

Sam Altman十几年来建立的庞大投资帝国,让我们终于理解了他为什么可以不要OpenAI的股权。 内容提要 作为一家曾经的小型非盈利组织,OpenAI以创纪录的速度迅速成长为估值860亿美元的独角兽。 虽然这大多归功于Sam Altman和微软达成的商业合作&#xff…

超强 BAAS 神器:支持自动生成API、对象存储、静态托管,云函数!

想象一下,你是一名开发者,你有一种强大的神器,可以让你摆脱繁琐的服务搭建和接口开发,免费使用众多第三方认证服务、对象存储、云函数和静态部署。这就是MemFire Cloud! MemFire Cloud是懒人开发者的福音,一…

开源VisualFbeditor中文版,vb7 IDE,VB6升级64位跨平台开发安卓APP,Linux程序

吴涛老矣,社区苦无64位易语言,用注入DLL增强菜单,做成VS一样的界面 终归是治标不治本,一来会报毒,二来闭源20年没更新了 开源的VB7,欢迎易语言的铁粉进群:1032313876 【Freebasic编程语言】编绎…

Transformer论文解读

目录 写在前面 一、Transformer要解决的问题 1.长距离依赖问题 2.序列处理瓶颈 二、整体结构 三、自注意力机制 1.Scaled Dot-Product Attention 2.Multi-Head Attention 四、Position-wise Feed-Forward Networks(FFN) 五、位置编码 六、总结…

数组双指针经典习题

合并两个有序数组 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1m-1,p2n-1;int p3nums1.length-1;while(p1>0&&p2>0){//放完一个数组if(nums1[p1]>nums2[p2]){nums1[p3--]nums1[p1];p1--;}else{nums1[p3--]nums2[p2];p…

iOS调整collectionViewCell顺序

效果图 原理 就是设置collectionView调整顺序的代理方法,这里要注意一点 调整过代理方法之后,一定要修改数据源,否则导致错乱。 还有就是在collectionView上面添加一个长按手势,在长按手势的不同阶段,调用collectionV…

第18篇 Intel FPGA Monitor Program的使用<一>

Q:Intel FPGA Monitor Program开发工具可以支持Terasic的FPGA开发板使用吗? A:Intel FPGA Monitor Program 是Intel提供的适用于 ARM* Cortex*-A9 处理器和 Nios II 处理器的完整软件开发环境,它包括编译工具以及完整的调试功能&…

全国电力变压器数据

全国共10330个电力变压器 属性部分并不是很全,比如说一次电压,二次电压只有200条是全的 不过以我做电力采集时的经验,其实变压器的数量和位置是最难采集的数据,反而电压、电流、功率这些专业数据可以直接找设备台账补充或利用移动…

log4j日志打印导致OOM问题

一、背景 某天压测,QPS压到一定值后机器就开始重启,出现OOM,好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地,打开Java sdk bin目录下的jvisualvm工具&a…

35、matlab设置字体、查看工具包版本、窗口默认布局和程序发布

1、matlab设置字体 1)找到预设并点击预设 2)设置流程:字体——>自定义——>编辑器——>选择字体及格式——>确定 如图序号所示 2、matlab查看工具包版本:ver命令 1)命令行窗口输入命令 即可查看工具包…

如何使用前端表格控件实现数据更新?

前言 小编之前分享过一篇文章叫《如何使用前端表格控件实现多数据源整合?》。今天,继续为大家介绍如何使用前端表格控件来更新已连接的数据源信息。 环境准备 SpreadJS在线表格编辑器: SpreadJS 前端表格控件新版本新增了一款报表插件&am…