EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——蛋蛋读NVMe之一:为什么刘备需要NVMe
8 K0 g0 `3 r7 n6 e# X$ R6 z6 f" \7 K2 }3 a$ H
没有前戏,直接进入。蛋蛋就是这么个人。( O, j6 V) L V$ h H% a
NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。 r2 f1 i, p: i6 t, F3 K
[size=0.83em]640.jpg (32.53 KB, 下载次数: 2)# J* t: c: ?6 C0 {
下载附件 [url=]保存到相册[/url]
. H8 J0 B6 f2 R( I$ {' L[color=rgb(153, 153, 153) !important]2016-2-29 21:49 上传
+ m; u. O1 E, D
+ V" b3 T: T; W
}6 B& N# e8 U; D; Z) @& T. X1 n" G9 X0 Z
NVMe在协议栈中处于应用层或者命令层,它是指挥官,军师,在三国的话,就是诸葛亮的角色。”运筹帷幄之中,决胜千里之外”。军师设计好计谋,就交由手下五虎大将去执行。NVMe的手下大将就是PCIe,它所制定的任何命令,都交由虎将PCIe去完成。虽然NVMe的命令可能可以由别的接口协议完成,但NVMe与PCIe合作形成的战斗力无疑是最强的。
5 M+ x$ v4 U3 h' W( g& ^* W3 `3 \2 C# ]9 [5 y N. e' X
NVMe是为SSD所生的。NVMe出现之前,SSD绝大多数走的是AHCI和SATA的协议,后者其实是为传统HDD服务的。与HDD相比,SSD具有更低的延时和更高的性能,AHCI已经不能跟上SSD性能发展的步伐了,已经成为制约SSD性能的瓶颈。所有SATA接口的SSD,你去看性能参数,会发现都不会超过600MB/s。如果碰到有人跟你说它的SATA SSD读取性能可以超过600MB/s,直接拨打110报警。不是底层Flash带宽不够,是SATA接口速度限制了,因为SATA现在最高带宽就是600MB/s。OK,既然SATA接口速度太慢,我用PCIe好了,不过上层协议还是AHCI。五虎上将有了,由刘备指挥,让人不禁感叹暴殄天物呀。刘备什么水平,诸葛亮出现之前,居无定所,一会跟着曹操混,一会又跟着吕布混,谁肯收留就跟谁混。惨呀!AHCI和刘备一个德行,只有一个命令队列,最多同时只能发32条命令,HDD时代(群雄逐鹿)还能混混,SSD时代(三足鼎立)就只有被灭的份。刘备需要三顾茅庐,需要诸葛亮的辅佐。同样,SSD需要PCIe,更需要NVMe。
- \( ]# y9 [3 b( L8 }, N. B
. e0 Y" @+ n2 V- y: d- Q在这样的背景下,Intel等巨头携天子以令诸侯,集大家智慧,制定出了NVMe规范,目的就是释放SSD性能潜力,解SSD倒悬之苦。1 A v" Q y6 t8 }# r; b8 p
2 o8 o# N( p2 a' X6 [/ e; \+ Q
1 N6 v# O0 w% y% Y* ~8 [0 G9 h- e上面只列了几个巨头,参与的公司远不止这些。没有上榜的公司不要见怪。
/ m# B* n! w! {2 f, e7 [5 S: U0 D: q" C* V+ M6 ]
, G N+ N- j" V6 v3 k+ I. C4 DNVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。
) f) m6 \7 F" \6 W( ?; h& R! N9 Z" C+ z! o+ b2 |8 D
NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:
+ `7 }7 y8 e; d& X- t
! q% B+ X6 N' |; L0 K6 a$ mNVMe支持的Admin Command:
8 q5 u& @/ f, W" M; |
: i" h* p; a; c7 _2 J3 ^4 ZNVMe支持的I/O Command:
; g5 M5 B2 \' D( A+ G
- N& f% a: }7 i跟ATA spec中定义的命令相比,NVMe的命令个数少了很多,完全是为SSD量身定制的。大家现在别纠结于具体的命令,了解一下就好。老板交代干活的时候,再找spec一个一个看吧。6 q+ A: w: d$ Q) C$ C) ?
5 {) n0 v+ c' R! c: D( F7 z9 B" O6 H
命令有了,那么,Host又是怎么把这些命令发送给SSD执行呢?, s, s- g4 R- M( i) t$ e! c9 {
6 k+ L" M4 ?! ^. w2 H$ FNVMe有三宝:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。上图:" B) r$ l e5 Y2 T
+ K, ^3 m! b" \( C7 W这张图信息量比较大,除了让我们知道SQ和CQ在Host的memory中以及DB在SSD端外,而且让我们对一个PCIe系统有一个具体的认识。上图中的NVMe Subsystem一般就是SSD。请看这张图几秒钟,然后闭上眼,脑补SSD所处的位置:SSD作为一个PCIe Endpoint通过PCIe连着Root Complex (RC), 然后RC连接着CPU和内存。RC是什么?我们可以认为RC就是CPU的代言人,助理,或者小蜜。作为系统中最高层,CPU说:我很忙的,你SSD有什么事情先跟我小蜜说!尽管如此,SSD的地位还是较过去提升了一级,过去SSD别说直接接触霸道总裁,就是连小蜜的面都见不到,SSD和小蜜之间还隔着一座南桥呢。滚蛋吧,南桥君!
, R* n8 }- |6 L! I+ |! b
6 W: o6 F: w8 [5 U! {% L! q3 O扯远了,刚才要说什么来着。对了,是三宝。SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB(大宝?)又是干什么用的呢?Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,那怎么通知SSD来获取命令执行呢?Host就是通过写SSD端的大宝寄存器来告知SSD的:饭已OK了,下来密西吧!
; E4 w7 q& s {/ g- \1 y) `9 J0 u4 l
OK,具体的我们来看看NVMe是如何处理命令的,看图说话: l# {# K0 f- m5 u
$ S4 W5 x# N' p: o7 Z
这是NVMe1.2规范中的第207张图。不知道是人家图画得好呢,还是NVMe就是这么简单,抑或是我比较聪明,反正上面的命令处理流程我一看就明白了。好吧,给没我聪明的人再解释一下。, E3 o. s6 Z+ d% R. J' Y. |9 L
, ~% L8 g5 O" i# w/ |0 X, \) W
说,把大象放冰箱一共要几步?答:三步。
6 g0 `: `' v7 |' F第一步,打开冰箱门;) Z6 X2 x% P2 _: w" p
第二步,放进大象;
. W& j; L: d% b# y第三步,关上冰箱门。
3 ]6 D$ k& D$ o2 U说,NVMe处理命令需要几步?答:八步:
5 Y7 S. V( B" }6 |+ Z第一步:Host写命令到SQ;
+ W m, u7 \" k; n9 ^第二步:Host写DB,通知SSD取指;) w- _& F8 A5 W b4 n6 K0 F
第三步:SSD收到通知,于是从SQ中取指;& C+ c2 J/ q3 K- l! [8 n# `
第四步:SSD执行指令;
* T6 U. T( k. l3 a# J* n) b5 @7 I# N第五步:指令执行完成,SSD往CQ中写指令执行结果;, [# X& c3 K2 \9 C# n% i
第六步:然后SSD发短信通知Host指令完成;* e$ J2 x0 L" U" q! V+ L( ]
第七步:收到短信,Host处理CQ,查看指令完成状态;
1 Y8 o5 [1 s e" U1 t% V$ n第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理,辛苦您了!6 p3 L+ W% F# W5 h q* j% }& h
- T+ }0 _! B, ]
曹植七步作诗,NVMe就比曹植差一点,需要八步。
, s' o" l& }0 B6 ^2 M
% F: M) ?& F5 G, r) J4 c, V. \关于NVMe,到现在相信大家有了一些基本认识。关于更多技术细节,今天我不打算讲了。我要吸取之前的教训,比如在一篇文章里就把SSD基本原理介绍了,而不是分别介绍。这样很不讨巧,一口气写完,对自己写文章是压力,对读者读文章也是压力,对网站的浏览量也不好。阿呆的做法值得学习,一个话题,采用连载的方式推出,有朋友也这么向我建议,于是我决定采取类似方式来谈NVMe,毕竟NVMe是个大话题。于是,我把标题从”蛋蛋读NVMe”改成”蛋蛋读NVMe之一”,后面还有之二,之三。。。接下来《蛋蛋读NVMe之二》我会详细解读NVMe的三宝 (SQ,CQ,DB),敬请期待。 : f9 z# G; k; k( y3 r C
( o- w4 r r4 C: r- T
|