DAX文件系统大页映射性能测试方法

DAX文件系统+mmap()文件接口,可以将持久型内存(persistent memory)直接映射到用户态,我预计这在未来将成为一种在系统编程时操作PM的标准套路。本文将通过实验验证DAX文件系统2M大页映射,并指出测试性能的方法。

1. 如何配置

[1]给出了比较详细的配置说明,这里避免过多重复,简单总结一下。

根据[1]所述,内核支持DAX的文件系统ext4和XFS现在支持2MB大小的hugepage了,但要使用这个特性,需要满足3个条件:

  1. mmap()调用必须最少映射 2 MiB;
  2. 文件系统块的最少以2 MiB被分配;
  3. 文件系统块必须和mmap()调用有相同的对齐量。

其中,第1点(在用户态的调用)挺容易达到的,第2、3点得益于当年为了支持RAID所提出的特性,ext4和XFS也支持从底层分配一定大小和一定对齐量的块。关于怎么快速验证2MB大页映射,[1]中也以fallocate一个1GB大小的文件进行了说明。本文更进一步,验证对于一个文件,怎样创建它、怎样映射它才能利用到2MB大页映射。

2. 监测2M大页page fault的结果

我们要验证大页映射是否成功,可以对大页fault成功与否进行监测。[1]中利用了内核函数tracepoint机制,对构建pmd页表项的dax_pmd_fault_done这个tracepoint进行监测。这里我们用的是bpftrace这个工具,它可以更方便地监测tracepoint。步骤如下:

**Step 1.**根据文档[1]和bpftrace文档[2],我们可以首先查看dax_pmd_fault_done这个tracepoint的相关信息:

Step 2. 然后用一行bpftrace命令判断是否使用大页成功:

注意这行命令中,我们打印的是result这个信息,它一般会在2MB对齐页发生page fault时打印出0x1000x800两个结构。这两个结构分别对应VM_FAULT_NOPAGEVM_FAULT_FALLBACK,表示缺页时2M页表项创建成功或失败。

3. 修改fio mmap引擎

fio的mmap引擎中,原本的实现是映射测试文件的全部范围:

这里我们为了验证mmap以不同粒度映射这个文件,更改一种映射形式。我们先映射一个文件大小的匿名(用MAP_ANONYMOUS实现)区域,然后再以我们需要的映射粒度,逐一往这个区域"覆盖(用MAP_FIXED实现)"文件映射:

在上述代码map_size分别设置成1024 * 1024 * 21024 * 1024 * 1 (即2MB或1MB映射文件),分别重新编译fio。用如下fio脚本测试:

4. 测试及结果分析

4.1. 怎么运行测试呢:

首先,在另一个shell,用bpftrace 追踪dax_pmd_fault_done这个tracepoint的结果:

然后,在另一个shell,运行测试test.fio并用perf stat统计各种性能参数,之后会同时得到fio和perf的测试报告,同时bpftrace那个shell也监测到了内核tracepoint的相关情况。

4.2. 测试结果1: 以2 MB为粒度映射文件

fio 及 perf stat 的report如下:

bpftrace的结果:

4.3. 测试结果2: 以1MB为粒度映射文件

fio 及 perf stat 的report如下:

bpftrace的结果:

4.4. 测试结果分析

实验环境:

项目 参数
kernel版本 4.16.0
fio版本 3.16
文件系统 ext4-dax
硬件设备 AEP (interleaved)

结果对比:

2MB mmap 1MB mmap
dax_pmd_fault_done result VM_FAULT_NOPAGE VM_FAULT_FALLBACK
随机读延迟 (us) 1.67 4.18
page-faults:u 157,520 2,282,121
dTLB-load-misses:u 5,516,303 8,388,448
iTLB-load-misses:u 120,540 3,475,836

可以发现,2MB大小的mmap调用才可以利用DAX文件系统的hugepage映射特性,在AEP上,用fio mmap引擎测试的随机4K读延迟性能提升3倍,page fault、TLB miss都显著减少了。


[1] https://nvdimm.wiki.kernel.org/2mib_fs_dax

[2] https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#6-tracepoint-static-tracing-kernel-level-arguments

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注