使用 FIO 对 PMEM 设备进行测试;解决问题 fio: engine libpmem not loadable;

基础知识:

FIO 工具使用:https://www.cnblogs.com/xuyaowen/p/fio-usage.html

PMEM 模型:NVM (非易失型存储-持久性内存) 编程模型与访问模式; PMDK 架构; App Direct

官方博客:Running FIO with pmem engines

持久内存工具集:2022年01月09日16:13:40

IPMCTL - Utility for managing Intel Optane DC persistent memory modules(专用于 Optane DC)

  • Discover persistent memory modules in the platform.
  • Provision the platform memory configuration.
  • View and update the firmware on PMMs.
  • Configure data-at-rest security on PMMs.
  • Monitor PMM health.
  • Track performance of PMMs.
  • Debug and troubleshoot PMMs.

NDCTL - Utility to manage “libnvdimm” subsystem devices (Non-volatile Memory) (通用,适用于NVDIMM) 

此图机器中是双路服务器,并且每个socket关联的内存DIMM槽是交错插满的;

设备概览:

➜  examples sudo ndctl list -N -D -u --regions -i
{
  "dimms":[
    {
      "dev":"nmem1",
      "id":"8089-a2-1930-000008e9",
      "handle":"0x10",
      "phys_id":"0x45"
    },
    {
      "dev":"nmem3",
      "id":"8089-a2-1930-000011fe",
      "handle":"0x1010",
      "phys_id":"0x51"
    },
    {
      "dev":"nmem0",
      "id":"8089-a2-1930-00000b6f",
      "handle":"0",
      "phys_id":"0x43"
    },
    {
      "dev":"nmem2",
      "id":"8089-a2-1930-00000fc8",
      "handle":"0x1000",
      "phys_id":"0x4f"
    }
  ],
  "regions":[
    {
      "dev":"region1",
      "size":"252.00 GiB (270.58 GB)",
      "available_size":0,
      "type":"pmem",
      "numa_node":1,
      "iset_id":"0xc0f2eeb826532444",
      "mappings":[
        {
          "dimm":"nmem3",
          "offset":"0x10000000",
          "length":"0x1f80000000",
          "position":1
        },
        {
          "dimm":"nmem2",
          "offset":"0x10000000",
          "length":"0x1f80000000",
          "position":0
        }
      ],
      "persistence_domain":"memory_controller",
      "namespaces":[
        {
          "dev":"namespace1.0",
          "mode":"fsdax",
          "map":"dev",
          "size":"248.06 GiB (266.35 GB)",
          "uuid":"a4ec89a0-0b3c-4455-9528-25c73b635a51",
          "raw_uuid":"f42aca99-c2fa-4d4d-af09-95ea3815324e",
          "sector_size":512,
          "blockdev":"pmem1",
          "numa_node":1
        },
        {
          "dev":"namespace1.1",
          "mode":"raw",
          "size":0,
          "uuid":"00000000-0000-0000-0000-000000000000",
          "sector_size":512,
          "state":"disabled",
          "numa_node":1
        }
      ]
    },
    {
      "dev":"region0",
      "size":"252.00 GiB (270.58 GB)",
      "available_size":"252.00 GiB (270.58 GB)",
      "type":"pmem",
      "numa_node":0,
      "iset_id":"0x4840eeb8b8462444",
      "mappings":[
        {
          "dimm":"nmem1",
          "offset":"0x10000000",
          "length":"0x1f80000000",
          "position":1
        },
        {
          "dimm":"nmem0",
          "offset":"0x10000000",
          "length":"0x1f80000000",
          "position":0
        }
      ],
      "persistence_domain":"memory_controller",
      "namespaces":[
        {
          "dev":"namespace0.0",
          "mode":"raw",
          "size":0,
          "uuid":"00000000-0000-0000-0000-000000000000",
          "sector_size":512,
          "state":"disabled",
          "numa_node":0
        }
      ]
    }
  ]
}

JOB文件:修改自 LibpmemSeqR.fio  https://github.com/axboe/fio/blob/master/examples/libpmem.fio 

#
# run command for this workload:
# numactl -N 1 fio Libpmemjob.fio
# numactl -N 1 fio --output=Libpmemjob.json --output-format=json Libpmemjob.fio
# 
# it binds this FIO workload to CPU 1 only. It should be set according to /dev/pmem1 socket's number
#
[global]
bs=4k
thread
group_reporting
norandommap
overwrite=1
thinktime=0
sync=1
direct=1

ioengine=libpmem
iodepth=1

# by yaowenxu
# Preparing namespace with commands:
# mkfs.ext4 /dev/pmem1
# mount /dev/pmem1 /mnt/pmem/ -o dax
#

directory=/mnt/pmem/yx  # I'm working on directory; each of 'numjobs' gets its own file to work with
size=10GB  # Each file will have this size; so in summary they will fill the whole namespace
unlink=0

time_based
runtime=300
ramp_time=30

[libpmem-seqwrite]
rw=write
stonewall

[libpmem-seqread]
rw=read
stonewall

#[libpmem-randwrite]
#rw=randwrite
#stonewall

#[libpmem-randread]
#rw=randread
#stonewall

FIO版本:(需要对fio重新编译,开启libpmem引擎)

libpmem engine
IO engine that uses libpmem (part of PMDK collection) to write data and libc's memcpy to read. It requires PMDK >= 1.5.

# 编译命令(fio脚本configure文件编写的稍微有些问题,不能正确配置ldflags和cflags,在此处我使用环境变量解决)
yaowen@zju:~/packages/fio-fio-3.27$ export LDFLAGS='-L/home/yaowen/local/lib/'
yaowen@zju:~/packages/fio-fio-3.27$ export CFLAGS='-I/home/yaowen/local/include/'
yaowen@zju:~/packages/fio-fio-3.27$ ./configure --prefix=/home/yaowen/local

# engines展示

测试命令:(针对fsdax模式进行测试) 

numactl -N 1 fio --output=Libpmemjob.json --output-format=json Libpmemjob.fio

测试结果:如需技术交流,欢迎留言讨论;

更为专业的测试结果可以关注:2022年01月09日16:17:11

Basic Performance Measurements of the Intel Optane DC Persistent Memory Module

保持更新,转载请注明出处;cnblogs.com/xuyaowen;

posted @ 2021-07-02 11:09  "Michael_Xu"  阅读(1343)  评论(13编辑  收藏  举报