EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——蛋蛋读NVMe之一:为什么刘备需要NVMe
& `) y3 w% m5 D! }1 B+ e: m7 N+ p
) Z6 V: c" x# J7 g' G6 P4 `没有前戏,直接进入。蛋蛋就是这么个人。; o m% H# Q! V+ T; w! f. j
NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层。* w) k2 ?/ V9 E9 U
[size=0.83em]640.jpg (32.53 KB, 下载次数: 2)+ P) P8 z$ P/ e0 `& w
下载附件 [url=]保存到相册[/url]4 ]& V4 v: z; G" ~5 l
[color=rgb(153, 153, 153) !important]2016-2-29 21:49 上传
8 `# D3 N& I: r6 ?3 f2 }7 F6 ?7 S' Z3 i$ H& h# Z- e
& W# S0 ~9 w1 i" f! M5 V
6 C+ B1 f8 l1 S* W' T1 E! gNVMe在协议栈中处于应用层或者命令层,它是指挥官,军师,在三国的话,就是诸葛亮的角色。”运筹帷幄之中,决胜千里之外”。军师设计好计谋,就交由手下五虎大将去执行。NVMe的手下大将就是PCIe,它所制定的任何命令,都交由虎将PCIe去完成。虽然NVMe的命令可能可以由别的接口协议完成,但NVMe与PCIe合作形成的战斗力无疑是最强的。
( m, H K* U( F5 N) j$ u" b4 R1 ~! h* h4 S) y
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。% e) e# `" ~" Y! r; `- E; X
5 _2 Z' L8 B& C! I' x9 ?
在这样的背景下,Intel等巨头携天子以令诸侯,集大家智慧,制定出了NVMe规范,目的就是释放SSD性能潜力,解SSD倒悬之苦。5 n( {! b. T4 J- f
5 ~9 q( L6 O6 ]) M: [4 Y6 h% \ 0 s& b% a( f, p% X
上面只列了几个巨头,参与的公司远不止这些。没有上榜的公司不要见怪。
: o% z6 t+ v7 b0 v! k7 @) z, g, ~
: y. K9 v; |3 t% ^3 \
+ T B( n9 ^) SNVMe制定了Host与SSD之间通讯的命令,以及命令如何执行的。( C2 ^) \& Z' D" B% n" o
6 r0 S* ]( O( p
NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。下面是NVMe1.2支持的命令列表:) P' z! E: o! J+ b
0 Q6 }6 `5 U `' c
NVMe支持的Admin Command:& F) w9 U- }" [6 Y1 {
4 d* E* e6 m3 O" C% t* nNVMe支持的I/O Command:
# v9 p+ U, X8 \ ; Q8 ?! ?+ p9 E+ I4 q* G2 H$ s w5 J; q
跟ATA spec中定义的命令相比,NVMe的命令个数少了很多,完全是为SSD量身定制的。大家现在别纠结于具体的命令,了解一下就好。老板交代干活的时候,再找spec一个一个看吧。) I ?9 \, e5 c9 Z2 J' i
5 U- n. \* ?3 ]0 J1 ] f命令有了,那么,Host又是怎么把这些命令发送给SSD执行呢?+ `# M* y) Y9 l1 f- ]; R1 t1 W
) ?' a, Z$ t! ?5 q# `. ]8 aNVMe有三宝:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。 SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。上图:
* t( l% @3 g: P O8 F: _$ K @ ) ^$ z7 U0 i8 D0 \
这张图信息量比较大,除了让我们知道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和小蜜之间还隔着一座南桥呢。滚蛋吧,南桥君!
3 Z" g3 ]) I# |1 L5 q% k; k1 Q' @& s
扯远了,刚才要说什么来着。对了,是三宝。SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。DB(大宝?)又是干什么用的呢?Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,那怎么通知SSD来获取命令执行呢?Host就是通过写SSD端的大宝寄存器来告知SSD的:饭已OK了,下来密西吧!
+ W( i6 _1 }$ d* u: h( R) `
* S3 A- H+ C- Y, d+ w) ]6 ZOK,具体的我们来看看NVMe是如何处理命令的,看图说话:
' l: v& c. g0 z/ V$ { ( P, A/ B- u4 C6 \ t$ Y2 y
这是NVMe1.2规范中的第207张图。不知道是人家图画得好呢,还是NVMe就是这么简单,抑或是我比较聪明,反正上面的命令处理流程我一看就明白了。好吧,给没我聪明的人再解释一下。
" G* w% B% `' C/ w; H2 I: I n( Z3 l) K( P" k, N* b) }' i$ a
说,把大象放冰箱一共要几步?答:三步。
1 W9 u' z, A* v8 D4 A第一步,打开冰箱门;
. O* \0 i) f$ \0 f9 Q }6 J第二步,放进大象; z3 w2 H K' G8 [
第三步,关上冰箱门。
9 w g9 X# o0 G- x) d7 g5 X说,NVMe处理命令需要几步?答:八步:8 N" U2 Y$ e* U. ?1 T3 h
第一步:Host写命令到SQ;
* K; l# G, G! j; W5 m第二步:Host写DB,通知SSD取指;, I- E% I$ ?9 n- ~- v
第三步:SSD收到通知,于是从SQ中取指;, r2 G h h- w
第四步:SSD执行指令;' X t; R0 Q) A0 q" x( |+ P3 J2 `
第五步:指令执行完成,SSD往CQ中写指令执行结果;5 E' A2 `* \, Q9 b J, Y1 m
第六步:然后SSD发短信通知Host指令完成;
: | m+ u$ r/ h8 t% u& M) p% x第七步:收到短信,Host处理CQ,查看指令完成状态;
. K) I- k+ u1 u第八步:Host处理完CQ中的指令执行结果,通过DB回复SSD:指令执行结果已处理,辛苦您了!5 d) D( j, V3 F' D
# V) R) I$ X: _6 d! c曹植七步作诗,NVMe就比曹植差一点,需要八步。& f) H8 e: l0 X1 Q/ h5 s" B4 I$ ?0 q% R
" Y8 h0 W1 B& @1 Y$ Q8 M4 z
关于NVMe,到现在相信大家有了一些基本认识。关于更多技术细节,今天我不打算讲了。我要吸取之前的教训,比如在一篇文章里就把SSD基本原理介绍了,而不是分别介绍。这样很不讨巧,一口气写完,对自己写文章是压力,对读者读文章也是压力,对网站的浏览量也不好。阿呆的做法值得学习,一个话题,采用连载的方式推出,有朋友也这么向我建议,于是我决定采取类似方式来谈NVMe,毕竟NVMe是个大话题。于是,我把标题从”蛋蛋读NVMe”改成”蛋蛋读NVMe之一”,后面还有之二,之三。。。接下来《蛋蛋读NVMe之二》我会详细解读NVMe的三宝 (SQ,CQ,DB),敬请期待。 * H `! o8 x( N2 n. H' H* s$ Z% i
* c: n$ F$ C7 I* I f( _ |