前言

在存储领域中有一个FTL的概念,这是一种Flash的内存管理算法,属于各个厂商的核心机密,每个厂商的处理方式不同,有的处理简单,有的处理复杂。

FTL,即Flash Translations layer,也就是闪存转换层,可以完成从逻辑地址到物理地址的转换,简称为映射。

为什么需要FTL

因为Flash的质量参差不齐,里面坏掉的区域是完成不能使用的。

Host发送命令下来,要求把一段数据存放在A地址中,此时A就是逻辑地址,而好死不死,Flash中的A地址刚好是坏块,那怎么办?

此时B地址是好的,FTL就将数据存放在B地址中,此时B丢置就是物理地址了,同时将A逻辑地址——B物理地址记录下来,这一段记录就是映射关系了。

下一次,当主机需要读取A逻辑地址的数据时,FTL就会将B物理地址的数据读取出来返回给主机。

FTL的位置

先了解几个名词

UCL

USB Control layer,USB控制层,主要用于解析从Host发送下来的USB命令

FTL

Flash Translation layer,Flash转换层,主要用于将逻辑地址转换成物理地址

FCL

Flash Control layer,Flash控制层,主要用于将经过映射处理后的地址解析成flash指令发送给Flash

UCL、FTL、FCL所处的位置

FTL遵循的规则

FTL这种内存管理算法,自然是遵循着着Flash特性,一切都是在Flash特性下才能运行起来的。

  • 写数据以page为最小单位
  • 写入的数据必须打乱存储才会稳定
  • 写满整个Block数据才会稳定
  • 擦除以Block为最小单位,一般不轻易做整块擦除

当然也有其他特性,但是Flash由于批次不同,制造工艺和厂商不同,出厂的flash也各有一些差异性的特性,这些,就实际问题实际分析。

FTL中各种调优

不同的厂商,FTl的方案各不相同,除了逻辑地址和物理地址的映射作用外,一个好的FTL还具备以下的调优:

映射颗粒度

逻辑地址和物理地址之间的映射方式有两种:块映射和页映射。

使用块映射,逻辑块映射到物理块,看起来挺好的,但是如果遇到操作page的情况,比如说要修改刚写满的某个Block中的某一个page,往往需要做整块擦除,大大降低了效率。

使用页映射,虽然弥补了上面的问题,但是每一页都做映射的话,页的数量一多,映射页多,要知道存储映射关系也是要消耗内存的。页映射需要消耗很大的空间。

所以市面上的做法大多数采用:块映射+页映射,简称混合映射,既可以满足存储需求,还能做到以page颗粒进行维护。

映射表存储

映射表是可以随时变化的,也是随时都要用到的,一般用的时候在RAM中使用,不用的时候就需要存储起来,一般都是用一些空闲块存储起来,这些空闲块不存数据,只放映射表。

merge处理

存储领域,少不了数据搬运这一块,一般来说,merge和GC是一起工作的。

GC回收

现在无论什么都会涉及一些垃圾回收,内存永远是一个好的算法需要考量的点。

垃圾回收需要选好时机,谁都不希望一个存储设备,会在没有能用的内存后才开始做GC回收,这就像开启了一段完全看不到进度的卡顿一样。

好的固件往往未雨绸缪,在不知不觉下做好了GC回收的工作。

寿命均衡

逻辑地址和物理地址的映射本身会对寿命均衡产生正面影响。

就刚才讲到的,映射表可以被随时修改,那么逻辑地址对应的物理地址也就被修改了,一些物理Block经常被擦写,往往会加速损坏。

我们可以通过修改逻辑块,让每次物理块不同而避免经常擦写相同的物理块,这本身就保证不会有物理块被经常擦写。

但是有一种情况它没有办法处理,即闲置的数据块,它们被写入后没有更改,就一直占据某些物理块,而这些物理块寿命还很长,而别的块却在飞速损耗中。

面对这种情况,我们只有在合适的时机帮它们换个位置了,如何选择这个时机很重要,而且这个merge搬运动作本身也会损耗寿命本身。

以上这些策略也是各个FTL算法的精华了。

我收集了一些linux的资料、算法小抄和计算机基础的资料,仅供个人学习使用,欢迎大家一起学习探讨。

linux保姆级教程完整版文档资料

FTL潜规则:调优,才是算法精华的更多相关文章

  1. JVM探究 面试题 JVM的位置 三种JVM:HotSpot 新生区 Young/ New 养老区 Old 永久区 Perm 堆内存调优GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数法

    JVM探究 面试题: 请你弹弹你对JVM的理解?Java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出StackOverFlowError?怎么分析 JVM的常用调优参数有哪些? 内存快照如何 ...

  2. ES 搜索结果expalain 可以类似数据库性能调优来看排序算法的选择

    When we run a simple term query with explain set to true (see Understanding the Score), you will see ...

  3. RandomForest 随机森林算法与模型参数的调优

    公号:码农充电站pro 主页:https://codeshellme.github.io 本篇文章来介绍随机森林(RandomForest)算法. 1,集成算法之 bagging 算法 在前边的文章& ...

  4. 16-MySQL DBA笔记-调优基础理论和工具

    第五部分 性能调优与架构篇 本篇将为读者介绍性能调优的一些背景知识和理论,然后介绍一些工具的运用,最后介绍从应用程序到操作系统.到数据库.到存储各个环节的优化. 性能调优是一个高度专业的领域,它需要一 ...

  5. 程序员必须掌握的性能调优 X Y Z

    热评博文:<如何设计出优美的Web API?>,现阅读量超 2500,小伙伴们不要错过哦! 2003 ~ 2008 年,这五年老兵哥我在通信行业做实习生和开发岗,主要用 C / C++ / ...

  6. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  7. 为什么Java有GC调优而没听说过有CLR的GC调优?

    前言 在很多的场合我都遇到过一些群友提这样的一些问题: 为什么Java有GC调优而CLR没有听说过有GC调优呢? 到底是Java的JVM GC比较强还是C#使用的.NET CLR的GC比较强呢? 其实 ...

  8. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  9. MySQL Join算法与调优白皮书(一)

    正文 Inside君发现很少有人能够完成讲明白MySQL的Join类型与算法,网上流传着的要提升Join性能,加大变量join_buffer_size的谬论更是随处可见.当然,也有一些无知的PGer攻 ...

  10. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

随机推荐

  1. better-scroll横向滚动、纵向滚动

    <div ref="tab" class="tab"> <ul ref="tabWrapper" class=" ...

  2. 器学习算法(六)基于天气数据集的XGBoost分类预测

    1.机器学习算法(六)基于天气数据集的XGBoost分类预测 1.1 XGBoost的介绍与应用 XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统.严格意义上讲XGBo ...

  3. 数仓如何进行表级控制analyze?

    摘要: 介绍如何设置采样大小和表级控制analyze. 本文分享自华为云社区<GaussDB(DWS) 如何表级控制analyze>,作者:leapdb. 一.控制采样大小 [设置全局采样 ...

  4. 万字血书React—走近React

    配置开发环境 脚手架工具create-react-app 储备知识:终端或命令行.代码编辑器 React官方中文文档 create-react-app 其是基于Node的快速搭建React项目的脚手架 ...

  5. Bean的自动装配(Autowired)

    Bean的自动装配(Autowired) 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给bean装配属性 在Spring中有三种自动装配的方式 在xml中 ...

  6. ggplot2图形可视化应用集锦

    数据可视化就是将我们从数据中探索的信息与图形要素对应起来的过程.数据可视化,先要理解数据,再去掌握可视化的方法,这样才能实现高效的数据可视化.数据可视化技术的基本思想,是将数据库中每一个数据项作为单个 ...

  7. odoo 开发入门教程系列-约束(Constraints)

    约束(Constraints) 上一章介绍了向模型中添加一些业务逻辑的能力.我们现在可以将按钮链接到业务代码,但如何防止用户输入错误的数据?例如,在我们的房地产模块中,没有什么可以阻止用户设置负预期价 ...

  8. PopupWindow点击空白区域消失

    下面三个条件必须要有,要在popupWindow显示之前调用popupWindow.setOutsideTouchable(true);popupWindow.setFocusable(true);p ...

  9. 数据泵:impdp导入用户ORA-01653

    ,问题描述:在导入一个用户数据的时候,大小为14G左右,导进来的时候卡半天,后来发现是表空间满了,已经恢复了大概6G左右,剩下8G左右没有恢复.此时磁盘剩余19G,加了15G的表空间,磁盘就剩下4G左 ...

  10. hasOwnProperty的作用、配合for in使用 、key in Object判读key

    我们都知道,对象以 key|value的形式存在 它和数组一样可以遍历,对象可以通过for in 去遍历,拿到遍历对象的所有key 某些idea在使用for in 时,提示代码片段中就有出现以下这种情 ...