Deploy the RDMA server
Install the RDMA build of AIStor Server and configure the service to run it.
Complete Configure the RDMA fabric first. An AIStor node with the RDMA build installed but an unconfigured fabric serves every request over TCP.
What ships in the RDMA release
Each release publishes the RDMA build for Linux on amd64 and arm64, alongside the standard artifacts.
| Artifact | Location |
|---|---|
| Binary | https://dl.min.io/aistor/minio/release/linux-<arch>/minio.rdma |
| Versioned binary | https://dl.min.io/aistor/minio/release/linux-<arch>/minio.<RELEASE>.rdma |
| DEB package | https://dl.min.io/aistor/minio/release/linux-<arch>/minio.rdma_<version>_<arch>.deb |
| RPM package | https://dl.min.io/aistor/minio/release/linux-<arch>/minio.rdma-<version>-1.<arch>.rpm |
| APK package | https://dl.min.io/aistor/minio/release/linux-<arch>/minio.rdma_<version>_<arch>.apk |
| Container image | quay.io/minio/aistor/minio:<RELEASE>.rdma |
The binary carries .asc, .minisig, and .sha256sum files for verification, the same as the standard build.
aistor.deb and aistor.rpm.
The RDMA packages do not.
Use the full versioned filename, where <version> is the release timestamp with the punctuation removed and .0.0 appended.
RELEASE.2026-08-07T18-34-35Z becomes 20260807183435.0.0.
The package architecture suffix follows each package format’s own convention:
| Format | amd64 host |
arm64 host |
|---|---|---|
| DEB | amd64 |
arm64 |
| RPM | x86_64 |
aarch64 |
| APK | x86_64 |
aarch64 |
Install the packages
The RDMA package installs the RDMA binary and its shared libraries.
It does not install the systemd unit, the minio-user account, or the configuration files, so install the standard AIStor package first and add the RDMA package on top.
Install both on every node:
Installing with apt-get install -f or dnf install rather than dpkg -i or rpm -i alone lets the package manager pull the RDMA runtime dependencies.
What the RDMA package installs
| Path | Contents |
|---|---|
/usr/local/bin/minio.rdma |
The RDMA server binary |
/usr/lib/minio/libs3rdma.so.0 |
The S3-over-RDMA transport library |
/usr/lib/minio/libp2p_rdma.so.0.1.0 |
The inter-node RDMA transport library |
/etc/ld.so.conf.d/minio-rdma.conf |
Adds /usr/lib/minio to the dynamic linker search path |
The package’s post-install script writes the ld.so.conf.d entry and runs ldconfig, so the libraries resolve without further action.
It also pulls these runtime dependencies:
| Format | Packages |
|---|---|
| DEB | libibverbs1, librdmacm1, libnuma1 |
| RPM | libibverbs, rdma-core, numactl-libs |
Confirm the binary resolves its libraries:
ldd /usr/local/bin/minio.rdma | grep -E "s3rdma|p2p_rdma|ibverbs|rdmacm"
Every line must show a resolved path.
A not found entry means ldconfig did not run; rerun sudo ldconfig and check again.
Point the service at the RDMA binary
The standard package installs /lib/systemd/system/minio.service, which runs /usr/local/bin/minio.
That path is a symlink to the standard, non-RDMA binary.
Repointing /usr/local/bin/minio at minio.rdma appears to work, but the symlink is a packaged file.
The next upgrade of the standard package restores it, and the node silently reverts to the non-RDMA binary.
Use a systemd drop-in instead. A drop-in lives outside the package’s file list and survives upgrades of both packages.
Create the drop-in on every node:
sudo mkdir -p /etc/systemd/system/minio.service.d
sudo tee /etc/systemd/system/minio.service.d/rdma.conf >/dev/null <<'EOF'
[Unit]
# AssertFileIsExecutable belongs to [Unit], not [Service]. The empty assignment
# clears the packaged value before the new one is set.
AssertFileIsExecutable=
AssertFileIsExecutable=/usr/local/bin/minio.rdma
[Service]
# Run the RDMA build instead of the standard binary.
ExecStart=
ExecStart=/usr/local/bin/minio.rdma server $MINIO_OPTS $MINIO_VOLUMES
# RDMA pins its transfer buffers in physical memory. See "Raise the locked
# memory limit" for how to size a finite value instead.
LimitMEMLOCK=infinity
EOF
sudo systemctl daemon-reload
The empty ExecStart= and AssertFileIsExecutable= lines are not optional.
Both directives accumulate entries across drop-ins.
Without the ExecStart= reset, systemd refuses the unit with Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services.
AssertFileIsExecutable must sit under [Unit].
Placing it under [Service] produces Unknown key 'AssertFileIsExecutable' in section [Service], ignoring and leaves the packaged assertion pointing at the standard binary.
The packaged unit is Type=notify with TimeoutSec=infinity.
Both binaries signal readiness to systemd, so swapping one for the other is safe.
A wrapper script is not.
Anything in ExecStart that does not pass the readiness notification through leaves the service in activating forever, with Restart=always and SendSIGKILL=no preventing a clean recovery.
Check the drop-in parses:
systemd-analyze verify minio.service
Confirm the merged unit before restarting:
systemctl cat minio
The output shows the packaged unit followed by the drop-in.
Check that the final ExecStart names minio.rdma.
Raise the locked memory limit
RDMA registers its transfer buffers with the NIC, which locks them into physical memory.
The packaged unit sets no LimitMEMLOCK, so the service inherits the systemd default of 8 MiB.
RDMA needs several orders of magnitude more.
Setting /etc/security/limits.conf does not fix this.
That file is read by PAM during login, and a systemd-managed service never goes through PAM.
The limit must come from the unit, which is why the drop-in above sets it.
The capabilities the packaged unit already grants do not help either.
Only CAP_IPC_LOCK exempts a process from RLIMIT_MEMLOCK, and the unit grants CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN, and CAP_DAC_OVERRIDE.
Raise the limit rather than adding the capability.
Size the requirement
An RDMA node registers memory in two places.
The inter-node receive-buffer pool. Its size is the product of two settings:
| Setting | Default | Meaning |
|---|---|---|
MINIO_RDMA_POOL_COUNT |
256 |
Number of slabs in the pool |
MINIO_RDMA_POOL_BUF_SIZE |
67108864 (64 MiB) |
Size of each slab |
At the defaults that is 16 GiB, pinned at startup.
The transfer buffer pools. The RDMA build allocates three pools of 4 MiB buffers at startup, sized from the node’s role: 2048 buffers each on a distributed deployment, 1024 on a single node. That is roughly 24 GiB on a distributed node and 12 GiB on a single node.
Together, a distributed node at default settings registers roughly 40 GiB.
LimitMEMLOCK=infinity avoids having to track this as the settings change.
If you set a finite value, cover both figures and round up generously.
Reduce the requirement
On a memory-constrained node, lower MINIO_RDMA_POOL_COUNT, or lower MINIO_RDMA_POOL_BUF_SIZE and raise the count to compensate.
Lowering the slab size has a throughput cost. A PUT shard larger than one slab falls back to TCP rather than using the pre-registered pool. The 64 MiB default is sized for the erasure shard of a typical 64 MiB object.
What an under-sized limit looks like
The two pools fail differently, and neither stops the server from starting.
An under-sized limit that fails the receive pool leaves inter-node RDMA off. The server logs the failure and serves every request over TCP.
An under-sized limit that fails the transfer-buffer registration leaves RDMA running in a degraded mode, registering memory on every write instead of reusing pre-registered regions:
RDMA: sender buffer registration failed (falling back to per-write reg): <error>
Neither case is an error the server surfaces to clients, which is why the checks in Validate the RDMA deployment matter.
Configure the RDMA settings
The packaged unit reads /etc/default/minio as its EnvironmentFile, and that file points MINIO_CONFIG_ENV_FILE at /etc/minio/config.env.
Put every MINIO_RDMA_* variable in /etc/default/minio.
Several of them, including MINIO_RDMA_POOL_COUNT, MINIO_RDMA_POOL_BUF_SIZE, MINIO_RDMA_MIN_SIZE, and MINIO_RDMA_CONCURRENCY, are read during package initialization, before the server loads config.env.
Placed in config.env, they are read too late and silently have no effect.
Keeping all of them in one file avoids having to track which are which.
Enable inter-node RDMA on every node:
sudo tee -a /etc/default/minio >/dev/null <<'EOF'
# Inter-node RDMA
MINIO_RDMA_INTERNODE=on
EOF
The settings must be identical across every node in the deployment. Verify with a checksum:
shasum /etc/default/minio
S3 over RDMA needs no setting.
The client sends the x-amz-rdma-token header, and the server either serves the request over RDMA or declines it and the client falls back to HTTP.
For the full list of settings, see RDMA settings.
Open the peer port
Inter-node RDMA listens on TCP port 5555 by default, configurable with MINIO_RDMA_PEER_PORT.
Open it between cluster nodes only.
Restrict the rule to the cluster’s own addresses.
The RDMA transport does not authenticate source addresses, so an unrestricted rule exposes the peer port to anything that can route to the node.
Replace 10.0.0.0/24 below with the subnet carrying your inter-node traffic.
Start the deployment
Restart the service on every node:
sudo systemctl restart minio
Then confirm the deployment is carrying RDMA traffic. See Validate the RDMA deployment.
Keep the two packages in step
The standard package and the RDMA package upgrade independently, and nothing prevents them from drifting to different versions.
Upgrade both together, and confirm the versions match afterward:
The systemd drop-in and the ld.so.conf.d entry both survive package upgrades.
Re-run systemctl cat minio after an upgrade to confirm the drop-in is still merged.
Security considerations
RDMA transfers are not encrypted. The transport assumes physical-layer security.
- Put RDMA traffic on a dedicated VLAN, separate from client traffic.
- Restrict the peer port to cluster nodes only.
- The RDMA transport does not authenticate source addresses.
SourceIpis an S3 policy condition, so restrict requests by source address through bucket or user policy, which the standard S3 authorization path evaluates.
S3-over-RDMA requests are authenticated through the standard S3 authentication path, the same as HTTP requests. Peer RDMA connections require successful Grid RPC authentication.
Each node maintains isolated memory registration contexts, and memory regions are registered with specific access rights. No direct cross-node memory access is permitted.