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
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. 设计决策及性能优化手段总结

.png)
6. 参考资料
linux kernel 2.6.32
ubifs性能优化分析的更多相关文章
- SQL SERVER 查询性能优化——分析事务与锁(五)
SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...
- 一次 group by + order by 性能优化分析
一次 group by + order by 性能优化分析 最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家 ...
- golang 性能优化分析:benchmark 结合 pprof
前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一.基准测试 benchmark 简介 在 ...
- mysql性能优化分析 --- 下篇
概要回顾 之前看过<高性能mysql>对mysql数据库有了系统化的理解,虽然没能达到精通,但有了概念,遇到问题时会有逻辑条理的分析; 这回继上次sql分析结果的一个继续延伸分析,我拿了; ...
- Web性能优化系列(1):Web性能优化分析
本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...
- Web性能优化分析
如果你的网站在1000ms内加载完成,那么会有平均一个用户停留下来.2014年,平均网页的大小是1.9MB.看下图了解更多统计信息. 直击现场 <HTML开发MacOSApp教程> ht ...
- mysql性能优化分析 --- 上篇
概要 之前看过<高性能mysql>对mysql数据库有了系统化的理解,虽然没能达到精通,但有了概念,遇到问题时会有逻辑条理的分析; 问题 问题:公司xxx页面调用某个接口时,loading ...
- MySQL索引及性能优化分析
一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...
- 大型网站调试工具之一(php性能优化分析工具XDebug)
一.安装配置 1.下载PHP的XDebug扩展,网址:http://xdebug.org/ 2.在Linux下编译安装XDebug 引用 tar -xzf xdebug-2.0.0RC3.gzcd x ...
随机推荐
- CSS3实现32种基本图形
CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...
- Android之Picasso --zz
简介: Picasso是Square公司开源的一个Android图形缓存库.可以实现图片下载和缓存功能. 特点: 1.加载载网络或本地图片并自动缓存处理: 2.链式调用: 3.图形转换操作,如变换大小 ...
- Android中Service 使用详解(LocalService + RemoteService)
Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...
- mysql5.7.11安装配置
1.下载安装包. mysql-5.7.11版本: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.11-winx64.zip 2.拷贝到任意盘: ...
- Ubuntu / Win7 安装db2 v10.5
抓紧下载v10.5fp1_linuxx64_expc.tar.gz到~/Downloads/java_softcd java_softtar xf v10.5fp1_linuxx64_expc.tar ...
- Installing MySQL Server on CentOS
MySQL is an open-source relational database. For those unfamiliar with these terms, a database is wh ...
- C#动态方法调用
此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...
- 等号赋值与memcpy的效率问题
转自:http://www.aiuxian.com/article/p-1309055.html 偶尔看到一个说法,说,小内存的拷贝,使用等号直接赋值比memcpy快得多.结合自己搜集到的资料,整理成 ...
- 解决 CentOS网卡eth0启用不了问题
转自:http://www.centoscn.com/CentosBug/osbug/2014/0423/2850.html [root@localhost Desktop]# service net ...
- tcflush 功能(转)
tcflush() 丢弃要写入引用的对象,但是尚未传输的数据,或者收到但是尚未读取的数据,取决于 queue_selector 的值: TCIFLUSH 刷新收到的数据但是不读 TCOFLUSH 刷新 ...