2015-09-21 18:31:01 +00:00
|
|
|
Storage Performance Development Kit
|
|
|
|
===================================
|
|
|
|
|
2015-11-04 21:18:02 +00:00
|
|
|
[![Build Status](https://travis-ci.org/spdk/spdk.svg?branch=master)](https://travis-ci.org/spdk/spdk)
|
|
|
|
|
2016-02-26 22:50:59 +00:00
|
|
|
[SPDK Mailing List](https://lists.01.org/mailman/listinfo/spdk)
|
|
|
|
|
2015-09-21 21:11:31 +00:00
|
|
|
[SPDK on 01.org](https://01.org/spdk)
|
2015-09-21 18:31:01 +00:00
|
|
|
|
|
|
|
The Storage Performance Development Kit (SPDK) provides a set of tools
|
|
|
|
and libraries for writing high performance, scalable, user-mode storage
|
2016-03-02 17:03:57 +00:00
|
|
|
applications. It achieves high performance by moving all of the necessary
|
|
|
|
drivers into userspace and operating in a polled mode instead of relying on
|
|
|
|
interrupts, which avoids kernel context switches and eliminates interrupt
|
|
|
|
handling overhead.
|
|
|
|
|
|
|
|
The development kit currently includes:
|
2016-12-19 21:09:02 +00:00
|
|
|
* [NVMe driver](http://www.spdk.io/doc/nvme.html)
|
|
|
|
* [I/OAT (DMA engine) driver](http://www.spdk.io/doc/ioat.html)
|
|
|
|
* [NVMe over Fabrics target](http://www.spdk.io/doc/nvmf.html)
|
|
|
|
* [iSCSI target](http://www.spdk.io/doc/iscsi.html)
|
2017-03-29 23:01:32 +00:00
|
|
|
* [vhost target](http://www.spdk.io/doc/vhost.html)
|
2015-09-21 18:31:01 +00:00
|
|
|
|
2015-11-04 21:59:37 +00:00
|
|
|
Documentation
|
|
|
|
=============
|
|
|
|
|
2016-12-19 21:09:02 +00:00
|
|
|
[Doxygen API documentation](http://www.spdk.io/doc/) is available, as
|
2017-01-17 23:23:28 +00:00
|
|
|
well as a [Porting Guide](http://www.spdk.io/doc/porting.html) for porting SPDK to different frameworks
|
2016-03-02 17:03:57 +00:00
|
|
|
and operating systems.
|
2015-11-04 21:59:37 +00:00
|
|
|
|
2016-03-02 17:03:57 +00:00
|
|
|
Many examples are available in the `examples` directory.
|
2015-09-25 21:31:26 +00:00
|
|
|
|
2016-03-08 20:34:24 +00:00
|
|
|
[Changelog](CHANGELOG.md)
|
|
|
|
|
2015-09-21 18:31:01 +00:00
|
|
|
Prerequisites
|
|
|
|
=============
|
|
|
|
|
|
|
|
To build SPDK, some dependencies must be installed.
|
|
|
|
|
|
|
|
Fedora/CentOS:
|
|
|
|
|
2016-08-08 22:57:49 +00:00
|
|
|
sudo dnf install -y gcc gcc-c++ CUnit-devel libaio-devel openssl-devel
|
2016-08-08 23:35:11 +00:00
|
|
|
# Additional dependencies for NVMe over Fabrics:
|
2016-06-06 23:53:43 +00:00
|
|
|
sudo dnf install -y libibverbs-devel librdmacm-devel
|
2015-09-21 18:31:01 +00:00
|
|
|
|
|
|
|
Ubuntu/Debian:
|
|
|
|
|
2016-08-08 22:57:49 +00:00
|
|
|
sudo apt-get install -y gcc g++ make libcunit1-dev libaio-dev libssl-dev
|
2016-08-08 23:35:11 +00:00
|
|
|
# Additional dependencies for NVMe over Fabrics:
|
2016-06-06 23:53:43 +00:00
|
|
|
sudo apt-get install -y libibverbs-dev librdmacm-dev
|
2015-09-21 18:31:01 +00:00
|
|
|
|
2015-09-25 16:13:05 +00:00
|
|
|
FreeBSD:
|
|
|
|
|
2017-03-10 18:24:13 +00:00
|
|
|
sudo pkg install gmake cunit openssl
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-05-08 22:07:13 +00:00
|
|
|
Additionally, [DPDK](http://dpdk.org/doc/quick-start) is required. The SPDK
|
2017-05-17 20:32:21 +00:00
|
|
|
repository includes a suitable version of DPDK as a submodule:
|
2015-09-24 16:59:56 +00:00
|
|
|
|
2017-05-17 20:32:21 +00:00
|
|
|
git submodule update --init
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Building
|
|
|
|
========
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Once the prerequisites are installed, building follows the common configure
|
2017-05-17 20:32:21 +00:00
|
|
|
and make pattern (note: this will build the DPDK submodule as well).
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Linux:
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-05-17 20:32:21 +00:00
|
|
|
./configure
|
2017-03-30 19:06:49 +00:00
|
|
|
make
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
FreeBSD:
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-05-17 20:32:21 +00:00
|
|
|
./configure
|
2017-03-30 19:06:49 +00:00
|
|
|
gmake
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-04-28 17:18:24 +00:00
|
|
|
Vagrant
|
|
|
|
=======
|
|
|
|
|
|
|
|
A [Vagrant](https://www.vagrantup.com/downloads.html) setup is also provided
|
|
|
|
to create a Linux VM with a virtual NVMe controller to get up and running
|
2017-05-23 17:20:03 +00:00
|
|
|
quickly. Currently this has only been tested on MacOS and Ubuntu 16.04.2 LTS
|
|
|
|
with the [VirtualBox](https://www.virtualbox.org/wiki/Downloads) provider. The
|
2017-04-28 17:18:24 +00:00
|
|
|
[VirtualBox Extension Pack](https://www.virtualbox.org/wiki/Downloads) must
|
2017-05-23 17:20:03 +00:00
|
|
|
also be installed in order to get the required NVMe support.
|
2017-04-28 17:18:24 +00:00
|
|
|
|
2017-05-23 17:20:03 +00:00
|
|
|
Details on the Vagrant setup can be found in
|
2017-04-28 17:18:24 +00:00
|
|
|
[scripts/vagrant/README.md](scripts/vagrant/README.md).
|
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Advanced Build Options
|
|
|
|
======================
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Optional components and other build-time configuration are controlled by
|
|
|
|
settings in two Makefile fragments in the root of the repository. `CONFIG`
|
|
|
|
contains the base settings. Running the `configure` script generates a new
|
|
|
|
file, `CONFIG.local`, that contains overrides to the base `CONFIG` file. For
|
|
|
|
advanced configuration, there are a number of additional options to `configure`
|
|
|
|
that may be used, or `CONFIG.local` can simply be created and edited by hand. A
|
|
|
|
description of all possible options is located in `CONFIG`.
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Boolean (on/off) options are configured with a 'y' (yes) or 'n' (no). For
|
|
|
|
example, this line of `CONFIG` controls whether the optional RDMA (libibverbs)
|
|
|
|
support is enabled:
|
2015-09-21 18:31:01 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
CONFIG_RDMA?=n
|
2015-09-24 16:59:56 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
To enable RDMA, this line may be added to `CONFIG.local` with a 'y' instead of
|
|
|
|
'n'. For the majority of options this can be done using the `configure` script.
|
|
|
|
For example:
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-05-01 19:27:16 +00:00
|
|
|
./configure --with-dpdk=./dpdk/x86_64-native-linuxapp-gcc --with-rdma
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
Additionally, `CONFIG` options may also be overrriden on the `make` command
|
|
|
|
line:
|
|
|
|
|
|
|
|
make CONFIG_RDMA=y
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-05-08 22:07:13 +00:00
|
|
|
Users may wish to use a version of DPDK different from the submodule included
|
|
|
|
in the SPDK repository. To specify an alternate DPDK installation, run
|
|
|
|
configure with the --with-dpdk option. For example:
|
|
|
|
|
|
|
|
Linux:
|
|
|
|
|
|
|
|
./configure --with-dpdk=/path/to/dpdk/x86_64-native-linuxapp-gcc
|
|
|
|
make
|
|
|
|
|
|
|
|
FreeBSD:
|
|
|
|
|
|
|
|
./configure --with-dpdk=/path/to/dpdk/x86_64-native-bsdapp-clang
|
|
|
|
gmake
|
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
The options specified on the `make` command line take precedence over the
|
|
|
|
default values in `CONFIG` and `CONFIG.local`. This can be useful if you, for
|
|
|
|
example, generate a `CONFIG.local` using the `configure` script and then have
|
|
|
|
one or two options (i.e. debug builds) that you wish to turn on and off
|
|
|
|
frequently.
|
2015-09-25 16:13:05 +00:00
|
|
|
|
|
|
|
Hugepages and Device Binding
|
|
|
|
============================
|
|
|
|
|
|
|
|
Before running an SPDK application, some hugepages must be allocated and
|
2015-12-03 21:30:38 +00:00
|
|
|
any NVMe and I/OAT devices must be unbound from the native kernel drivers.
|
2016-04-14 20:22:11 +00:00
|
|
|
SPDK includes a script to automate this process on both Linux and FreeBSD.
|
|
|
|
This script should be run as root.
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2016-04-14 20:22:11 +00:00
|
|
|
sudo scripts/setup.sh
|
2016-03-08 21:26:03 +00:00
|
|
|
|
|
|
|
Examples
|
|
|
|
========
|
|
|
|
|
|
|
|
Example code is located in the examples directory. The examples are compiled
|
|
|
|
automatically as part of the build process. Simply call any of the examples
|
|
|
|
with no arguments to see the help output. You'll likely need to run the examples
|
|
|
|
as a privileged user (root) unless you've done additional configuration
|
|
|
|
to grant your user permission to allocate huge pages and map devices through
|
|
|
|
vfio.
|