numam-spdk/examples/nvme/fio_plugin
Shuhei Matsumoto 6e769bec2c fio_plugin: Use the new DIF library in FIO plugin
Apply the new DIF library to DIF generation and verification.

Condition to use DIF generation and verification are changed
only about DIF type. DIF type 3 is supported in this patch.

DIX is not supported in this patch.

The case that PI is located to the first 8 bytes of the metadata
is not supported in this patch too to because how to pass PI location
is not fixed yet. But this limitation will not be critical because
PI is located to the last 8 bytes of the metadata by default.

DIF insertion and strip will be required not to destroy data by
DIF generation. But this is still added in the TODO list even after
this patch.

Change-Id: If08bcaaaa9f4e0fb4f373ef844b88b38cfffc6b5
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/c/441283
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
2019-02-11 12:05:13 +00:00
..
.gitignore nvme: Add an fio plugin 2016-05-18 13:51:36 -07:00
example_config.fio fio_plugin: switch to LD_PRELOAD instead of dynamically loading 2017-06-14 11:12:29 -04:00
fio_plugin.c fio_plugin: Use the new DIF library in FIO plugin 2019-02-11 12:05:13 +00:00
full_bench.fio fio: Update full_bench.fio example to reduce latency 2018-01-09 13:40:59 -05:00
Makefile CONFIG: add missing CONFIG_ options 2018-10-04 21:31:42 +00:00
README.md fio_plugin: add extended lba format pi support 2018-07-13 22:38:27 +00:00

Compiling fio

First, clone the fio source repository from https://github.com/axboe/fio

git clone https://github.com/axboe/fio

Then check out the fio 3.3:

cd fio && git checkout fio-3.3

Finally, compile the code:

make

Compiling SPDK

First, clone the SPDK source repository from https://github.com/spdk/spdk

git clone https://github.com/spdk/spdk
git submodule update --init

Then, run the SPDK configure script to enable fio (point it to the root of the fio repository):

cd spdk
./configure --with-fio=/path/to/fio/repo <other configuration options>

Finally, build SPDK:

make

Note to advanced users: These steps assume you're using the DPDK submodule. If you are using your own version of DPDK, the fio plugin requires that DPDK be compiled with -fPIC. You can compile DPDK with -fPIC by modifying your DPDK configuration file and adding the line:

EXTRA_CFLAGS=-fPIC

Usage

To use the SPDK fio plugin with fio, specify the plugin binary using LD_PRELOAD when running fio and set ioengine=spdk in the fio configuration file (see example_config.fio in the same directory as this README).

LD_PRELOAD=<path to spdk repo>/examples/nvme/fio_plugin/fio_plugin fio

To select NVMe devices, you pass an SPDK Transport Identifier string as the filename. These are in the form:

filename=key=value [key=value] ... ns=value

Specifically, for local PCIe NVMe devices it will look like this:

filename=trtype=PCIe traddr=0000.04.00.0 ns=1

And remote devices accessed via NVMe over Fabrics will look like this:

filename=trtype=RDMA adrfam=IPv4 traddr=192.168.100.8 trsvcid=4420 ns=1

Note: The specification of the PCIe address should not use the normal ':' and instead only use '.'. This is a limitation in fio - it splits filenames on ':'. Also, the NVMe namespaces start at 1, not 0, and the namespace must be specified at the end of the string.

Currently the SPDK fio plugin is limited to the thread usage model, so fio jobs must also specify thread=1 when using the SPDK fio plugin.

fio also currently has a race condition on shutdown if dynamically loading the ioengine by specifying the engine's full path via the ioengine parameter - LD_PRELOAD is recommended to avoid this race condition.

When testing random workloads, it is recommended to set norandommap=1. fio's random map processing consumes extra CPU cycles which will degrade performance over time with the fio_plugin since all I/O are submitted and completed on a single CPU core.

When testing FIO on multiple NVMe SSDs with SPDK plugin, it is recommended to use multiple jobs in FIO configurion. It has been observed that there are some performance gap between FIO(with SPDK plugin enabled) and SPDK perf (examples/nvme/perf/perf) on testing multiple NVMe SSDs. If you use one job(i.e., use one CPU core) configured for FIO test, the performance is worse than SPDK perf (also using one CPU core) against many NVMe SSDs. But if you use multiple jobs for FIO test, the performance of FIO is similiar with SPDK perf. After analyzing this phenomenon, we think that is caused by the FIO architecture. Mainly FIO can scale with multiple threads (i.e., using CPU cores), but it is not good to use one thread against many I/O devices.

End-to-end Data Protection (Optional)

Running with PI setting, following settings steps are required. First, format device namespace with proper PI setting. For example:

nvme format /dev/nvme0n1 -l 1 -i 1 -p 0 -m 1

In fio configure file, add PRACT and set PRCHK by flags(GUARD|REFTAG|APPTAG) properly. For example:

pi_act=0
pi_chk=GUARD

Blocksize should be set as the sum of data and metadata. For example, if data blocksize is 512 Byte, host generated PI metadata is 8 Byte, then blocksize in fio configure file should be 520 Byte:

bs=520