# MinIO MemKV RELEASE.2026-06-26T19-30-24Z

Released: 2026-06-26

The LMCache plugin's MemKV backend now serves **cross-instance** KV reuse: a
prefix prefilled by one vLLM instance (or node) is discovered and reconstituted
by another through MemKV, and the warm read path runs fast enough to make reuse
worthwhile instead of recomputing. This release also clears four RustSec
advisories and adds a CI vulnerability gate, and the LMCache and sglang plugins
are now installable directly from PyPI.

---

## 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\_20260626193024.0.0_amd64.deb](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260626193024.0.0_amd64.deb) |
| DEB    | arm64        | [memkv\_20260626193024.0.0_arm64.deb](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260626193024.0.0_arm64.deb) |
| RPM    | amd64        | [memkv-20260626193024.0.0-1.x86_64.rpm](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv-20260626193024.0.0-1.x86_64.rpm) |
| RPM    | arm64        | [memkv-20260626193024.0.0-1.aarch64.rpm](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv-20260626193024.0.0-1.aarch64.rpm) |
| APK    | amd64        | [memkv\_20260626193024.0.0_x86_64.apk](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260626193024.0.0_x86_64.apk) |
| APK    | arm64        | [memkv\_20260626193024.0.0_aarch64.apk](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260626193024.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).

### Python Plugins (PyPI)

The LMCache and sglang plugins are also published to PyPI, so they install without the deb/rpm:

```bash
pip install memkv-lmcache memkv-sglang
```

The wheels `dlopen` the RDMA libraries at runtime; the transport needs host `rdma-core`, otherwise it falls back to TCP.

### Container Image

```bash
docker pull quay.io/minio/memkv:RELEASE.2026-06-26T19-30-24Z
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 or PyPI 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-12T15-56-28Z

### New Features

- **Cross-instance KV reuse in the LMCache plugin.** A prefix prefilled and stored
  to MemKV by one vLLM instance is now discovered and reconstituted by any other
  instance or node — and survives process restarts. Each value carries a small
  self-describing `{shape, dtype, fmt}` sidecar written after its bytes, so
  `contains()` and `get_blocking()` resolve a chunk's shape from MemKV on a
  local-cache miss instead of from an in-process dict that only the writer had.
  No wire or protocol change: values written by an older client without a sidecar
  simply read as a miss and are re-stored with one.

### Performance

- **Parallel multi-key reads on the retrieve path.** The plugin now overrides
  `batched_get_blocking` to fetch a whole prefix in a single multi-key request,
  the client dispatches the per-server, per-chunk RPCs concurrently, and the
  server caps the read fan-out to its bounce-slab count so a wide batch degrades
  to throughput-limited waves. Warm cross-instance reads reach **~1.0 GB/s per
  worker**, fast enough that reusing a cached prefix beats recomputing it.
- **No more partial reads.** Under concurrent fan-out the previous wide read could
  shed entries and return an incomplete prefix; every tensor-parallel worker now
  retrieves the full prefix.

> Known warm-up: the first cross-instance read after engine start incurs a
> one-time RDMA memory registration of the retrieve buffers (~16–18 s). This is a
> per-process warm-up, not a per-request cost — repeat reads of the same prefix
> run at the warm rate. Pre-registering the retrieve arena at startup is a planned
> follow-up.

### Security Updates

- Cleared four RustSec advisories in the dependency tree:
  - `bytes` 1.11.0 → 1.12.0 — [`GHSA-434x-w66g-qw3r`](https://github.com/advisories/GHSA-434x-w66g-qw3r), `BytesMut::reserve` integer overflow (Medium).
  - `jsonwebtoken` 9 → 10 — [`GHSA-h395-gr6q-cpjc`](https://github.com/advisories/GHSA-h395-gr6q-cpjc), type confusion leading to auth bypass (Medium).
  - `protobuf` removed from the tree — [`GHSA-2gh3-rmm4-6rq5`](https://github.com/advisories/GHSA-2gh3-rmm4-6rq5), uncontrolled recursion (Medium). It arrived only through `prometheus`'s default `protobuf` feature, which powers an exposition format the server never emits; disabling that feature drops it entirely.
  - `rand` 0.8.5 → 0.8.6 — [`GHSA-cq8v-f236-94qc`](https://github.com/advisories/GHSA-cq8v-f236-94qc), unsoundness with a custom logger calling `rand::rng()` (Low).
- Added a CI vulnerability gate: every pull request builds a CycloneDX SBOM from
  the resolved `Cargo.lock` and fails the build on any advisory at or above `low`
  severity, with tracked exceptions recorded in `.grype.yaml`.

---

## 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
