英特尔傲腾持久内存100系列的测试使用与固件更新
简介
英特尔傲腾持久内存(PMem)是英特尔和镁光合作在2019年发布的一项颠覆性技术,它可以在内存与存储之间创建新的存储层,同时可以获得极高的顺序读和随机4k能力。
如下图。
PMem处于NAND SSD与DRAM之间,同样它的性能也处于SSD与DRAM设备之间,同时它比相同容量的DRAM更便宜。
Server设备中DRAM常用容量 8G / 16G / 32G / 64G
而PMem常用容量为 128G / 256G / 512G 3种规格
那么PMem设备如何使用?
首先看它的外观。
这是笔者得到的4张 256G 100型号的PMem设备。它的外观与内存条完全一样。
对的,你没有猜错。PMem是插在内存条上的设备,同时为了发挥它的最大性能,PMem要与DRAM进行一个配比并且插法也非常有讲究。一般来说DRAM与PMem的配比为1:4或1:8最佳,例如我的这张PMem为256G我使用32G DRAM搭配,这样就完成了一个1:8的搭配,在插法上,应将DRAM与PMem处于同一通道并且PMem应该插的更接近CPU。
如下图。
100系列为黑色马甲,200系列为蓝色马甲
配置要求
在进行测试前先说明下我的平台配置,并说明下傲腾持久内存一些运行必须要满足的要点。
首先说主要配置
主板: 技嘉C621WD12 双路3647平台
CPU: 志强二代可扩展铂金8259CL
内存: 镁光DDR4 32G ECC 2666 * 4
显卡这些就省了,对测试没啥影响。
另外说一下必备条件。
首先PMem不支持AMD平台。
100系列需要英特尔志强第二代金牌/铂金可扩展处理器才能支持。
200系列需要英特尔第三代可扩展金牌/铂金处理器。
基本排除民用
除了这些之外,需要主板也支持识别,另外由于持久内存这个概念提出的比傲腾持久内存要早(概念是2013年提出,但傲腾持久内存是世界上第一个量产的商用持久内存)所以主板中的配置有些一言难尽。
例如我这块板子也是2019同期生产的,它的配置叫做 NVDIMM
后期板子见过叫PMem的也有叫全称的,放在内存配置中的,也见过放在高级设置里的,同时会进行专项优化。
系统方面也是有要求的
PMem的三种配置模式,在一些低版本的Linux或Windows上只能使用其中一种或两种模式。
大致总结了下,Windows系统中最低需要在Windows Server 2016版以上才能使用,需要解放全部功能则需要使用Windows 2019版本以上。而在Linux内核系列,RHEL需要在7.5版本之后,Ubuntu需要在 16.04版本之后才能基本使用,全功能需要之后的版本例如RHEL 7.6 Ubuntu 18等
模式介绍
PMem 100系列有3种配置模式
内存模式(Memory Mode)
可以在内存模式下配置跨插槽的 100% PMem 容量。系统必须符合建议的 DRAM 与 PMem 容量比率。系统必须至少具有 1:4 的比率,并且每个 CPU 插槽不超过 1:16。例如,具有 192GB PMem 的系统应至少具有 768GB 的 PMem。如果配置不符合要求,ipmctl 和 BIOS 可能会在引导时报告警告。
应用直通模式(App Direct Mode)
可以在启用或禁用交错的应用直通模式下预配 PMem。交错可提高对 PMem 的读取和写入吞吐量。简单说就是可以将PMem挂载到本地硬盘同时断电不会丢失数据。
混合模式(Mixed Modes)
可以在内存模式下预置一定百分比的 PMem 容量,如下所述。任何剩余的 PMem 容量都可以保留或用于创建 AppDirect 区域。
发现PMem设备
在配置PMem之前,需要查看PMem是否正确被系统识别。
PS C:\Users\Administrator> Get-PmemPhysicalDevice DeviceId DeviceType HealthStatus OperationalStatus PhysicalLocation FirmwareRevision FruId -------- ---------- ------------ ----------------- ---------------- ---------------- ----- 0 INVDIMM device healthy {ok} 102005417 8089-a2-1840-... 100 INVDIMM device healthy {ok} 102005375 8089-a2-1840-...
查看所有PMem设备的状态和各项参数。
PS C:\Users\Administrator> ipmctl show -topology DimmID | MemoryType | Capacity | PhysicalID| DeviceLocator ================================================================================ 0x0000 | Logical Non-Volatile Device | 252.438 GiB | 0x0006 | P1_DIMM_A1 0x0100 | Logical Non-Volatile Device | 252.438 GiB | 0x0009 | P1_DIMM_D1 N/A | DDR4 | 32.000 GiB | 0x0007 | P1_DIMM_B1 N/A | DDR4 | 32.000 GiB | 0x000a | P1_DIMM_E1
查看PMem设备安装位置
PS C:\Users\Administrator> ipmctl show -memoryresources MemoryType | DDR | PMemModule | Total ======================================================= Volatile | 64.000 GiB | 0.000 GiB | 64.000 GiB AppDirect | - | 0.000 GiB | 0.000 GiB Cache | 0.000 GiB | - | 0.000 GiB Inaccessible | 0.000 GiB | 504.909 GiB | 504.909 GiB Physical | 64.000 GiB | 504.909 GiB | 568.909 GiB
报告有关当前配置的信息,不同的配置模式就会出现不同的配置信息,具体如下
PS C:\Users\Administrator> ipmctl show -memoryresources MemoryType | DDR | PMemModule | Total ======================================================= Volatile | 0.000 GiB | 504.000 GiB | 504.000 GiB AppDirect | - | 0.000 GiB | 0.000 GiB Cache | 64.000 GiB | - | 64.000 GiB Inaccessible | 0.000 GiB | 0.909 GiB | 0.909 GiB Physical | 64.000 GiB | 504.909 GiB | 568.909 GiB
配置PMem模式
内存模式(Memory Mode)配置
使用ipmctl create -goal memorymode=<比例%>命令将PMem划分出一定的比例作为内存使用。
PS C:\Users\Administrator> ipmctl create -goal memorymode=100 The following configuration will be applied: SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size =================================================================== 0x0000 | 0x0000 | 252.000 GiB | 0.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 252.000 GiB | 0.000 GiB | 0.000 GiB Do you want to continue? [y/n] y Created following region configuration goal SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size =================================================================== 0x0000 | 0x0000 | 252.000 GiB | 0.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 252.000 GiB | 0.000 GiB | 0.000 GiB A reboot is required to process new memory allocation goals. PS C:\Users\Administrator>
memorymode=100配置之后,实际DRAM 64G的系统变为504G,剩下的都为PMem分配。
内存模式的配置信息
PS C:\Users\Administrator> ipmctl show -memoryresources MemoryType | DDR | PMemModule | Total ======================================================= Volatile | 64.000 GiB | 0.000 GiB | 64.000 GiB AppDirect | - | 504.000 GiB | 504.000 GiB Cache | 0.000 GiB | - | 0.000 GiB Inaccessible | 0.000 GiB | 0.909 GiB | 0.909 GiB Physical | 64.000 GiB | 504.909 GiB | 568.909 GiB
应用直通模式(App Direct Mode)
应用直通模式叠加单插槽上的PMem容量,类似于Raid0,性能也会叠加。
PS C:\> ipmctl create -goal persistentmemorytype=appdirect The following configuration will be applied: SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size ================================================================== 0x0000 | 0x0000 | 0.000 GiB | 252.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 0.000 GiB | 252.000 GiB | 0.000 GiB Do you want to continue? [y/n] y Created following region configuration goal SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size ================================================================== 0x0000 | 0x0000 | 0.000 GiB | 252.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 0.000 GiB | 252.000 GiB | 0.000 GiB A reboot is required to process new memory allocation goals. PS C:\>
输入ipmctl create -goal persistentmemorytype=appdirect配置为AD模式,并重启系统。
PS C:\Users\Administrator> Get-PmemUnusedRegion RegionId TotalSizeInBytes DeviceId -------- ---------------- -------- 1 541165879296 {0, 100} PS C:\Users\Administrator> Get-PmemUnusedRegion | New-PmemDisk 正在创建新的持久性内存磁盘。这可能需要一段时间。 PS C:\Users\Administrator> Get-PmemDisk DiskNumber Size HealthStatus AtomicityType CanBeRemoved PhysicalDeviceIds UnsafeShutdownCount ---------- ---- ------------ ------------- ------------ ----------------- ------------------- 2 504 GB healthy None True {0, 100} 1165 PS C:\Users\Administrator>
使用Get-PmemUnusedRegion来查看未分配给系统中逻辑永久性内存磁盘的所有永久性内存区域。
使用Get-PmemUnusedRegion | New-PmemDisk创建PMem磁盘。
查看磁盘管理,按正常磁盘添加即可。
PS C:\Users\Administrator> ipmctl show -memoryresources MemoryType | DDR | PMemModule | Total ======================================================= Volatile | 0.000 GiB | 302.000 GiB | 302.000 GiB AppDirect | - | 202.000 GiB | 202.000 GiB Cache | 64.000 GiB | - | 64.000 GiB Inaccessible | 0.000 GiB | 0.909 GiB | 0.909 GiB Physical | 64.000 GiB | 504.909 GiB | 568.909 GiB
应用直通模式的配置信息
PS C:\Users\Administrator> Get-PmemDisk | Remove-PmemDisk 这将从系统中移除持久性内存磁盘,并且将导致数据丢失。 移除持久性内存磁盘? [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y 正在移除持久性内存磁盘。这可能需要一段时间。 PS C:\Users\Administrator>
使用Remove-PmemDisk命令更换故障PMem。
PS C:\Users\Administrator> Get-PmemPhysicalDevice | Initialize-PmemPhysicalDevice 这将初始化物理持久性内存设备上的标签存储区域,并且将导致数据丢失。 初始化物理持久性内存设备? [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): A 正在初始化物理持久性内存设备。这可能需要一段时间。 正在初始化物理持久性内存设备。这可能需要一段时间。 PS C:\Users\Administrator>
使用Initialize-PmemPhysicalDevice初始化物理永久性内存设备上的标签存储区,也可以清除设备上已损坏的标签存储信息。
混合模式(Mixed Modes)配置
C:\Users\Administrator> ipmctl create -goal Memorymode=60 The following configuration will be applied: SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size =================================================================== 0x0000 | 0x0000 | 151.000 GiB | 101.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 151.000 GiB | 101.000 GiB | 0.000 GiB Do you want to continue? [y/n] y Created following region configuration goal SocketID | DimmID | MemorySize | AppDirect1Size | AppDirect2Size =================================================================== 0x0000 | 0x0000 | 151.000 GiB | 101.000 GiB | 0.000 GiB 0x0000 | 0x0100 | 151.000 GiB | 101.000 GiB | 0.000 GiB A reboot is required to process new memory allocation goals. PS C:\Users\Administrator>
使用ipmctl create -goal Memorymode=<比例>,来确定内存与磁盘的配比。
完成后重启系统,查看任务管理器。
真正的DRAM只有64G,其余都是PMem的容量。
PS C:\Users\Administrator> Get-PmemUnusedRegion RegionId TotalSizeInBytes DeviceId -------- ---------------- -------- 1 216895848448 {0, 100}
使用Get-PmemUnusedRegion命令查看未分配给系统中逻辑永久性内存磁盘的所有永久性内存区域。
PS C:\Users\Administrator> Get-PmemUnusedRegion | New-PmemDisk 正在创建新的持久性内存磁盘。这可能需要一段时间。
使用New-PmemDisk进行容量创建。
顺利变为磁盘,进行常规挂载即可。
Linux
暂未测试
除了这些模式之外,PMem还可以使用英特尔开源的PMDK API直接调用,大大加强灵活性。
性能测试(AD模式)
Windows
使用比较常用的CrystalDiskMark 8测试读能力。
两条PMem在AD模式下使用16Mib文件,1队列 28线程 256K读取下86.922GB/s的顺序读能力,达到了现在NVME M.2固态的12~28倍左右,其实相较于顺序读,4k随机读写能力更是秒杀中的秒杀,我的三星企业级SSD只有可怜的500MB/s
状态监控
PS C:\Users\Administrator> ipmctl show -dimm DimmID | Capacity | LockState | HealthState | FWVersion =============================================================== 0x0000 | 252.454 GiB | Disabled | Healthy | 01.02.00.5446 0x0100 | 252.454 GiB | Disabled | Healthy | 01.02.00.5446
获取DimmID,DimmID是查询的索引
PS C:\Users\Administrator> ipmctl show -dimm 0x0000 -pcd --DimmID:0x0000-- --Pcd:LSA-- Label Storage Area : Current Index Signature : NAMESPACE_INDEX Flags : 0x0 LabelSize : 0x1 Sequence : 0x2 MyOffset : 0x0 MySize : 0x100 OtherOffset : 0x100 LabelOffset : 0x200 NumOfLabel : 0x1fe Major : 0x1 Minor : 0x2 Checksum : 0x26c629f766575b Hexdump: For 64 bytes 000: ffffffffffffffff ffffffffffffffff ........ ........ 016: ffffffffffffffff ffffffffffffffff ........ ........ 032: ffffffffffffffff ffffffffffffffff ........ ........ 048: ffffffffffffffff ffffffffffffff3f ........ ........ --Pcd:Config-- Table : PCD Config Header Signature : DMHD Length : 0x3c Revision : 0x1 Checksum : 0x12 OemId : INTEL OemTableId : EDK2 OemRevision : 0x2 CreatorId : INTL CreatorRevision : 0x20091013 CurrentConfDataSize : 0xb0 CurrentConfStartOffset : 0x3c ConfInputDataSize : 0xb8 ConfInputDataOffset : 0xec ConfOutputDataSize : 0xb8 ConfOutputDataOffset : 0x1a4 ---Table: PCD Current Config--- Signature : CCUR Length : 0xb0 Revision : 0x2 Checksum : 0xf3 OemId : AORUS OemTableId : A M I OemRevision : 0x2 CreatorId : INTL CreatorRevision : 0x20091013 ConfigStatus : 0x1 VolatileMemSizeIntoSpa : 0x0 PersistentMemSizeIntoSpa : 0x3f00000000 PcatTable : PCD Interleave Info Type : 0x5 Length : 0x78 InterleaveSetIndex : 0x1 NumOfDimmsInInterleaveSet : 0x2 InterleaveMemoryType : 0x2 InterleaveFormatChannel : 0x40 InterleaveFormatImc : 0x40 InterleaveFormatWays : 0x2 InterleaveChangeStatus : 0x0 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002dbb PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002b0d PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000 ---Table: Platform Config Data Conf Input table--- Signature : CIN_ Length : 0xb8 Revision : 0x2 Checksum : 0x39 OemId : INTEL OemTableId : EDK2 OemRevision : 0x2 CreatorId : INTL CreatorRevision : 0x20091013 SequenceNumber : 0x1 PcatTable : PCD Partition Size Change Type : 0x4 Length : 0x10 PartitionSizeChangeStatus : 0x0 PartitionSize : 0x3f1d140000 PcatTable : PCD Interleave Info Type : 0x5 Length : 0x78 InterleaveSetIndex : 0x1 NumOfDimmsInInterleaveSet : 0x2 InterleaveMemoryType : 0x2 InterleaveFormatChannel : 0x40 InterleaveFormatImc : 0x40 InterleaveFormatWays : 0x2 InterleaveChangeStatus : 0x0 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002dbb PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002b0d PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000 ---Table: Platform Config Data Conf Output table--- Signature : COUT Length : 0xb8 Revision : 0x2 Checksum : 0x95 OemId : AORUS OemTableId : A M I OemRevision : 0x2 CreatorId : INTL CreatorRevision : 0x20091013 SequenceNumber : 0x1 ValidationStatus : 0x1 PcatTable : PCD Partition Size Change Type : 0x4 Length : 0x10 PartitionSizeChangeStatus : 0x1 PartitionSize : 0x3f1d140000 PcatTable : PCD Interleave Info Type : 0x5 Length : 0x78 InterleaveSetIndex : 0x1 NumOfDimmsInInterleaveSet : 0x2 InterleaveMemoryType : 0x2 InterleaveFormatChannel : 0x40 InterleaveFormatImc : 0x40 InterleaveFormatWays : 0x2 InterleaveChangeStatus : 0x1 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002dbb PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000 IdentificationInfoTable : PCD Identification Info DimmUniqueIdentifer : 8089-a2-1840-00002b0d PartitionOffset : 0x0 PmPartitionSize : 0x3f00000000
ipmctl show -dimm 0x0000 -pcd 命令查询详细信息。
PS C:\Users\Administrator> ipmctl show -sensor -dimm 0x0000 DimmID | Type | CurrentValue ===================================================== 0x0000 | Health | Healthy 0x0000 | MediaTemperature | 39C 0x0000 | ControllerTemperature | 41C 0x0000 | PercentageRemaining | 100% 0x0000 | LatchedDirtyShutdownCount | 8 0x0000 | PowerOnTime | 7825793s 0x0000 | UpTime | 7557s 0x0000 | PowerCycles | 337 0x0000 | FwErrorCount | 0 0x0000 | UnlatchedDirtyShutdownCount | 48 PS C:\Users\Administrator>
查看健康度信息和各传感器信息。
每个传感器都有一个设定的阈值,用于指定正常范围。
在模块上,您可以设置自己的阈值,称为 NonCriticalThreshold。例如,如果将 MediaTemperature NonCriticalThreshold 设置为低于 Normal 范围的数字,则当温度超过指定的数字时,将收到警告。可以使用以下命令设置每个传感器的阈值限制:
例如使用 ipmctl set -sensor MediaTemperature -dimm 0x0001 NonCriticalThreshold=51 EnabledState=1
当温度超过51度时就会报错。
PS C:\Users\Administrator> ipmctl show -sensor PercentageRemaining DimmID | Type | CurrentValue ============================================= 0x0000 | PercentageRemaining | 100% 0x0100 | PercentageRemaining | 100% PS C:\Users\Administrator>
查看剩余寿命
PS C:\Users\Administrator> ipmctl show -dimm 0x0000 -performance ---DimmID=0x0000--- MediaReads=0x00000000000000000000000816fe9318 MediaWrites=0x000000000000000000000002621e7110 ReadRequests=0x000000000000000000000002d3671960 WriteRequests=0x000000000000000000000002513c79e7 TotalMediaReads=0x00000000000000000000036c9b183d34 TotalMediaWrites=0x00000000000000000000027405253830 TotalReadRequests=0x0000000000000000000000890cc57763 TotalWriteRequests=0x0000000000000000000002512cdf90d1 PS C:\Users\Administrator>
显示传感器指标。
DimmID:英特尔傲腾 DC 持久内存模块标识符。
MediaReads:自上一个交流电 (AC) 周期以来,从英特尔傲腾 DC 持久内存模块上的介质读取的 64 字节数。
MediaWrites:自上一个交流周期以来,英特尔傲腾 DC 持久内存模块上对媒体的 64 字节写入次数。
ReadRequests:自上一个交流周期以来,英特尔傲腾 DC 持久内存模块已处理的 DDRT 读取事务数。
WriteRequests:自上一个交流周期以来,英特尔傲腾 DC 持久内存模块已处理的 DDRT 写入事务数。
TotalMediaReads:在其生命周期内从英特尔傲腾 DC 持久内存模块上的介质读取的 64 字节数。
TotalMediaWrites:英特尔傲腾 DC 持久内存模块在其生命周期内写入介质的 64 字节数。
TotalReadRequest:英特尔傲腾 DC 持久内存模块在其生命周期内处理的 DDRT 读取事务数。
TotalWriteRequest:英特尔傲腾 DC 持久内存模块在其生命周期内处理的 DDRT 写入事务数。
固件升级
想要获得更加好的性能和稳定性,需要定时升级厂家发布的固件。PMem也是可以进行固件更新的。
PMem的固件包在英特尔软件套件门户网站上提供。进入因特尔套件门户网站后进入 内存和存储 > 搜索傲腾持久内存。
点击第一个固件更新包。
在固件包说明中可以看见对应的固件包。下载合集后
在合集中有一个版本号和文档中匹配的.bin文件,这就是PMem的固件包。
安装固件包需要ipmi工具,ipmi工具可以在Github中下载
安装完毕后,就可以进行固件升级。
PS C:\Users\Administrator> ipmctl show -dimm DimmID | Capacity | LockState | HealthState | FWVersion =============================================================== 0x0000 | 252.454 GiB | Disabled | Healthy | 01.02.00.5417 0x0100 | 252.454 GiB | Disabled | Healthy | 01.02.00.5375
首先使用ipmctl show -dimm命令,可以看到我的两条PMem的版本号分别为01.02.00.5417和01.02.00.5375
PS C:\> ipmctl load -source .\fw_ekvb0_1.2.0.5446_rel.bin -examine -dimm .\fw_ekvb0_1.2.0.5446_rel.bin: 01.02.00.5446 Load FW on PMem module 0x0000: Valid Load FW on PMem module 0x0100: Valid
运行如上命令进行固件有效性判断。
PS C:\> ipmctl load -source .\fw_ekvb0_1.2.0.5446_rel.bin -dimm Starting update on 2 PMem module(s)... Load FW on PMem module 0x0000: Success, a power cycle is required to activate the FW. Load FW on PMem module 0x0100: Success, a power cycle is required to activate the FW.
然后进行固件更新。更新完成后查看版本,01.02.00.5446已在StagedFWVersion中。
PS C:\> ipmctl show -dimm -firmware DimmID | ActiveFWVersion | StagedFWVersion ============================================ 0x0000 | 01.02.00.5417 | 01.02.00.5446 0x0100 | 01.02.00.5375 | 01.02.00.5446
进行重启,重启后再次查看StagedFWVersion中的版本已进入ActiveFWVersion,固件升级完成。
PS C:\Users\Administrator> ipmctl show -firmware DimmID | ActiveFWVersion | StagedFWVersion ============================================ 0x0000 | 01.02.00.5446 | N/A 0x0100 | 01.02.00.5446 | N/A
更新固件并不难,使用时需要注意以下几点。
- 固件二进制文件 (.bin) 包含在固件包文件 (.zip) 中。
- 命令行出现的固件版本是设备中的当前固件。
- .bin固件版本是要在设备中刷新的固件。
- 固件更新需要一定的时间,期间服务器不能断电。
- 如果由于任何原因固件更新中断,固件将回退到以前的版本。
参考文献: