SSD常见问题的技术分析
AHCI对性能的影响
AHCI,全称Advanced Host Controller Interface,即高级主机控制器接口,是一种相比老旧的“IDE虚拟模式”更适合新一代SATA存储设备通信的协议(如果主板BIOS不开启AHCI,那么SATA设备其实是工作在IDE虚拟模式下的,南桥会把SATA设备认为是老旧的IDE设备,占用主板IRQ 14/15),通过它可激活设备的高级SATA功能如原生指令队列和热插拔,支持64bit LBA寻址(大容量机械盘会需要),完全抛弃老一套的“主/从”设备概念,高级电源管理(HIPM/DIPM),端口复用等等。
其中对SSD性能有影响的就是NCQ(Native Command Queuing,原生指令队列)。目前主流的SSD产品都已支持NCQ,NCQ主要是为了在高并发多线程读写的情况下重新排列读写指令顺序,尽量提供更高的并行读写可能性,从而掩盖多线程并发读写延迟而产生的。在SSD支持的情况下,开启AHCI模式可以使多线程、深并发队列的读写请求,通过NCQ重新排列读写指令操作顺序来让SSD按NCQ已重排的串行数据流做并行读写操作,这样便可以大大的提高随机读写IOPS性能。
技术上说,Trim指令也支持IDE模式,不过在IDE模式下执行Trim时,他会禁用系统的读写指令。因此Trim的时候可能造成系统出现无响应,而具体时间取决于Trim的范围,一般在几秒到几分钟,非常影响用户体验。
LPM节能技术的作用
LPM,全称Link Power Management,是SATA接口物理层上的一个功能,它能够将主机(Host)和存储设备(Device)的链接分成3种形态:Active、Partial和Slumber形态,目的是降低物理层总线传输速度,这样即可有省电的功效。由主机(Host)发出改变形态请求的我们叫做HIPM(Host-Initiated LPM, HIPM),而直接由设备(Device)发出形态请求的叫(Device-Initiated LPM,DIPM)
Intel Rapid Storage Technology驱动支持LPM功能来降低高速高容量存储设备的耗电。当然,LPM功能首先需要SATA硬盘支持这个功能。从ICH6M开始,笔记本平台安装完Intel Matrix Storage Manager驱动(RST 驱动前身)后就默认支持LPM。台式机平台从ICH9R开始支持(需要安装Intel Matrix Storage Manager 7.5版本及更新的驱动),但是默认并没开启。
从Intel Rapid Storage Technology 10.0版驱动开始,默认安装完驱动后是开启LPM的(包括所有笔记本和台式机平台)。
所以造成高速SSD使用中卡顿的问题很可能是Intel Rapid Storage Technology驱动的问题导致(还有部分可能是主机板不兼容,或者设置问题导致),既然这个技术是为了节能而开启的,为何会带来卡顿问题呢?目前主流的SSD可都是已支持LPM技术的。
本站neeyuese猜想带来卡顿的原因主要有下面几个:
1.主机发送HIPM形态改变指令,而SSD设备标准不同,不能很好的支持,出现兼容问题导致卡顿;
2.主机发送HIPM形态改变指令太频繁,导致SSD设备不能及时反映,出现不兼容而卡顿;
3.LPM开启后造成SATA总线传输延迟增加,导致高速SSD的传输受到阻塞而卡顿;
4.SSD内部的DIPM和主机请求的HIPM发生冲突导致卡顿。
不管如何,目前解决卡顿的方法就是完全禁用LPM,虽这样会带来耗电的增加,但总比卡顿来得舒服
SSD性能(跑分)下降的原因
对于接触SSD不久的人,经常都会产生一种疑问,那就是当SSD使用过一段时间后,再运行测试软件,得到的成绩几乎都肯定要比刚买回来时差,而且时间越长,差距就越明显,这是为什么呢?
大家从之前的内容已经了解SSD的工作原理及特点,相比传统HDD,SSD最大的差异就在于其使用的NAND闪存无法进行覆盖操作,在已经被写入数据的位置,要重复写入的话,SSD就必须先对该位置进行擦除的操作,而且擦除操作的最小单位比写入操作的要大。说到这里,相信大家都已发觉原因所在了。
SSD写入数据后,相同的地方未进行擦除是无法再写入数据的,当有需要写入新数据时,就只能写入到‘空闲’的地方,但若‘空闲’的地方不足以存放需要写入的数据,SSD便要进行GC,而GC操作是肯定要消耗占用一部分的SSD性能的,因此此时进行测试,所得的成绩自然就比刚买回来的时候要差,那时因为没写入过数据,全盘空间都是‘空闲’的,没需要进行GC,SSD自然可以用全部性能来进行测试。
上面是一张本站neeyuese所画关于SSD三种状态的图片,大家看过后应该更能理解SSD下降的性能都跑到什么地方去了。
SSD为何必须分区对齐
通过前面SSD相关知识的介绍,大家应该已经知道,NAND颗粒的最小写入单位是页,而一般每个页的大小是4KB。在HDD时代,分区起始扇区的定义在第63个扇区,也就是31.5KB的位置,这里各位应该会发现问题了,31.5KB并不是4KB的整数倍,若继续使用这个分区方式,势必导致以后每写入一个页(4KB)的数据,都必须要横跨写入到2个页内,这样不单写入时间增加一倍,WA同样也增加了一倍(写一页实际变成写二页)。因此不管从任何方面来说,对SSD都不是一件好事,既影响性能表现(最显著的就是测试成绩低下),也影响SSD的寿命。
如图上所示: 图中SSD出现分区没对齐问题,读写正好在2个16KB边界,所以需要做2次读-改-写操作,那么我们说这时候的操作所需时间就 是原来的2倍。如果系统请求写入4KB,那么发生这种情况的概率就是25%(图中第一个4KB在边界,后面3个在16KB内,而第5个又到下个16KB边 界了),性能为原本的80%。如果把写入请求提升到32KB的话,发生的概率就是8/9了,随着请求容量的增大,差距就会缩小。所以对持续速度来说,分区不对齐并不会影响很大。
IOPS数值的意义
IOPS,中文为每秒操作数,代表一个在定义的数据传输尺寸大小下每秒能够操作这个尺寸数据的次数。数值越高代表对磁盘IO响应能力越好,可以提高系统IO的响应能力,大大提高用户体验。在一些高密度IO场合(大多数是企业级应用),IOPS是关键性能参数。但对于一般家庭消费者而言,10000的IOPS和100000的IOPS,并无多大差别,因为家用环境上,无法用到这么高的IOPS性能。
SSD常见问题的技术分析的更多相关文章
- [转帖]SSD和内存数据库技术
SSD和内存数据库技术 自己的理解还是不是很对 SSD 提升的是 随机读 并没有对顺序写有多大的提升, 因为数据库采用的是redo的模式. 理论上写入 时是顺序写 所以 写并发的提升不会很大 但是会很 ...
- 蓝牙协议分析(7)_BLE连接有关的技术分析
转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...
- WaterfallTree(瀑布树) 详细技术分析系列
前言 WaterfallTree(瀑布树) 是最强纯C#开源NoSQL和虚拟文件系统-STSdb专有的(版权所有/专利)算法/存储结构. 参考 关于STSdb,我之前写过几篇文章,譬如: STSdb, ...
- iOS直播的技术分析与实现
HTTP Live Streaming直播(iOS直播)技术分析与实现 发布于:2014-05-28 13:30阅读数:12004 HTTP Live Streaming直播(iOS直播)技术分析与实 ...
- 横向技术分析C#、C++和Java优劣
转自横向技术分析C#.C++和Java优劣 C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍.抛却Microsoft与Sun之间的恩怨与口角,客观地从技术上讲,C#与Java都是对传统 ...
- tolua++实现lua层调用c++技术分析
tolua++技术分析 cocos2dx+lua 前言 一直都使用 cocos2dx + lua 进行游戏开发,用 Lua 开发可以专注于游戏逻辑的实现,另外一方面可以实现热更新:而且 lua 是一个 ...
- 美链BEC合约漏洞技术分析
这两天币圈链圈被美链BEC智能合约的漏洞导致代币价值几乎归零的事件刷遍朋友圈.这篇文章就来分析下BEC智能合约的漏洞 漏洞攻击交易 我们先来还原下攻击交易,这个交易可以在这个链接查询到. 我截图给大家 ...
- NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案
原文地址:http://blog.nsfocus.net/nssock2-dll-module-malicious-code-analysis-report/ NetSarang是一家提供安全连接解决 ...
- 包建强的培训课程(3):App竞品技术分析
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- 浅谈JavaScript中的内存管理
一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...
- java代码如何快速添加作者描述的注释最好能有详细的图解
MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Java->Editor->Templates,在这 ...
- 移动并改变alpha
<script type="text/javascript">function obj(x){return document.getElementById(x);}va ...
- 通过innerHTML简化脚本
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- Scala数组操作实战详解
增删改查,要注意的是,Array数组是定长数组,ArrayBuffer数组才是变长数组. 其他集合也存在可变不可变.例如,List,Set,Map 多维数组定义方法与Java类似.
- CSS自学笔记(4):CSS样式表的使用
当浏览器读到一个样式表时,浏览器会根据这个样式表来格式化html文档,从而表现出各式各样的网页. 想要浏览器读到样式表,有三种方法: 1.外部样式表 外部样式表可以理解为.CSS文件.当多个页面使用同 ...
- Activity篇章参考
附上学习这部分知识的时候收集的一些比较好的链接: Task and backStack|Android Developer adb shell dumpsys activity 单个apk多进程 Ac ...
- ALOS卫星介绍
ALOS卫星介绍 作者:ALOS 文章来源:ALOS 点击数: 更新时间:2013-6-21 摘要:日本地球观测卫星计划主要包括2个系列:大气和海洋观测系列以及陆地观测系列.先进对地 ...
- Win32中安全的子类化(翻译)
关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe ...
- C语言入门(13)——循环
在递归调用中,其实每次递归都是在重复做同样一件事,比如求阶乘就是把n乘到(n-1)!上然后把结果返回.虽说是重复,但每次做都稍微有一点区别(n的值不一样),这种每次都有点区别的重复工作称为迭代. 我们 ...