vlambda博客
学习文章列表

手册 | MQSim翻译(原文件GitHub上有)[1]

#MQSim:一个用于现代NVMeSATA SSD的模拟器

Linux中的用法

运行以下命令: ./MQSim -i <SSD Configuration File> -w <Workload Definition File> 

Windows 1中的用法:

1.打开MQSim.slnMS Visual Studio 2017或更高版本中的解决方案文件。

2.将解决方案配置设置为Release(默认设置为Debug)。

3.编译解决方案。

4.运行生成的可执行文件(例如。,MQSim.exe)在命令行模式下或单击MS Visual Studio运行按钮。请指定包含1SSD配置和2)工作负载定义的文件的路径。

命令行执行示例:MQSim.exe -i <SSD Configuration File> -w <Workload Definition File> 

##MQSim执行配置

您可以用XML格式指定首选SSD配置。如果命令行中指定的SSD配置文件不存在,MQSim将在指定路径中创建一个示例XML文件。以下是XML文件中可用配置参数的定义:

###主机

1. PCIe_Lane_Bandwidth:*每个通道的PCIe带宽(GB/s)。范围={所有正的双精度值}

2. **PCIe_Lane_Count:***PCIe通道数。范围={所有正整数值}

3. **SATA_Processing_Delay:**定义以纳秒为单位向SSD设备发送/接收SATA消息的聚合硬件和软件处理延迟。范围={所有正整数值}

4. **Enable_ResponseTime_Logging:**用于启用响应时间日志记录的切换。如果启用,则计算模拟时段上每个运行的I/O流的响应时间,并在每个时段结束时在日志文件中报告。范围={truefalse}

5. **ResponseTime_Logging_Period_Length:**定义响应时间日志记录的纪元长度(以纳秒为单位)。范围={所有正整数值}

手册 | MQSim翻译(原文件GitHub上有)[1]

 

###固态硬盘设备

1**Seed:**用于随机数生成的种子值。范围={所有正整数值}

2**Enabled_Preconditioning:**启用预处理的切换。范围={truefalse}

3**Memory_Type:**用于数据存储的非易失性内存的类型。范围={FLASH}

4**HostInterface_Type:**主机接口的类型。范围={NVMESATA}

5**IO_Queue_Depth:**主机端I/O队列的长度。如果主机接口设置为NVME,则**I O_Queue_Depth**定义I/O提交和I/O完成队列的容量。如果主机接口设置为SATA,则**IO_Queue_Depth**定义本机命令队列(NCQ)的容量。范围={所有正整数值}

6**Queue_Fetch_Size:**QueueFetchSize参数的值,如FAST 2018论文[1]所述。范围={所有正整数值}

7**Caching_Mechanism:**设备上使用的数据缓存机制。范围={SIMPLE:实现一个简单的数据转储缓冲区,ADVANCED:实现一个高级数据缓存机制,在并发流之间具有不同的共享选项}

8**Data_Cache_Sharing_Mode:**使用NVMe主机接口时,并发运行的I/O流之间的DRAM数据缓存(缓冲区)的共享模式。范围={共享,相等分区}

9**Data_Cache_Capacity:**DRAM数据缓存的大小(字节)。范围={所有正整数}

10**Data_Cache_DRAM_Row_Size**DRAM行的大小(字节)。范围={2所有正幂,例如 2,4,8,16等等}

11**Data_Cache_DRAM_Data_Rate:**MB/s 我觉得是他文档里写错了为单位的DRAM数据传输速率。范围={所有正整数值}

12**Data_Cache_DRAM_Data_Burst_Size**在一个DRAM突发中传输的字节数(取决于DRAM芯片的数量)。范围={所有正整数值}

13**Data_Cache_DRAM_tRCD:**用于访问数据缓存中DRAM的计时参数tRCD的值(以纳秒为单位)。范围={所有正整数值}

14**Data_Cache_DRAM_tCL**用于访问数据缓存中DRAM的计时参数tCL的值(以纳秒为单位)。范围={所有正整数值}

15**Data_Cache_DRAM_tRP:**用于访问数据缓存中DRAM的计时参数tRP的值(以纳秒为单位)。范围={所有正整数值}

19**CMT_Sharing_Mode:**当使用NVMe主机接口时,决定如何在并发运行的流之间共享整个CMT(缓存映射表)空间的模式。范围={共享,相等分区}

20**Plane_Allocation_Scheme**Tavakkol等人定义的分组分配方案。[3]。范围={CWDPCWDPCDWPCDPWCPWDCPDWWCDPWCPDWDCPWDPCWPCDWPDCDCWPDCPWDWCPDWPCDPCWDPWCPCWDPCDWPWCDPWDCPDCW

PDWC}

21**Transaction_Scheduling_Policy**SSD后端中使用的事务调度策略。范围={OUT_OF_ORDER Sprinkler 论文 [2]中所定义,PRIORITY_OUT_OF_ORDER实现OUT_OF_ORDER NVM优先级}

22**Overprovisioning_Ratio:**保留存储空间与可用闪存存储容量的比率。范围={所有正的双精度值}

23**GC_Exect_Threshold:***启动垃圾收集(GC)的阈值。当一个分组空闲物理页比率低于此阈值时,垃圾回收执行开始。范围={所有正的双精度值}

24**GC_Block_Selection_Policy:**垃圾回收块选择策略。范围{GREEDYRGA*(在[4][5]中描述),RANDOM*(在[4]中描述),RANDOM_P*(在[4]中描述),RANDOM_PP*(在[4]中描述),FIFO*(在[6]中描述)。

25**Use_Copyback_for_GC:*”用于“GC_and_WL_Unit_Page_Level”中,以确定块管理器→是否是有效的GC_写入事务

26**Preemptible_GC_Enabled**用于启用可抢占垃圾回收的切换(如[7]所述)。范围={truefalse}

27**GC_Hard_Threshold:**停止可先发制人的垃圾回收执行的阈值(如[7]所述)。范围={所有可能的正双精度值小于GC_Exect_Threshold}

28**Dynamic_Wearleveling_Enabled**用于启用动态磨损均衡的切换(如[9]所述)。范围={truefalse}

29**Static_Wearleveling_Enabled**启用静态磨损均衡的开关(如[9]所述)。范围={所有正整数值}

30**Static_Wearleveling_Threshold**启动静态磨损平衡的阈值(如[9]所述)。当存储器单元(例如,闪存中的分组 )内的最小和最大擦除计数之间的差异降到该阈值以下时,静态磨损水平开始。范围={truefalse}

31**Preferred_suspend_erase_time_for_read:*暂停正在进行的闪存擦除操作的合理时间,以支持最近排队的读取操作。范围={所有正整数值}

32**Preferred_suspend_erase_time_for_write:*暂停正在进行的闪存擦除操作的合理时间,以支持最近排队的读取操作。范围={所有正整数值}

33**Preferred_suspend_write_time_for_read:*暂停正在进行的闪存擦除操作的合理时间,以支持最近排队的程序操作。范围={所有正整数值}

34**Flash_Channel_Count:**固态硬盘后端的闪存通道数。范围={所有正整数值}

35**Flash_Channel_Width::**每个闪存通道的宽度(字节)。范围={所有正整数值}

36**Channel_Transfer_Rate:**MT/s为单位的固态硬盘后端中闪存通道的传输速率。范围={所有正整数值}

37**Chip_No_Per_Channel:**连接到SSD后端每个通道的闪存芯片数。范围={所有正整数值}

38**Flash_Comm_Protocol**开放式NAND Flash接口(ONFI)协议,用于通过SSD后端的闪存通道传输数据。范围={NVDDR2}

手册 | MQSim翻译(原文件GitHub上有)[1]

 

###NAND闪存

1**Flash_Technology:**范围={SLCMLCTLC}

2**CMD_Suspension_Support::**闪存芯片支持的暂停支持命令类型。范围={NONE, PROGRAM, PROGRAM_ERASE, ERASE}

3**Page_Read_Latency_LSB:*读取闪存单元的LSB位的延迟(纳秒)。范围={所有正整数值}

4**Page_Read_Latency_CSB:*以纳秒为单位读取闪存单元的CSB位的延迟。范围={所有正整数值}

5**Page_Read_Latency_MSB::*以纳秒为单位读取闪存单元的MSB位的延迟。范围={所有正整数值}

6**Page_Program_Latency_LSB:*编程闪存单元LSB位的延迟(纳秒)。范围={所有正整数值}

7**Page_Program_Latency_CSB:*以纳秒为单位编程闪存单元的CSB位的延迟。范围={所有正整数值}

8**Page_Program_Latency_MSB:*以纳秒为单位编程闪存单元的MSB位的延迟。范围={所有正整数值}

9**Block_Erase_Latency:*擦除闪存块的延迟(纳秒)。范围={所有正整数值}

10**Block_PE_Cycles_Limit:**每个闪存块的PE限制。范围={所有正整数值}

11**Suspend_Erase_Time**以纳秒为单位暂停正在进行的擦除操作所用的时间。范围={所有正整数值}

12**Suspend_Program_Time**以纳秒为单位暂停正在进行的程序操作所用的时间。范围={所有正整数值}

13**Die_No_Per_Chip:*每个闪存芯片中的晶圆数。范围={所有正整数值}

14**Plane_No_Per_Die**每个模具中的分组数。范围={所有正整数值}

15**Block_No_Per_Plane**每个平面中的闪存块数。范围={所有正整数值}

16**Page_No_Per_Block**每个闪存块中的物理页数。范围={所有正整数值}

17**Page_Capacity**每个物理闪存页面的大小(字节)。范围={所有正整数值}

18**Page_Metadat_Capacity:**每个物理闪存页的元数据区域大小(字节)。范围={所有正整数值}

 

##MQSim工作负载定义

您可以用XML格式定义您首选的工作负载集。如果指定的工作负载定义文件不存在,MQSim将为您创建一个XML格式的示例工作负载定义文件(即工作负载.xml). 以下是对工作负载定义文件的XML属性和标记的说明:

 

一。整个工作负载定义应该嵌入到<MQSim_IO_Scenarios></MQSim_IO_Scenarios> 标记中。您可以在这些标记中定义不同的*I/O方案集*MQSim分别模拟每个I/O场景。

 

2。我们调用一组应该一起执行的工作负载,一个*I/O场景*I/O场景在<IO_Scenario></IO_Scenario>标记中定义。例如,工作负载定义文件中按以下方式定义了两种不同的I/O方案:```

```

<MQSim_IO_Scenarios>

<IO_Scenario>

.............

</IO_Scenario>

<IO_Scenario>

.............

</IO_Scenario>

</MQSim_IO_Scenarios>

```

对于每个I/O方案,MQSim 1)重建主机和SSD驱动器模型并执行方案直至完成,2)创建输出文件并将仿真结果写入其中。对于上面提到的示例,MQSim两次构建主机和SSD驱动器模型,执行第一个和第二个I/O方案,最后分别将执行结果写入workload_scenario_1.xmlworkload_scenario_2.xml文件。

您可以在每个 IO_Scenario标记中定义多达8个不同的工作负载。每个工作负载可以是已在实际系统上收集的磁盘跟踪文件,也可以是由MQSim的请求生成器生成的I/O请求的合成流。

###定义基于采集(trace)的工作负载

您可以使用XML标记<IO_Flow_Parameter_Set_Trace_Based>MQSim定义基于跟踪的工作负载。目前,MQSim可以执行[8]中定义的ASCII磁盘跟踪,其中跟踪文件的每一行具有以下格式:

以下参数用于定义基于跟踪的工作负载:


1**Priority_Class:**与此I/O请求关联的I/O队列的优先级。范围={紧急,高,中,低}

2**Device_Level_Data_Caching_Mode:**此流的设备上数据缓存类型。范围={写缓存,读缓存,写读缓存,关闭}。如果将上面提到的缓存机制设置为简单,则只能使用写缓存和关闭模式。 

3**Channel_IDs**分配给此工作负载的通道标识的逗号分隔列表。此列表用于资源分区。如果SSD中有C个通道(在SSD配置文件中定义),那么通道ID列表应该包含0C-1范围内的值。如果不需要资源分区,那么所有工作负载都应该具有通道ID 0C-1

4**Chip_IDs:**分配给此工作负载的以逗号分隔的Chip id列表。此列表用于资源分区。如果每个通道中都有W个芯片(在SSD配置文件中定义),那么芯片ID列表应该包含0W-1范围内的值。如果不需要资源分区,那么所有工作负载都应该具有芯片ID 0W-1

5**Die_IDs:**分配给此工作负载的芯片id的逗号分隔列表。此列表用于资源分区。如果每个闪存芯片(在SSD配置文件中定义)中都有D晶圆 ,那么晶圆 ID列表应该包含0D-1范围内的值。如果不需要资源分区,那么所有工作负载都应该具有晶圆 id 0D-1

6**Plane_IDs:**分配给此工作负载的分组 ID的逗号分隔列表。此列表用于资源分区。如果每个晶圆中都有P分组(在SSD配置文件中定义),那么分组ID列表应该包含0P-1范围内的值。如果不需要资源分区,那么所有工作负载都应该具有分组id 0P-1

7**Initial_Occupancy_Percentage**预处理期间填充的存储空间(即逻辑页)的百分比。范围={1100}范围内的所有整数值。

8**File_Path**输入跟踪文件的相对/绝对路径。

9**Percentage_To_Be_Executed:**应执行的输入跟踪文件中请求的百分比。范围={1100}范围内的所有整数值。

10**Relay_Count:**应重复跟踪执行的次数。范围={所有正整数值}

11**Time_Unit**输入跟踪文件中的到达时间单位。范围={皮秒,纳秒,微秒}