【转载】固态硬盘的S.M.A.R.T详解
文章来源于: 瑞耐斯存储技术
兵哥写这篇文章,是因为在测试的过程中看到了 SSD存在偶尔有性能下降的情况,经分析为S.M.A.R.T命令所导致,虽然这种情况看似不严重,但如果应用在诸如数据采集等关键性领域,有可能会导致丢失数据包的严重后果,当然,这个bug是可以修正的,先看图片:

S.M.A.R.T概述
S.M.A.R.T.(Self-Monitoring Analysis And Reporting Technology),意思为“自我检测分析与报告技术”,从名字也能看出其作用是故障预警,固态硬盘可以通过监测自身的健康状态,并将参数值反馈给监控软件或者操作系统,事实上,大部分的参数仅仅对工程师而言有意义,对于最终用户而言,只关注一些关键指标即可,如:新增坏块统计,剩余使用寿命,擦除次数等即可。
一些常用的测试软件也可以获取到SSD的S.M.A.R.T信息:

SSD主控厂商也会提供相应的工具:

经过多年HDD硬盘厂商的完善,S.M.A.R.T已经形成了一些标准,但对于SSD来说,大多数S.M.A.R.T都是自定义的,以至于每个厂商所提供的参数并不一致,但大体都会参考HDD S.M.A.R.T来设定。
SSD S.M.A.R.T信息保存在特定的区域中,由Firmware安排,有可能保存在OP区中,也有可能保存在任何FW工程师想要放置的地方,或者由单独的表来存放。
固态硬盘的S.M.A.R.T与HDD不完全相同,网络上常用的测试软件提供的S.M.A.R.T都是基于HDD设置的,SSD厂商通常会自行根据Nand Flash的特性设定S.M.A.R.T。
S.M.A.R.T各项参数释义
01 原始读取误码率Raw Read Error Rate
这项指标反馈了Nand Flash的初始健康状态,数据值包含了可校正的错误与不可校正错误;
09 通电时间累计 Power-On Hours
计量单位为小时,也可以以分钟、秒为计量单位,由SSD厂商自行定义,通常情况下活动、空闲和睡眠三种状态的时间都会被计算在内,有些SSD会通过一些电源管理功能的开启会将睡眠时间排除在外。此参数表示硬盘通电的累计时间,新硬盘当然应该接近0,但事实上SSD厂商在测试过程中已经使用数个小时甚至数十上百个小时,只是测试完毕后重新量产,参数又会归零。
0C 通电周期计数 Power Cycle Count
通电周期计数的数据值表示了硬盘通电/断电的次数,即电源开关次数的累计,新硬盘通常只有几次。
固态硬盘的通断电与HDD不同,SSD通常会做大量的P/E cycle测试,军工、工业类SSD还需要做大量的异常通断电测试,以防止在异常掉电的情况下丢失映射表以及规避其他因掉电导致不可靠的因素,兵哥公司通常会进行3000次到10000次的异常掉电测试,但是,测试完毕,会对SSD重新量产,Power Cycel Count会被清空,用户看到的仍然是少量的通电次数。
B8 初始坏块计数 Initial Bad Block Count
每个Nand Flash出厂时都会有初始坏块,固件通过扫描每个Block的第一个和最后一个page Spare Area区域的0xFF标记,如果没有0xFF标志,则表示为坏块,坏块由固件进行统一管理,列入坏块表。
初始坏块的数量可以从某种程度上反映SSD的初始健康状态,初始坏块越多,健康状态相对来说就越差。
C3 编程失败块计数 Program Failure Block Count
编程失败会将此page所在的Block列为坏块,这类的坏块称为新增坏块或者使用坏块,坏块会被列入坏块管理表,每个Block都存在一定的擦写寿命,当编程识别以及擦除失败时,都会被列入坏块表进行管理,对于数据安全要求很高的领域来说,一次编程失败或者擦除失败或者读取失败都可以将此块列为坏块。
对应下面C4,擦除失败块计数,同样道理。
C4 擦除失败块计数 Erase Failure Block Count
解释同C3
C5 读取失败块计数 Read Failure Block Count
解释同C3
CA flash总的bit错误统计 Total Count of Error bits from flash
这个统计包括了编程干扰(Program Disturb)错误,读取干扰错误(Read Disturb)和擦除错误,可纠正和不可纠正的错误bit总数。
这个值看上去会非常大,尤其是ECC能力较弱的SSD,值会更大,配合CB参数,可以大概判断此SSD的纠错能力,值越大,说明纠错能力越差。
CB 读取扇区可纠正bit错误统计 Total Count of Read Sectors with correctable bits errors
这个统计只包括已经纠正的错误bit数量,用CA-CB就可以得出不可纠正的错误数量,CA和CB的差异越大,说明SSD的纠错能力越弱,SSD的寿命也会更短。
CD 最大PE次数Maximum PE Count
这个参数是根据Nand Flash的datasheet来设定的,事实上,nand Flash的PE次数要比datasheet规定的多,例如:给出的值是3000,等真正的计数达到3000时,剩余寿命会显示为0,但实际上SSD的健康状态可能还非常好,所以,此参数只能做为最为保险使用的参考。
CE 最小擦除总数Minimum Erase Count
最大、最小和平均擦除总数描述每个Block的擦除次数,最大和最小擦除次数差别越小,说明磨损平衡算法做的越好,平均值没有任何意义。
CF 最大擦除总数Maximum Erase Count
见CE解释
D0 平均擦除总数Avage Erase Count
见CE解释
D1 剩余寿命Remaining Life(%)
这个参数显示SSD的剩余寿命,参考CD的描述可知这个值仅仅是个参考值
【转载】固态硬盘的S.M.A.R.T详解的更多相关文章
- 转载爱哥自定义View系列--Paint详解
上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...
- 【转载】JAVA消息服务JMS规范及原理详解
转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...
- [转载]领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)
转自:http://www.jb51.net/article/97157.htm 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physic ...
- 硬盘内部硬件结构和工作原理详解[zz]
一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路 ...
- python 基础 3.1 打开文件 a a+ r+ w+ 详解
一.python 访问文件 1.在python中要访问文件,首先要打开文件,也就是open ---open r: 只读 w: 只写 ,文件已存在则清空,不存在则创建 a:追加 ...
- (转载)linux中设备文件配置程序udev详解
如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...
- 转载爱哥自定义View系列--Canvas详解
上面所罗列出来的各种drawXXX方法就是Canvas中定义好的能画什么的方法(drawPaint除外),除了各种基本型比如矩形圆形椭圆直曲线外Canvas也能直接让我们绘制各种图片以及颜色等等,但是 ...
随机推荐
- 【redis专题(5)】命令语法介绍之sets
标签(空格分隔): Redis 关于 redis的无序集合有三个特点: 无序性, 确定性(描述准确) , 唯一性: 有点类似于数据容器: 增 SADD key member1 [member2] 作用 ...
- 洗礼灵魂,修炼python(53)--爬虫篇—urllib模块
urllib 1.简介: urllib 模块是python的最基础的爬虫模块,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如 ...
- VsCode 的使用
一.简介 VsCode(Visual Studio Code),官网地址:https://code.visualstudio.com/ Visual Studio Code is a lightwei ...
- 使用parted创建gpt大分区例子
[root@VM000000518 ~]# parted /dev/xvde GNU Parted 2.1 Using /dev/xvde Welcome to GNU Parted! Type 'h ...
- django中的中间件机制和执行顺序
这片文章将讨论下面内容: 1.什么是middleware 2.什么时候使用middleware 3.我们写middleware必须要记住的东西 4.写一些middlewares来理解中间件的工作过程和 ...
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
错误信息如下: Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossExce ...
- C++中如何按照map中的value来进行排序
sort函数无法对map进行排序,网上的方法一般是通过将map转为vector后,再来使用sort进行排序. 如下, 比较函数 bool cmp(const pair<int,int> & ...
- ABAP 内表访问表达式的性能
内表访问表达式是ABAP 7.4中引入的重要特性,可以使语句变得更加简洁.美观.那么它的读写性能怎么样呢?我进行了一点点测试. 读取 测试代码,使用三种方式读取同一内表,分别是read table关键 ...
- 控件布局_RelativeLayout
android:layout_above 将该控件的底部至于给定ID的控件之上 android:layout_below 将该控件的顶部至于给定ID的控件之下 android:layout_toLef ...
- redis php扩展及基本命令
linux 安装php mysql redis memchache 等工具 用 OneinStack 安装步骤 注意 如果有单独数据盘,建议您先挂载数据盘,建议将网站内容.数据库放在数据盘中.如何挂载 ...