ubifs性能优化分析
1. ubifs mount流程
- 创建ubifs inode slab(kmem_cache_create )
- 注册ubifs TNC shrinker回收功能 ubifs_shrinker_info(register_shrinker )
- 注册压缩算法(ubifs_compressors_init )
- 注册debugfs(dbg_debugfs_init )
- 注册ubifs文件系统 ubifs_fs_type(register_filesystem )
- 调用ubifs_fs_type.ubifs_get_sb()继续初始化
- 获取ubi_volume_desc对象
- 创建并初始化ubifs_info对象和super_block对象
- 读取并验证、修复ubifs_sb_node,并以ubifs_sb_node继续初始化ubifs_info对象
- 创建wbuf和后台线程ubifs_bgt1_0,其主要作用是后台同步write-buffers、commit、垃圾回收等。
- 读取并验证、修复ubifs_mst_node,并以ubifs_mst_node继续初始化ubifs_info对象
- 如果发现 index and LPT 头有损坏就进行修复,以继续初始化ubifs_info
- 更新master node信息
- 遍历、检查indexing node (ubifs_zbranch, ubifs_znode)的总大小是否与c->bi.old_idx_sz一致(dbg_check_idx_size,由chk_index控制,默认关闭)
- 回放log,检查修复index node,并更新TNC(ubifs_replay_journal)
- 删除orphan inode(ubifs_mount_orphans)
- 检查indexing tree的叶节点是否存在、crc等验证信息(dbg_check_filesystem,由chk_fs控制,默认关闭)
- 设置垃圾回收gc_waterline(UBIFS_FREE_RESERVE_RATIO 5),唤醒后台线程。
2. ubifs read流程
- page cache
- write buffer
- flash
3. ubifs write流程
- page cache
- write buffer
- TNC
- log area
- main area
- 查询cache page,如没有就创建一个;如果page需要update,调用do_readpage从flash读取数据更新page,
- 为page申请flash上的budget空间,如果page appending 没置位或者ui->dirty置位,则不需要为此page申请budget,否则调用allocate_budget申请budget,流程如下:a)如果没有新数据,则返回成功
b)如果flash空间足够,则返回成功
c)如果fast budgeting,因为页缓存已经锁定,不能触发后面流程,只能直接返回错误
d)脏也写回flash(shrink_liability)
e)垃圾回收(0run_gc)
f)内存数据提交(ubifs_run_commit) - 如果allocate_budget失败,释放之前申请的页缓存,并调用write_begin_slow,slow path先调用allocate_budget申请budget,然后再申请页缓存
- 如果allocate_budget成功,vfs将用户数据就copy到page cache中,然后进入write_end
write_end阶段主要做1件事:更新page和inode标记。详细流程如下:
- 如果write_begin因为优化原因没有更新缓存页,在write_end中更新缓存页
- 如果发现脏页,设置page dirty标记
- 如果发现appending,设置inode dirty标记
- 然后vfs后台进程调度将page cache提交到 writeback queue, 然后通过pdflush线程调用ubifs_writepage
writepage阶段主要做3件事: 查找存储位置,更新wbuf,更新TNC。先写索引信息,再写数据信息。写入flash在commit流程中完成。
4. ubifs commit流程
- 将inode wbuf、data wbuf、gc wbuf同步到flash(ubifs_wbuf_sync)
- ubifs_gc_start_commit
- ubifs_log_start_commit:将各c->jheads[i].wbuf中的位置信息更新到内存对象树ubifs_bud,并写入log区
- ubifs_tnc_start_commit:找出tnc中所有脏节点,加入c->cnext链表,为需要写入的znode分配leb,在leb上安排zonde的位置,更新znode的leb等属性,更新lpt属性
- ubifs_lpt_start_commit:对LPT区进行垃圾回收,找出LPT中所有脏节点,加入c->lpt_cnext链表,更新c->ltab表数据,分配LPT 区LEB(alloc_lpt_leb)
- ubifs_orphan_start_commit
- ubifs_get_lp_stats:获取lprops统计信息,以便在更新master node时使用
- ubifs_tnc_end_commit:根据c->cnext znode链表构造flash对象ubifs_idx_node,并将index node集合写入main区,释放或标记c->cnext上所有znode
- ubifs_lpt_end_commit:更加ltab,lsave,nnode, pnode对象,构造UBIFS_LPT_LTAB,UBIFS_LPT_LSAVE,UBIFS_LPT_NNODE,UBIFS_LPT_PNODE LPT节点,并写入flash LPT区
- ubifs_orphan_end_commit
- ubifs_log_end_commit:更新log tail lnum(ltail_lnum)等信息
- 更新mst_node并写入flash master区
- ubifs_log_post_commit:释放已提交到main区的ubifs_bud内存对象,并回收其相应的log区空间
- ubifs_gc_end_commit
- ubifs_lpt_post_commit:回收LPT区置垃圾回收标记的LEB块
5. 设计决策及性能优化手段总结
6. 参考资料
linux kernel 2.6.32
—— 完 ——
转载于:https://www.cnblogs.com/wahaha02/p/4504688.html
ubifs性能优化分析相关推荐
- 性能优化分析(更新中)
更新日志,分多次更新 2021-10-24 第一个版本 应用层systemtrace tag,systemtrace分析,LayerType离屏缓存相关内容 更新traceView 更新常见内存泄漏, ...
- Unity性能优化分析思路
1)Unity性能优化分析思路 2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常 3)FBX默认会冗余lit.mat ...
- 性能优化分析及常见性能优化策略总结
最近,大家似乎都对性能优化分析,这一方面比较感兴趣.一方面是比较感兴趣,另一方面就是遇见许多类似的状况,但是,却不知从何下手,根源在哪里?应当如何正确优化?首先,先跟大家讲解下常见的性能优化策略分类! ...
- Web性能优化系列(1):Web性能优化分析
本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载! 英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成 ...
- 一次 group by + order by 性能优化分析
原文:我的个人博客 https://mengkang.net/1302.html Table of Contents 背景 准备工作 开启慢日志 性能分析 发现问题 索引示例 查看 optimizer ...
- 谷歌浏览器LightHouse性能优化分析神器实践运用
1 基本操作介绍 1.1 入口 打开最新版本Google Chrome,F12一下弹出开发者页面,在顶部的导航栏选项选择Lighthouse选项(旧版本的浏览器是需要从应用商店下载Lighthouse ...
- mysql性能优化分析 --- 上篇
概要 之前看过<高性能mysql>对mysql数据库有了系统化的理解,虽然没能达到精通,但有了概念,遇到问题时会有逻辑条理的分析; 问题 问题:公司xxx页面调用某个接口时,loading ...
- 数据库性能分析mysql_mysql数据库的性能优化分析
影响数据库性能的根源: 1,磁盘I/O读取 2,CPU使用率 3,资源竞争 优化的方式: 1,设计优化 2,操作优化 3,使用其他优化技术 1)设计优化: 分类拆分数据量大的表: 选取最适用的字段属性 ...
- 基于linux的千兆网卡驱动程序实现及数据传输效率优化,嵌入式Linux下网卡驱动的实现与数据转发性能优化分析...
摘要: 伴随着互联网的快速发展和后PC时代的到来,嵌入式系统已逐步成为当今IT产业的焦点之一,广阔的市场前景使嵌入式系统获得了空前的发展机遇.由于Linux操作系统具有代码开放.内核可裁减.网络功能强 ...
最新文章
- 【DataGuard】ORA-16014 and ORA-00312 Messages in Alert.log of Physical Standby
- 皮一皮:现在当爹妈的不容易...
- linux 阅读日志命令 tail
- python学习之正则表达式练习:编写一个计算器
- 初识ABP vNext(1):开篇计划基础知识
- MATLAB用递归法求解集合子集,用递归法求一个集合的子集c语言,急!!!
- SpringMVC框架使用注解执行定时任务
- Kafka Manager界面添加Partition
- 力学,软体和刚体碰撞响应 以及 层次KDOP_OBB包围盒技术
- airtestide 下载后打不开_惠普打印机驱动怎么下载 惠普打印机驱动安装方法【步骤】...
- react ssr php,一文吃透 React SSR 服务端渲染和同构原理
- 手把手教你Windows环境下配置Git环境
- NIOSII 安装问题汇总
- chm sharp安卓版_CHM 阅读器
- TextView实现左边图片右边文字或 上面图片下面文字
- java开源tts_开源TTS(Text To Speah)的选择和使用
- linux用户的邮件存在哪里,在Linux系统中收发及查看邮件
- 第一次找工作/实习前需要准备的东西(互联网行业)
- Intel公布Penryn四核CPU价格 最低209美元
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
热门文章
- 【小程序】tabbar用法
- JavaScript节流函数, 防止大量函数触发解决办法
- loading.io一个loading图标网站,跟大家分享
- 计算机控制技术期末复习
- 所谓“尽人事,听天命”
- 2021_SIGIR_Social Recommendation with Implicit Social Influence
- Linux添加定时任务提示权限不够/var/spool/cron/tmp.XXXXFSq8E3: 权限不够 crontab: edits left in /tmp/crontab.HaZsu1
- 电商项目——优惠券测试点有哪些?
- UDS-协议数据单元介绍
- 基于java的springboot在线购物商城系统毕业设计springboot开题报告