2017-05-28 19:35:46 +00:00
|
|
|
# Storage Performance Development Kit
|
2015-09-21 18:31:01 +00:00
|
|
|
|
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)
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
The Storage Performance Development Kit ([SPDK](http://www.spdk.io)) provides a set of tools
|
2015-09-21 18:31:01 +00:00
|
|
|
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:
|
2020-02-04 15:41:17 +00:00
|
|
|
|
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)
|
2017-10-02 17:31:06 +00:00
|
|
|
* [Virtio-SCSI driver](http://www.spdk.io/doc/virtio.html)
|
2015-09-21 18:31:01 +00:00
|
|
|
|
2021-08-02 12:27:54 +00:00
|
|
|
## In this readme
|
2017-05-28 19:35:46 +00:00
|
|
|
|
|
|
|
* [Documentation](#documentation)
|
|
|
|
* [Prerequisites](#prerequisites)
|
|
|
|
* [Source Code](#source)
|
|
|
|
* [Build](#libraries)
|
|
|
|
* [Unit Tests](#tests)
|
|
|
|
* [Vagrant](#vagrant)
|
2020-02-26 11:42:35 +00:00
|
|
|
* [AWS](#aws)
|
2017-05-28 19:35:46 +00:00
|
|
|
* [Advanced Build Options](#advanced)
|
2018-10-24 07:16:07 +00:00
|
|
|
* [Shared libraries](#shared)
|
2017-05-28 19:35:46 +00:00
|
|
|
* [Hugepages and Device Binding](#huge)
|
|
|
|
* [Example Code](#examples)
|
|
|
|
* [Contributing](#contributing)
|
|
|
|
|
|
|
|
<a id="documentation"></a>
|
|
|
|
## Documentation
|
2015-11-04 21:59:37 +00:00
|
|
|
|
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
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
<a id="source"></a>
|
|
|
|
## Source Code
|
2015-09-24 16:59:56 +00:00
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
git clone https://github.com/spdk/spdk
|
|
|
|
cd spdk
|
|
|
|
git submodule update --init
|
|
|
|
~~~
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2017-08-21 16:37:37 +00:00
|
|
|
<a id="prerequisites"></a>
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
The dependencies can be installed automatically by `scripts/pkgdep.sh`.
|
2020-01-14 09:59:31 +00:00
|
|
|
The `scripts/pkgdep.sh` script will automatically install the bare minimum
|
|
|
|
dependencies required to build SPDK.
|
|
|
|
Use `--help` to see information on installing dependencies for optional components
|
2017-08-21 16:37:37 +00:00
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
./scripts/pkgdep.sh
|
|
|
|
~~~
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
<a id="libraries"></a>
|
|
|
|
## Build
|
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-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
./configure
|
|
|
|
make
|
|
|
|
~~~
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
FreeBSD:
|
2017-05-28 19:35:46 +00:00
|
|
|
Note: Make sure you have the matching kernel source in /usr/src/ and
|
|
|
|
also note that CONFIG_COVERAGE option is not available right now
|
|
|
|
for FreeBSD builds.
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
./configure
|
|
|
|
gmake
|
|
|
|
~~~
|
|
|
|
|
|
|
|
<a id="tests"></a>
|
|
|
|
## Unit Tests
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
2018-02-27 23:07:35 +00:00
|
|
|
./test/unit/unittest.sh
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~
|
2017-01-13 20:46:37 +00:00
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
You will see several error messages when running the unit tests, but they are
|
|
|
|
part of the test suite. The final message at the end of the script indicates
|
|
|
|
success or failure.
|
|
|
|
|
|
|
|
<a id="vagrant"></a>
|
|
|
|
## Vagrant
|
2017-04-28 17:18:24 +00:00
|
|
|
|
|
|
|
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
|
2020-03-03 14:04:02 +00:00
|
|
|
quickly. Currently this has been tested on MacOS, Ubuntu 16.04.2 LTS and
|
|
|
|
Ubuntu 18.04.3 LTS with the VirtualBox and Libvirt provider.
|
|
|
|
The [VirtualBox Extension Pack](https://www.virtualbox.org/wiki/Downloads)
|
|
|
|
or [Vagrant Libvirt] (https://github.com/vagrant-libvirt/vagrant-libvirt) 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-08-29 17:46:49 +00:00
|
|
|
Details on the Vagrant setup can be found in the
|
|
|
|
[SPDK Vagrant documentation](http://spdk.io/doc/vagrant.html).
|
2017-04-28 17:18:24 +00:00
|
|
|
|
2020-02-26 11:42:35 +00:00
|
|
|
<a id="aws"></a>
|
|
|
|
## AWS
|
|
|
|
|
|
|
|
The following setup is known to work on AWS:
|
|
|
|
Image: Ubuntu 18.04
|
|
|
|
Before running `setup.sh`, run `modprobe vfio-pci`
|
|
|
|
then: `DRIVER_OVERRIDE=vfio-pci ./setup.sh`
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
<a id="advanced"></a>
|
|
|
|
## 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
|
2018-09-21 14:32:36 +00:00
|
|
|
settings in the Makefile configuration file in the root of the repository. `CONFIG`
|
|
|
|
contains the base settings for the `configure` script. This script generates a new
|
|
|
|
file, `mk/config.mk`, that contains final build settings. For advanced configuration,
|
|
|
|
there are a number of additional options to `configure` that may be used, or
|
|
|
|
`mk/config.mk` 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
|
|
|
|
2021-08-24 07:04:22 +00:00
|
|
|
~~~{.sh}
|
|
|
|
CONFIG_RDMA?=n
|
|
|
|
~~~
|
2015-09-24 16:59:56 +00:00
|
|
|
|
2018-09-21 14:32:36 +00:00
|
|
|
To enable RDMA, this line may be added to `mk/config.mk` with a 'y' instead of
|
2017-03-30 19:06:49 +00:00
|
|
|
'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-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
./configure --with-rdma
|
|
|
|
~~~
|
2015-09-25 16:13:05 +00:00
|
|
|
|
2018-08-27 08:42:35 +00:00
|
|
|
Additionally, `CONFIG` options may also be overridden on the `make` command
|
2017-03-30 19:06:49 +00:00
|
|
|
line:
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
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
|
2018-09-07 16:31:19 +00:00
|
|
|
in the SPDK repository. Note, this includes the ability to build not only
|
|
|
|
from DPDK sources, but also just with the includes and libraries
|
|
|
|
installed via the dpdk and dpdk-devel packages. To specify an alternate DPDK
|
|
|
|
installation, run configure with the --with-dpdk option. For example:
|
2017-05-08 22:07:13 +00:00
|
|
|
|
|
|
|
Linux:
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
./configure --with-dpdk=/path/to/dpdk/x86_64-native-linuxapp-gcc
|
|
|
|
make
|
|
|
|
~~~
|
2017-05-08 22:07:13 +00:00
|
|
|
|
|
|
|
FreeBSD:
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
./configure --with-dpdk=/path/to/dpdk/x86_64-native-bsdapp-clang
|
|
|
|
gmake
|
|
|
|
~~~
|
2017-05-08 22:07:13 +00:00
|
|
|
|
2017-03-30 19:06:49 +00:00
|
|
|
The options specified on the `make` command line take precedence over the
|
2018-09-21 14:32:36 +00:00
|
|
|
values in `mk/config.mk`. This can be useful if you, for example, generate
|
|
|
|
a `mk/config.mk` 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
|
|
|
|
2018-10-24 07:16:07 +00:00
|
|
|
<a id="shared"></a>
|
|
|
|
## Shared libraries
|
|
|
|
|
|
|
|
By default, the build of the SPDK yields static libraries against which
|
|
|
|
the SPDK applications and examples are linked.
|
|
|
|
Configure option `--with-shared` provides the ability to produce SPDK shared
|
|
|
|
libraries, in addition to the default static ones. Use of this flag also
|
|
|
|
results in the SPDK executables linked to the shared versions of libraries.
|
|
|
|
SPDK shared libraries by default, are located in `./build/lib`. This includes
|
|
|
|
the single SPDK shared lib encompassing all of the SPDK static libs
|
|
|
|
(`libspdk.so`) as well as individual SPDK shared libs corresponding to each
|
|
|
|
of the SPDK static ones.
|
|
|
|
|
|
|
|
In order to start a SPDK app linked with SPDK shared libraries, make sure
|
|
|
|
to do the following steps:
|
2020-02-04 15:41:17 +00:00
|
|
|
|
2018-10-24 07:16:07 +00:00
|
|
|
- run ldconfig specifying the directory containing SPDK shared libraries
|
|
|
|
- provide proper `LD_LIBRARY_PATH`
|
|
|
|
|
2020-09-24 08:29:20 +00:00
|
|
|
If DPDK shared libraries are used, you may also need to add DPDK shared
|
|
|
|
libraries to `LD_LIBRARY_PATH`
|
|
|
|
|
2018-10-24 07:16:07 +00:00
|
|
|
Linux:
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
./configure --with-shared
|
|
|
|
make
|
|
|
|
ldconfig -v -n ./build/lib
|
2020-09-24 08:29:20 +00:00
|
|
|
LD_LIBRARY_PATH=./build/lib/:./dpdk/build/lib/ ./build/bin/spdk_tgt
|
2018-10-24 07:16:07 +00:00
|
|
|
~~~
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
<a id="huge"></a>
|
|
|
|
## Hugepages and Device Binding
|
2015-09-25 16:13:05 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
~~~{.sh}
|
|
|
|
sudo scripts/setup.sh
|
|
|
|
~~~
|
2016-03-08 21:26:03 +00:00
|
|
|
|
2017-11-02 02:37:23 +00:00
|
|
|
Users may wish to configure a specific memory size. Below is an example of
|
|
|
|
configuring 8192MB memory.
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
sudo HUGEMEM=8192 scripts/setup.sh
|
|
|
|
~~~
|
|
|
|
|
2021-09-28 19:47:13 +00:00
|
|
|
There are a lot of other environment variables that can be set to configure
|
|
|
|
setup.sh for advanced users. To see the full list, run:
|
|
|
|
|
|
|
|
~~~{.sh}
|
|
|
|
scripts/setup.sh --help
|
|
|
|
~~~
|
|
|
|
|
2017-05-28 19:35:46 +00:00
|
|
|
<a id="examples"></a>
|
|
|
|
## Example Code
|
2016-03-08 21:26:03 +00:00
|
|
|
|
|
|
|
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.
|
2017-05-28 19:35:46 +00:00
|
|
|
|
|
|
|
<a id="contributing"></a>
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
For additional details on how to get more involved in the community, including
|
2018-08-27 08:42:35 +00:00
|
|
|
[contributing code](http://www.spdk.io/development) and participating in discussions and other activities, please
|
2017-05-28 19:35:46 +00:00
|
|
|
refer to [spdk.io](http://www.spdk.io/community)
|