# MinIO MemKV RELEASE.2026-07-15T20-45-38Z

Released: 2026-07-15

This release adds optional AES-256-GCM encryption at rest and a new plugin that
plugs MemKV into vLLM's native KV offloading framework as a secondary tier. It
also fixes a silent-miss failure on large-context requests: the RDMA
control-message cap was too small to carry an existence probe for a long
prompt, so lookups beyond ~25k tokens degraded to misses and nothing was served
from cache.

---

## 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, sglang, and vLLM-tier Python wheels into a single per-arch install.

| Format | Architecture | Download |
| ------ | ------------ | -------- |
| DEB    | amd64        | [memkv\_20260715204538.0.0_amd64.deb](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260715204538.0.0_amd64.deb) |
| DEB    | arm64        | [memkv\_20260715204538.0.0_arm64.deb](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260715204538.0.0_arm64.deb) |
| RPM    | amd64        | [memkv-20260715204538.0.0-1.x86_64.rpm](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv-20260715204538.0.0-1.x86_64.rpm) |
| RPM    | arm64        | [memkv-20260715204538.0.0-1.aarch64.rpm](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv-20260715204538.0.0-1.aarch64.rpm) |
| APK    | amd64        | [memkv\_20260715204538.0.0_x86_64.apk](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260715204538.0.0_x86_64.apk) |
| APK    | arm64        | [memkv\_20260715204538.0.0_aarch64.apk](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260715204538.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
pip install /usr/share/memkv/wheels/memkv_vllm-*.whl   # needs vLLM main (tiering API)
```

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

Install **1.0.4 or later**. 1.0.4 rebuilds both plugins against the client with
the large-context control-message fix below; the earlier 1.0.3 wheels predate
it and silently miss the cache on long prompts. The vLLM tier (`memkv-vllm`)
publishes at 1.0.4 too but requires an unreleased vLLM — see Known Limitations.

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-07-15T20-45-38Z
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-07-08T07-15-37Z

### New Features

- **Optional AES-256-GCM encryption at rest.** Block data is encrypted between
  the RDMA bounce buffer and NVMe on write and decrypted on read, transparent
  to the block manager and the RDMA/TCP data paths. Off by default; enable with
  a `[crypto]` config block and a 32-byte master key:

  ```toml
  [crypto]
  enabled        = true
  master_key_hex = "…64 hex chars (32 bytes)…"
  ```

  Data is encrypted in fixed 64 KiB sectors (`[IV][tag][ciphertext]`) with a
  random per-sector IV and per-block keys derived via HKDF-SHA256, so blocks are
  cryptographically independent and rewrites never reuse a nonce. The release
  binary uses the software path (`ring`, with ARMv8 Crypto Extensions on Grace).
  Hardware offload to a BlueField DPU via NVIDIA DOCA is supported on a
  case-by-case basis today and is not part of the stock release build; contact
  MinIO if you need it. DOCA-enabled builds are planned for general availability
  in a future release.

- **vLLM native KV offloading tier (`memkv-vllm`).** A new plugin registers
  MemKV as a secondary tier under vLLM's own KV offloading framework
  (`OffloadingConnector` + `TieringOffloadingSpec`), alongside vLLM's built-in
  local-disk (`fs`) and S3 (`obj`) tiers. Finished KV blocks that vLLM evicts
  from its pinned CPU pool cascade to a MemKV cluster over RDMA and are promoted
  back on demand, so long prefixes survive CPU-pool eviction and engine
  restarts and are shareable across instances. This is a third integration path
  next to the LMCache plugin (the current production path, unchanged) and the
  NIXL storage backend; it uses no LMCache. Opt-in — zero effect unless
  `secondary_tiers` contains `{"type": "memkv"}`.

### Bug Fixes

- **Large-context requests no longer silently miss the cache.** An existence
  probe for a long prompt (e.g. a 250k-token request encodes to ~322 KB across
  the KV and indexer pools) overflowed the 32 KiB RDMA control-message cap; the
  client refused the SEND and the caller's degrade-to-miss policy turned every
  lookup into a miss, so nothing beyond ~25k tokens was served from cache. The
  control-message cap (`CTRL_MSG_SIZE`) is raised to 1 MiB — one probe now
  covers ~800k tokens — and moved into the shared protocol crate so client and
  server can't drift. The engine also chunks every existence probe under the cap
  by byte budget and falls back to TCP per chunk on RDMA failure, so no request
  can overflow regardless of context length, and the fix covers all callers
  (sglang, NIXL, LMCache) from one path. Per-connection pinned control buffers
  were cut from 64 to 4 to hold the memory bump to 8 MiB/conn.

### Documentation

- The observability guide now documents how to enable Prometheus scraping,
  including the two separate scrape targets (MemKV admin `/v1/metrics` and
  vLLM's own `/metrics` for the client-side panels) and the `pod`-label setup
  required for per-server panels outside Kubernetes.

### Known Limitations

- **The vLLM native tier requires an unreleased vLLM.** No stable vLLM release
  runs the `memkv-vllm` plugin yet. The tiering framework has been in vLLM since
  v0.22.0, but the `SecondaryTierManager` contract the plugin implements first
  appears in the v0.25.0 release candidates, so v0.25.0 is expected to be the
  first stable release that runs it. Until then, deploy against vLLM's per-commit
  main artifacts and re-qualify with the conformance suite baked into the
  serving image. The plugin registers a lazy factory and never raises on vLLM
  builds without the tiering framework, so bundling the wheel is harmless.

---

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