# MinIO MemKV RELEASE.2026-06-12T05-44-50Z

Released: 2026-06-12

Cuts lock contention from the per-request hot path so concurrent DC operations fan out across the full DCI pool, fixes RoCEv2 GID selection on routed IPv6 fabrics, and fixes a read truncation on values larger than 2 MiB. Adds Grafana dashboards and a slab-fragmentation metric. No protocol changes.

---

## Downloads

### Server Binary

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [memkv](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv) |
| Linux    | arm64        | [memkv](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv) |

### NIXL Plugin (for Dynamo / KVBM integrations)

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [libplugin_MEMKV.so](https://dl.min.io/aistor/memkv/release/linux-amd64/libplugin_MEMKV.so) |
| Linux    | arm64        | [libplugin_MEMKV.so](https://dl.min.io/aistor/memkv/release/linux-arm64/libplugin_MEMKV.so) |

### LD_PRELOAD Shim (for MLPerf-Storage kvcache workloads)

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [libmemkv_preload.so](https://dl.min.io/aistor/memkv/release/linux-amd64/libmemkv_preload.so) |
| Linux    | arm64        | [libmemkv_preload.so](https://dl.min.io/aistor/memkv/release/linux-arm64/libmemkv_preload.so) |

### Packages

`.deb`, `.rpm`, and `.apk` packages bundle the server + both `.so` sidecars + the LMCache and sglang Python wheels into a single per-arch install.

| Format | Architecture | Download |
| ------ | ------------ | -------- |
| DEB    | amd64        | [memkv\_20260612054450.0.0_amd64.deb](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260612054450.0.0_amd64.deb) |
| DEB    | arm64        | [memkv\_20260612054450.0.0_arm64.deb](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260612054450.0.0_arm64.deb) |
| RPM    | amd64        | [memkv-20260612054450.0.0-1.x86_64.rpm](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv-20260612054450.0.0-1.x86_64.rpm) |
| RPM    | arm64        | [memkv-20260612054450.0.0-1.aarch64.rpm](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv-20260612054450.0.0-1.aarch64.rpm) |
| APK    | amd64        | [memkv\_20260612054450.0.0_x86_64.apk](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260612054450.0.0_x86_64.apk) |
| APK    | arm64        | [memkv\_20260612054450.0.0_aarch64.apk](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260612054450.0.0_aarch64.apk) |

After installing the deb/rpm, the Python plugin wheels land at `/usr/share/memkv/wheels/`:

```bash
pip install /usr/share/memkv/wheels/memkv_lmcache-*.whl
pip install /usr/share/memkv/wheels/memkv_sglang-*.whl
```

The NIXL plugin is auto-symlinked to `/opt/nvidia/nvda_nixl/lib/plugins/` when that directory exists (postinstall hook).

### Container Image

```bash
docker pull quay.io/minio/memkv:RELEASE.2026-06-12T05-44-50Z
docker pull quay.io/minio/memkv:latest
```

Container ships the server + the NIXL plugin (under `/usr/local/lib/plugins/`). The LD_PRELOAD shim and Python wheels are not included in the container image — use the deb/rpm for those.

### Verification

Each binary is signed with both minisign (preferred) and GPG; sha256sums are published alongside.

```bash
# minisign
minisign -Vm memkv -P RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav

# sha256
sha256sum -c memkv.sha256sum
```

---

## Changes since RELEASE.2026-06-07T15-11-42Z

### Performance Improvements

- Concurrent DC operations on one connection no longer collapse to a single in-flight transfer. The RDMA client held the connection lock across the DCI post and the blocking completion poll, serializing work the 256-DCI pool is meant to parallelize; the lock now drops before the post, and server-side completion polls no longer pin a shard so reapers on that shard run unblocked.
- Trimmed contention across the rest of the hot path: shared read locks for cached B-tree node lookups, a generation-counter fast path that skips engine replay locks, a shared-lock read of the TCP client's cached connection, and a 16× finer JBOF extent lock (256 → 4096 shards) to cut false collisions.

### Bug Fixes

- Fixed a read truncation on values larger than 2 MiB; large reads could return a short buffer end to end, now corrected across the client engine, server handler, block manager, and memory pools. `LookupResponse.size` is now documented as always the committed value length — an uncommitted or mid-write-failed key returns `NotFound` rather than exposing a partially filled buffer.

### Hardware / Compatibility

- Fixed RoCEv2 GID selection on routed IPv6 fabrics. Auto-detection picked the lowest-index non-IPv4-mapped GID, so on an IPv6-only fabric where the link-local (`fe80::/10`) GID sat below the routable global GID it chose the non-routable address and broke routed RoCEv2. Selection now prefers a routable GID and falls back to link-local only as a last resort; `gid_index 0` means auto-detect and a non-zero index is still an explicit override.

### Observability

- Added Grafana dashboards under `observability/` showing the cache-tier story for a MemKV deployment — work absorbed by each tier (GPU HBM prefix cache, local CPU cache, MemKV over RDMA/TCP) and per-node MemKV behavior. Three variants share an identical `memkv_*` server section with unique UIDs so they import side by side: vLLM + LMCache, SGLang + HiCache, and NVIDIA Dynamo. See `observability/README.md` for prerequisites.
- Added the `memkv_slabs_largest_free_run` metric (largest contiguous free slab run); a low value alongside many free slabs signals memory fragmentation.

---

## Documentation

- Hosted docs: <https://docs.min.io/memkv/>
- Embedded docs (in the binary): `memkv doc` serves the same site locally.

## Support

- Security disclosures: security@min.io
