EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——蛋蛋读NVMe之一:为什么刘备需要NVMe
% {$ d9 B; p' \$ A% R9 ^
6 @7 H+ }9 i- Z$ W( h# w$ O没有前戏,直接进入。蛋蛋就是这么个人。
, [& D: |5 k/ c" f5 `1 M+ b: H0 yNVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。
( p- J. n$ @# v4 m, n( u+ g5 Y" B [size=0.83em]640.jpg (32.53 KB, 下载次数: 2)
. X0 N# P2 [. H, V7 [下载附件 [url=]保存到相册[/url]
. @8 l4 [- O) V7 @' S: |- r[color=rgb(153, 153, 153) !important]2016-2-29 21:49 上传
6 X, Y' _$ x0 z* M5 X# s0 O h1 R) g1 y: p
3 i% J0 `1 G/ Y% s2 K: e* v& \1 ?4 _ t
NVMe在协议栈中处于应用层或者命令层,它是指挥官,军师,在三国的话,就是诸葛亮的角色。”运筹帷幄之中,决胜千里之外”。军师设计好计谋,就交由手下五虎大将去执行。NVMe的手下大将就是PCIe,它所制定的任何命令,都交由虎将PCIe去完成。虽然NVMe的命令可能可以由别的接口协议完成,但NVMe与PCIe合作形成的战斗力无疑是最强的。
1 |5 q2 T* d! x l; ^! g9 }3 A, f. t; r1 ~4 ^
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。
8 q: ^9 S$ u) P4 H2 J' Z9 Q1 R$ r) B$ G( a. I
在这样的背景下,Intel等巨头携天子以令诸侯,集大家智慧,制定出了NVMe规范,目的就是释放SSD性能潜力,解SSD倒悬之苦。
8 h0 y/ g7 w* Q, F v) i4 ^' F* y1 I2 e, a+ ^9 U/ C
. Y; j: u( |# \5 y$ O' ^: ^上面只列了几个巨头,参与的公司远不止这些。没有上榜的公司不要见怪。
3 @* q( g* H9 n/ m
0 M& y4 B: N2 ?- x8 U$ A1 i d$ }9 H; R% ]3 W+ @7 p. ?# j+ i
NVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。
, R/ K! z$ l3 Y7 j# R7 J6 u- Z9 t, U2 P# A/ Q- {
NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:
0 C2 Z8 G& ~+ ~- g u( u( T1 k$ o" R4 ^/ w- R
NVMe支持的Admin Command:: o* C" ~& h5 _: S9 }. ^
8 x, S5 Z4 g* T5 h$ C0 {4 ~
NVMe支持的I/O Command:) f3 H' w [0 m% F0 X
9 Q* `" q: a0 M0 L9 N# h7 k3 ^ U
跟ATA spec中定义的命令相比,NVMe的命令个数少了很多,完全是为SSD量身定制的。大家现在别纠结于具体的命令,了解一下就好。老板交代干活的时候,再找spec一个一个看吧。
( `9 D) E6 ]. C& U# b* \1 d+ T$ D& g" D" M& Z2 P4 }
命令有了,那么,Host又是怎么把这些命令发送给SSD执行呢?& F! N. [5 D) B0 h6 A0 {6 Z
0 c4 ~* ?. t9 @' Y
NVMe有三宝:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。上图:
$ V' }+ n3 c+ S: [
' {) m4 J* V3 g; }0 t- n/ a* d这张图信息量比较大,除了让我们知道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和小蜜之间还隔着一座南桥呢。滚蛋吧,南桥君!
# y* G) |* [' `. r* I; Q. W$ Y' I" x/ j$ Q8 Z) k
扯远了,刚才要说什么来着。对了,是三宝。SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB(大宝?)又是干什么用的呢?Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,那怎么通知SSD来获取命令执行呢?Host就是通过写SSD端的大宝寄存器来告知SSD的:饭已OK了,下来密西吧!
& v9 q) u* f4 m. ~7 Q% g* k- J) X+ e/ b4 ~" Y' c2 a
OK,具体的我们来看看NVMe是如何处理命令的,看图说话:& U- q. U: d3 D( b4 T% j6 a! F
/ S- ] n- u* M这是NVMe1.2规范中的第207张图。不知道是人家图画得好呢,还是NVMe就是这么简单,抑或是我比较聪明,反正上面的命令处理流程我一看就明白了。好吧,给没我聪明的人再解释一下。+ N% e* @5 P$ ]% t( Z& j9 q
" g# ~1 V) S d% ?- S说,把大象放冰箱一共要几步?答:三步。
1 A* n- l) T$ h; j8 Q第一步,打开冰箱门;( {" W8 c) z9 Y$ V+ W9 Z, O% E0 Z
第二步,放进大象;
6 V0 ]* F& M1 h7 r% f0 |第三步,关上冰箱门。+ c, k# A& y. M: v+ b- L+ K2 X5 F
说,NVMe处理命令需要几步?答:八步:
/ @6 c1 Y& E. q% C" ]第一步:Host写命令到SQ;
9 M; n& v2 G* u1 A0 q第二步:Host写DB,通知SSD取指;- i8 p9 F4 d4 s1 E: s1 P+ B
第三步:SSD收到通知,于是从SQ中取指;: C* Y2 {7 b$ W# ~% @
第四步:SSD执行指令;) ?5 c |2 f0 ]0 [. i
第五步:指令执行完成,SSD往CQ中写指令执行结果;! {6 X" t- v4 B- ]. ~1 {9 v3 p f6 b
第六步:然后SSD发短信通知Host指令完成;! i6 A, c W4 {2 f# T7 R0 X: C
第七步:收到短信,Host处理CQ,查看指令完成状态;
3 U3 N( _4 _% w& y5 E第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理,辛苦您了!
* w5 d+ _5 L* t; P7 {2 ? x
# Y1 u; I! D. i( Q; S曹植七步作诗,NVMe就比曹植差一点,需要八步。
, b/ ]5 I6 x( h2 `+ q6 |, R8 `" ~5 v/ u7 P
关于NVMe,到现在相信大家有了一些基本认识。关于更多技术细节,今天我不打算讲了。我要吸取之前的教训,比如在一篇文章里就把SSD基本原理介绍了,而不是分别介绍。这样很不讨巧,一口气写完,对自己写文章是压力,对读者读文章也是压力,对网站的浏览量也不好。阿呆的做法值得学习,一个话题,采用连载的方式推出,有朋友也这么向我建议,于是我决定采取类似方式来谈NVMe,毕竟NVMe是个大话题。于是,我把标题从”蛋蛋读NVMe”改成”蛋蛋读NVMe之一”,后面还有之二,之三。。。接下来《蛋蛋读NVMe之二》我会详细解读NVMe的三宝 (SQ,CQ,DB),敬请期待。
* a/ M) q, }4 E" w, q. V& B' ]( H* ~
|