PMC已经被MicroSemi收购了,说PMC是因为顺嘴 (反正Microsemi也不给稿费) J
PMC管自己的PCIe SSD主控叫Flashtec NVMe Controllers,一共有4款 PM8602 NVMe1016, PM8604 NVMe1032, PM8607 NVMe2016,PM8609 NVMe2032。其实主要是有两款,10xx和20xx,再分别支持16和32 channel。
在看官网的介绍时,有这么一段话介绍电源管理优化的。
里面提到一个术语,叫做Enterprise NVM Express dynamic power management interface。企业,动态,电源管理,接口,瞬间觉得有点高大上。
这块之前不了解,那就研究一下。
第一个问题,什么是Enterprise NVMe?
Bing了半天搜不到。先去问SSDFans的两位领导阿呆和蛋蛋,都不理我。然后去问了内部高人冬瓜哥和外部高人唐杰,都说没听过,基本确认加上Enterprise这个前缀是为了提升Bigger。
第二个问题, NVMe电源管理有些啥?
一顿查,查到下面这个Roadmap
- Autonomous power transition
- Active/Idle Power
- RTD3
这是NVMe做PM大概的范围,上面这些术语我就不翻译了,大家都是过了4,6级的人。
第三个疑问,这个Dynamic Interface是什么?
这个翻NVMe spec (NVMe 1.2a),看下面的highlight的部分,PMC说的动态接口应该就是对应NVMe电源管理这部分。
NVMe 1.2a Section 8.4
PMC的官方介绍
看一下NVMe里给出的这样动态电源管理的框图。
Power objective和Performance Objective: 系统层面的应用有功耗和读写性能的目标,这个是输入。
Power Manager (Host Software): 这个我理解是NVMe Controller Device Driver
NVMe Express Power State: NVMe规定(Identify Controller Data Structure)最多支持32个Power State Descriptor,其中Power State Descriptor 0是必须support 的,其他都是可选。
当然,如果只支持一个,也别玩什么Dynamic Management了。
。。。
。。。
每一个Power State Descriptor 里有些什么属性?看Identify – Power State Descriptor Data Structure,如下图
每个Power State Descriptor数据结构为32 Byte,里面包括了该Power State下各种属性:
Active Power Scale: 该Power state下Active模式功耗的粒度
Active Power: 该Power state下Active模式的最大平均功耗, 这个值乘以上面的Scale, 就是实际功耗值
Relative Write Latency: 该Power state下的写延迟, 值越小代表延迟越低 (这个值的分级级数必须小于Controller支持的Power State数量,Controller不能一边说只支持5个Power State,一边说可以支持10种写入延迟,这个是耍流氓)
Relative Write Throughput: 该Power state下的写入吞吐量:值越小代表吞吐量越高 (这个值的分级级数同样必须小于Controller支持的Power State数量)
解释了Active和Write,Idle和Read也就理解了。Host和Controller之间,就通过对这些Field的修改,实现下面的沟通。
Entry Latency: 进入该Power State的时间(微妙级)
Exit Latency: 退出该Power State的时间(微妙级)
这两个值给Host,Host根据这个来决策是否进入,何时进入某个Power State。
Non-Operation State:为’0’代表在这个Power State Controller会处理IO,为’1’代表在这个Power State Controller不会处理IO
第四个问题,Host的具体操作?
- Host给Controller发个Identify Controller Command, Controller会回复一个4K的数据包。
- Host解析Byte 263获知Controller支持的Power State的数量
-
Host解析Byte 2079:3140获知每个Power State下Controller的具体属性
- 例如Controller可以支持四种Power State
- PS0: 均衡模式 (平衡考虑功耗,读写性能,延迟,但每个都不突出)
- PS1: OLTP模式 –大量随机小IO (要求低延迟)
- PS2: 视频模式 –大小连续大IO (要求高吞吐量)
- PS3: 绿色模式 – 低能耗
-
Host根据正在运行的应用(例如邮箱服务,数据库服务,视频服务和股票交易服务等)选择让Controller合适的Power State,具体实现是通过Set Feature Command(Feature ID 0x02),在DW 11的Bit 04:00写入
5.同理,Host也可以通过Get Feature Command来获知当前Controller所处的Power State
设几个State跳来跳去容易,具体的跳转策略:结合IO Pattern,功耗要求和Enter/Exit Latency来决定跳不跳,何时跳,跳哪里才是核心价值。这块没法继续看spec找答案了,要是蛋蛋给买块卡,阿呆给弄台PCIe analyzer, 抓几个典型应用场景切换时的PCIe trace,那应该可以发现部分策略,另外可以读到支持的Power State Descriptor,可能也能反推出一些策略的考虑点。