Files
2026-07-13 12:24:33 +08:00

195 lines
7.3 KiB
ReStructuredText

Filesystem Backend
==================
.. warning::
This page documents the behavior of LMCache's in-process mode (deprecated). Please consider using :doc:`LMCache MP mode </mp/index>` for better feature support and performance. For the MP mode equivalent of this page, see :doc:`/mp/l2_storage/fs`.
The filesystem backend uses ``FSConnector`` to store LMCache remote chunks as
files under one or more POSIX filesystem directories. It is useful when you want
a simple persistent remote backend, or when multiple inference workers can see
the same mounted directory through local disk, NFS, a parallel filesystem, or a
container volume.
This backend is different from :doc:`local_storage`. Local disk offloading is a
per-process local tier configured through ``local_disk``. ``FSConnector`` is a
remote backend configured through ``remote_storage_plugins`` or the legacy
``remote_url`` field, so it participates in the same remote backend path as
Redis, S3, Mooncake, and other remote connectors.
When to use it
--------------
Use ``FSConnector`` when:
* You need a lightweight persistent remote backend for development, examples,
or benchmark runs.
* Multiple LMCache or vLLM processes share a mounted cache directory.
* Your storage is already exposed as a filesystem and does not need a separate
object-store or key-value service.
* You want to test remote-backend behavior before moving to a production
backend such as Redis, Valkey, S3, Mooncake, or InfiniStore.
Avoid using it when:
* The filesystem is not shared by every process that must read the cache.
* You need object-store semantics, cross-region persistence, or service-level
access control.
* The storage path is on a slow network filesystem and sits on the hot request
path.
Recommended configuration
-------------------------
The recommended form is the built-in remote storage plugin configuration. The
plugin name ``fs`` selects ``FSConnector`` and the base path is configured in
``extra_config``.
.. code-block:: yaml
chunk_size: 256
local_cpu: false
max_local_cpu_size: 1
save_unfull_chunk: false
remote_serde: "naive"
blocking_timeout_secs: 10
remote_storage_plugins: ["fs"]
extra_config:
remote_storage_plugin.fs.base_path: "/tmp/lmcache-fs"
save_chunk_meta: false
``FSConnector`` creates the base directory if it does not already exist. Each
cache chunk is written as a ``.data`` file whose name is derived from the
LMCache cache key.
Multiple filesystem instances
-----------------------------
You can configure multiple named ``fs`` instances by appending an instance name
after the connector type. The part before the first dot is still the connector
type; the full plugin name becomes the ``extra_config`` prefix.
.. code-block:: yaml
remote_storage_plugins: ["fs.primary", "fs.backup"]
extra_config:
remote_storage_plugin.fs.primary.base_path: "/mnt/cache-primary/lmcache"
remote_storage_plugin.fs.backup.base_path: "/mnt/cache-backup/lmcache"
save_chunk_meta: false
This is useful when a deployment wants separate filesystem-backed remote stores
for different cache policies, traffic classes, or experiments.
Multiple base paths
-------------------
``remote_storage_plugin.<name>.base_path`` may contain a comma-separated list of
directories. The connector chooses a directory by hashing the cache chunk key,
which spreads files across the configured paths.
.. code-block:: yaml
remote_storage_plugins: ["fs"]
extra_config:
remote_storage_plugin.fs.base_path: "/mnt/nvme0/lmcache,/mnt/nvme1/lmcache"
save_chunk_meta: false
Use multiple paths when each path maps to an independent storage device or mount
point. For best results, keep every path visible to the LMCache processes that
need to retrieve the same chunks.
Legacy ``remote_url`` configuration
-----------------------------------
The legacy ``remote_url`` form is still supported. The host and port are parsed
for compatibility with other remote URL formats; ``FSConnector`` uses the path.
.. code-block:: yaml
chunk_size: 256
local_cpu: false
max_local_cpu_size: 1
save_unfull_chunk: false
remote_url: "fs://localhost:0/tmp/lmcache-fs"
remote_serde: "naive"
blocking_timeout_secs: 10
extra_config:
save_chunk_meta: false
Prefer ``remote_storage_plugins`` for new deployments because it also supports
named instances and keeps connector-specific settings grouped by plugin name.
Optional settings
-----------------
The connector reads the following optional settings from ``extra_config``.
``fs_connector_relative_tmp_dir``
Relative directory used for temporary files before an atomic rename into the
final chunk path. The value must be relative, not absolute. When omitted,
temporary files are created next to the final file with a ``.tmp`` suffix.
``fs_connector_read_ahead_size``
Number of bytes to read first when loading a chunk. If the read fills that
window, the connector reads the remaining bytes. This can trigger filesystem
readahead on filesystems that support it.
``fs_connector_use_odirect``
Enables ``O_DIRECT`` for aligned reads and writes on platforms that expose
it. The connector falls back to normal I/O when a chunk size is not aligned
to the filesystem block size. ``O_DIRECT`` is disabled automatically when
``save_chunk_meta`` is enabled because the metadata prefix is not block
aligned.
``fs_base_path``
Compatibility fallback for plugin mode. Prefer
``remote_storage_plugin.<name>.base_path`` so the setting remains scoped to a
specific plugin instance.
Example with optional settings:
.. code-block:: yaml
remote_storage_plugins: ["fs"]
extra_config:
remote_storage_plugin.fs.base_path: "/data/lmcache-fs"
fs_connector_relative_tmp_dir: ".tmp"
fs_connector_read_ahead_size: 1048576
fs_connector_use_odirect: true
save_chunk_meta: false
Operational notes
-----------------
* Ensure the LMCache process has permission to create directories and write
files under every configured base path.
* Put the path on durable storage if cache reuse must survive process restarts.
Temporary directories such as ``/tmp`` are convenient for tests but may be
cleaned by the operating system.
* Use the same mounted path for every process that should share cache chunks.
If one process writes to a private container path, other processes will miss
those chunks even if they use the same configuration text.
* Leave ``save_chunk_meta`` enabled when workers may infer different metadata
for the same chunk. Disable it only when you need the lower overhead path and
the workers share compatible cache metadata.
* For MP mode L2 storage, see :doc:`../../mp/l2_storage/index`, which documents the
``fs`` and ``fs_native`` L2 adapters configured through ``--l2-adapter``.
Minimal vLLM usage
------------------
After writing ``fs.yaml`` with one of the configurations above, start vLLM with
LMCache enabled:
.. code-block:: bash
LMCACHE_CONFIG_FILE=fs.yaml vllm serve meta-llama/Llama-3.1-8B-Instruct \
--kv-transfer-config '{"kv_connector":"LMCacheConnectorV1", "kv_role":"kv_both"}' \
--disable-log-requests
Then send the same long-prefix request twice. The first request stores chunks in
the filesystem backend. The second request should report LMCache hit tokens and
load matching chunks from the configured filesystem path.