Overview
Scord is an open-source storage coordination service designed for Linux HPC clusters. As a storage coordination service, Scord provides facilities for system administrators to easily model their storage hierarchies and expose them to users in a consistent manner. Once the storage architecture is modelled, Scord can efficiently orchestrate data transfers between the different storage tiers in order to support complex HPC workloads using node-local storage, burst buffers and ad-hoc storage systems.
ℹ️ Important
This software was partially supported by the EuroHPC-funded project ADMIRE
(Project ID: 956748, https://www.admire-eurohpc.eu).
Building and installing
This section describes how to build and install Scord. Two main options are basically supported out of the box:
- Automatically building both Scord and its dependencies using Spack.
- Build and install Scord manually.
Building scord and its dependencies with Spack
Scord and all its dependencies can be built using
Spack. If you already have Spack, make sure
you have the latest release. If you use a clone of the Spack develop
branch, be sure to pull the latest changes.
Installing Spack
If you haven't already, install Spack with the following commands:
$ git clone -c feature.manyFiles=true https://github.com/spack/spack
This will create a directory called spack
in your machine. Once you have
cloned Spack, we recommend sourcing the appropriate script for your shell.
This will add Spack to your PATH
and enable the use of the spack
command:
# For bash/zsh/sh
$ . spack/share/spack/setup-env.sh
# For tcsh/csh
$ source spack/share/spack/setup-env.csh
# For fish
$ . spack/share/spack/setup-env.fish
Since Scord is not yet available in the official Spack repositories, you need
to add the Scord Spack repository to the local Spack namespace in your
machine. To do so, download the
spack/
directory
located in the root of Scord's repository root to your machine (e.g. under
~/projects/scord/spack
) and execute the following:
spack repo add ~/projects/scord/spack/
You should now be able to fetch information from the Scord package using Spack:
spack info scord
If that worked, you are now ready to install Scord:
spack install scord
You can include or remove variants with Spack when a custom Scord build is desired. The available variants are listed below:
Variant | Command | Default | Description |
---|---|---|---|
OFI | scord+ofi |
True | Use libfabric as transport library |
UCX | scord+ucx |
False | Use ucx as transport library |
⚠️ Attention
The initial install could take a while as Spack will install build dependencies (autoconf, automake, m4, libtool, pkg-config, etc.) as well as any dependencies of dependencies (cmake, perl, etc.) if you don’t already have these dependencies installed through Spack.
After the installation completes, remember that you first need to load Scord in order to use it:
spack load scord
Building scord manually
If you prefer to build and install Scord from sources, you can also do so but bear in mind that compiling and running Scord requires up-to-date versions of various software packages that will need to be available in your system. Also beware that using excessively old versions of these packages can cause indirect errors that are very difficult to track down.
With that in mind, the following software packages are required to build Scord and need to be available in the system:
- A C++ compiler that supports the C++20 standard, for example GCC/Clang versions 8.0/6.0 or later.
- CMake 3.19 or later.
- pkg-config 0.29.1 (earlier versions will probably work but haven't been tested).
- yaml-cpp version 0.6.2 and later.
- Margo version 0.9.8 and later, and its dependencies:
- Thallium version 0.10.1 or later.
- [libconfig-dev] version 1.4.9 or later.
- agios (development branch)
-
redis-plus-plus version 1.3.
3 or later, and its dependencies:
- hiredis version 0.14.1 or later.
The following libraries are also required by Scord, but will be automatically downloaded and compiled by the project as part of the standard build process.
- {fmt} version 8.0.1 or later.
- spdlog version 1.9.2 or later.
- Catch2 version 3.0.1 or later.
- tl/expected.
- file_options.
- gen_opts.
ℹ️ Important
Margo and Argobots usepkg-config
to ensure they compile and link correctly with all of their dependencies' libraries. When building Scord manually, you'll need to appropriately set either thePKG_CONFIG_PATH
environment variable or theCMAKE_PREFIX_PATH
CMake variable to the appropriate installation paths where the.pc
files for Argobots and Margo reside.
Building
You may either install the full sources or clone the repository directly. The
package relies on CMake to build the service, which requires you to do an
out-of-source build. Thus, once the Scord sources are located in an
appropriate SCORD_SOURCES
directory (for example, $HOME/scord
), you can
build the service by running the following commands:
# replace <SCORD_SOURCES> with the directory where you cloned/unpacked
# the project sources
cd <SCORD_SOURCES>
mkdir build
cd build
# replace <CMAKE_OPTIONS> with your desired options for scord (see below)
cmake <CMAKE_OPTIONS> ..
make
A more complex example:
The following CMake options can be used to configure how Scord is built:
-
SCORD_TRANSPORT_LIBRARY
: This option allows configuring the transport library used by the service. Currently, bothlibfabric
anducx
are supported. -
SCORD_TRANSPORT_PROTOCOL
: This option allows configuring the default transport protocol used by the service. The value provided here will be used to set thetransport_protocol
configuration option in the${PREFIX}/etc/scord.conf
installed alongside the service. -
SCORD_BIND_ADDRESS
: This option allows configuring the default address used to communicate with the service. The value provided here will be used to set thebind_address
configuration option in the${PREFIX}/etc/scord.conf
installed alongside the service. -
SCORD_BIND_PORT
: This option allows configuring the default port used to communicate with the service. The value provided here will be used to set thebind_port
configuration option in the${PREFIX}/etc/scord.conf
installed alongside the service. -
SCORD_BUILD_EXAMPLES
: This option instructs CMake to build the programs contained in theexamples
subdirectory. -
SCORD_BUILD_TESTS
: This option instructs CMake to build the tests contained in thetests
subdirectory.
Thus, let's assume that we want to build Scord with the following configuration:
- The service should use
libfabric
as the transport library. - The service should use
tcp
as the communication protocol. - The server should listen for RPCs on address
192.168.0.111
and on port52000
. - Usage examples should be built.
Let's also assume that Scord sources are located in $HOME/scord
, that
dependencies were installed in /opt
, and that we also want to install
Scord in /usr/local
. Taking into account all these requirements, Scord
can be built by running the following commands:
cd $HOME/scord
mkdir build && cd build
cmake -DCMAKE_PREFIX_PATH:STRING=/opt \
-DCMAKE_INSTALL_PREFIX:STRING=/usr/local \
-DSCORD_BUILD_EXAMPLES:BOOL=ON \
-DSCORD_BUILD_TESTS:BOOL=ON \
-DSCORD_TRANSPORT_LIBRARY=libfabric \
-DSCORD_TRANSPORT_PROTOCOL=ofi+tcp \
-DSCORD_BIND_ADDRESS=192.168.0.111 \
-DSCORD_BIND_PORT=52000 \
..
make
Running tests
Tests are integrated in CTest, CMake's testing facility. Once built, the
tests can be run in parallel using the ctest
command line tool:
~/projects/scord/build $ ctest --parallel 4
Test project /home/amiranda/var/projects/scord/repo/build
Start 1: Scenario: Error messages can be printed
1/1 Test #1: Scenario: Error messages can be printed ... Passed 0.14 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.14 sec
Installing
Assuming that the CMAKE_INSTALL_PREFIX
has been set (see previous step) and
that you have write permissions to the destination directory, Scord can be
installed by running the following command from the build directory:
make install
Running the service
Once built, the service can be started with:
scord
Testing the configuration
If you just want to test that everything works as it should, you can start Scord in foreground mode and redirect its logging output to the console with the following command:
scord -f --force-console
Which should produce output similar to the following:
[2021-11-19 10:30:30.010445] [scord] [131119] [info] ===================================
[2021-11-19 10:30:30.010476] [scord] [131119] [info] Starting scord daemon (pid 158733)
[2021-11-19 10:30:30.010480] [scord] [131119] [info] ===================================
[2021-11-19 10:30:30.010483] [scord] [131119] [info]
[2021-11-19 10:30:30.010486] [scord] [131119] [info] [[ Configuration ]]
[2021-11-19 10:30:30.010491] [scord] [131119] [info] - running as daemon?: no
[2021-11-19 10:30:30.010530] [scord] [131119] [info] - log file: "/usr/local/var/scord/scord.log"
[2021-11-19 10:30:30.010592] [scord] [131119] [info] - log file maximum size: 16777216
[2021-11-19 10:30:30.010613] [scord] [131119] [info] - pidfile: "/usr/local/var/run/scord/scord.pid"
[2021-11-19 10:30:30.010646] [scord] [131119] [info] - port for remote requests: 52000
[2021-11-19 10:30:30.010650] [scord] [131119] [info] - workers: 4
[2021-11-19 10:30:30.010653] [scord] [131119] [info]
[2021-11-19 10:30:30.010656] [scord] [131119] [info] [[ Starting up ]]
[2021-11-19 10:30:30.010658] [scord] [131119] [info] * Installing signal handlers...
[2021-11-19 10:30:30.010853] [scord] [131119] [info] * Creating RPC listener...
[2021-11-19 10:30:30.066151] [scord] [131119] [info]
[2021-11-19 10:30:30.066161] [scord] [131119] [info] [[ Start up successful, awaiting requests... ]]
Now we can use one of the example programs to send a ping
RPC to Scord:
cd $HOME/scord/build/examples
./ADM_ping ofi+tcp://192.168.0.111:52000
And the server logs should update with an entry similar the following one:
[2021-11-19 12:58:35.882827] [scord] [154225] [info] remote_procedure::PING(noargs)
Once finished, the server can be stopped by pressing Ctrl+C:
^C
[2021-11-19 13:19:26.448229] [scord] [158735] [warning] A signal (SIGINT) occurred.
[2021-11-19 13:19:26.552131] [scord] [158733] [info] ===================================
[2021-11-19 13:19:26.552170] [scord] [158733] [info] Stopping scord daemon (pid 158733)
[2021-11-19 13:19:26.552176] [scord] [158733] [info] ===================================
[2021-11-19 13:19:26.552182] [scord] [158733] [info] * Stopping signal listener...
[2021-11-19 13:19:26.552280] [scord] [158733] [info]
[2021-11-19 13:19:26.552289] [scord] [158733] [info] [Stopped]