diff --git a/doc/source/admin/config-metadata-caching.rst b/doc/source/admin/config-metadata-caching.rst
new file mode 100644
index 00000000000..be2e8921e12
--- /dev/null
+++ b/doc/source/admin/config-metadata-caching.rst
@@ -0,0 +1,51 @@
+.. _config-metadata-caching:
+
+========================
+Metadata service caching
+========================
+
+The OpenStack Networking service proxies requests that VMs send to the
+Compute service to obtain their metadata. This functionality is provided by the
+``neutron-metadata-agent`` or ``neutron-ovn-metadata-agent``, depending on the
+ML2 backend used in the deployment.
+To obtain metadata from the Compute service, the instance ID needs to be sent
+to the ``nova-metadata-api``.
+These two metadata agents provide the same functionality, but do it
+in slightly different ways, the difference being how the metadata agents find
+out the ID of the instance which is asking for metadata:
+
+* ``neutron-metadata-agent`` uses RPC to ask the neutron-server process for
+ details about a port with a specific fixed IP address connected to the given
+ network or router (proxy service is spawned for each Neutron router or
+ Neutron network),
+* ``neutron-ovn-metadata-agent`` checks the instance ID in the port details of
+ the OVN Southband DB.
+
+For large scale deployments which are using the ``neutron-metadata-agent`` this
+may cause significant load on the RPC bus and neutron-server, since by default
+for each request to the metadata service (``169.254.169.254``), the proxy will
+need to send an RPC query to retrieve the port details, and `cloud-init
+`_ is making many requests to this service
+during the VM boot process.
+To avoid this high load on the RPC bus, the ``neutron-metadata-agent`` allows
+using a caching mechanism for port details.
+Neutron uses `oslo cache
+`_ for
+this and it is configured through the following parameters in the ``cache``
+section of the ``metadata_agent.ini`` file:
+
+* ``enabled``: enables the caching mechanism.
+* ``backend``: backend module to be used for caching.
+* ``expiration_time``: TTL, in seconds, for cached items. In case of
+ ``neutron-metadata-agent`` it is recommended to use some low value here, for
+ example, 10 seconds. Usually cloud-init will make many requests to the
+ metadata service in a short time during boot of a VM, so caching port details
+ for just a few seconds should be enough to avoid many RPC requests. On the
+ other hand, using too big a value may result in having cached details for a
+ port which has already been deleted, as a fixed IP address can be quickly
+ re-associated to a new port in Neutron.
+
+The oslo.cache module provides many more configuration options which can be
+used to tune this caching mechanism. All of them are described in the
+oslo.cache `documentation
+`_.
diff --git a/doc/source/admin/config.rst b/doc/source/admin/config.rst
index 8b162129f81..fa61f7a5868 100644
--- a/doc/source/admin/config.rst
+++ b/doc/source/admin/config.rst
@@ -24,6 +24,7 @@ Configuration
config-ipv6
config-logging
config-macvtap
+ config-metadata-caching
config-metadata-rate-limiting
config-mtu
config-ndp-proxy