OpenZFS on Linux and FreeBSD
Go to file
Christian Schwarz 63f8a472af Shared L2ARC - Proof of Concept
(I will give a talk on this PoC at the OpenZFS Developer Summit 2022.)

The ARC dynamically shares DRAM capacity among all currently imported zpools.
However, the L2ARC does not do the same for block capacity: the L2ARC vdevs of
one zpool only cache buffers of that zpool. This can be undesirable on systems
that host multiple zpools because it inhibits dynamic sharing of the cache
device capacity which is desirable if the need for L2ARC varies among zpools
over time, or if the set of zpools that are imported in the system varies over
time.

Shared L2ARC addresses this need by decoupling the L2ARC vdevs from the
zpools that store actual data. The mechanism that we use is to place the L2ARC
vdevs into a special zpool, and to adjust the L2ARC feed thread logic to use
that special zpool's L2ARC vdevs for all zpools' buffers.

High-level changes:

* Reserve "NTNX-fsvm-local-l2arc" as a magic zpool name.
  We call this "the l2arc pool".
  All other pools are called "primary pools".
* Make l2arc feed thread feed ARC buffers from any zpool to the l2arc zpool.
  (Before this patch, the l2arc feed thread would only feed ARC buffers to
  l2arc devices if they are for the same spa_t).
* Change the locking to ensure that the l2arc zpool cannot be removed while
  there are ongoing reads initiated by arc_read on one of the primary pools.

This is sufficient and retains correctness of the ARC because nothing
about the fundamental operation of L2ARC changes. The only thing that changes
is that the L2ARC data is stored on vdevs outside the primary pool.

Proof Of Concept => Production
==============================

This commit is a proof-of-concept.
It works, it results in the desired performance improvement, and it's stable.
But to make it production ready, more work needs to be done.

(1) The design is based on a version of ZFS that does not support
encryption nor Persisent L2ARC. I'm no expert in either of these features.
Encryption might work just fine as long as the l2arc feed thread can access
the encryption keys for l2arc_apply_transforms.
But Persistent L2ARC definitely needs more design work
(multiple L2ARC headers?).

(2) Remove hard-coded magic name; use a property instead.
Make it opt-in so that existing setups are not affected.
Example:
  zpool create -o share_l2arc_vdevs=on my-l2arc-pool

(3) Coexistence with non-shared L2ARC; also via property.
Make it opt-in so that existing setups are not affected.
Example:
  zpool set use_shared_l2arc=on my-data-pool

Signed-off-by: Christian Schwarz <christian.schwarz@nutanix.com>
2022-10-20 11:31:59 +00:00
.github CI: bump actions/upload-artifact to v3 2022-10-12 15:18:39 -07:00
cmd Shared L2ARC - Proof of Concept 2022-10-20 11:31:59 +00:00
config zed: mark disks as REMOVED when they are removed 2022-09-28 09:48:46 -07:00
contrib PAM: Fix unchecked return value from zfs_key_config_load() 2022-10-05 17:09:24 -07:00
etc etc: mask zfs-load-key.service 2022-10-12 15:27:55 -07:00
include Shared L2ARC - Proof of Concept 2022-10-20 11:31:59 +00:00
lib Shared L2ARC - Proof of Concept 2022-10-20 11:31:59 +00:00
man Bring per_txg_dirty_frees_percent back to 30 2022-09-27 17:38:03 -07:00
module Shared L2ARC - Proof of Concept 2022-10-20 11:31:59 +00:00
rpm Add zilstat script to report zil kstats in a user friendly manner 2022-09-02 13:24:07 -07:00
scripts scripts/enum-extract.pl should not hard code perl path 2022-10-11 12:32:07 -07:00
tests Handle possible null pointers from malloc/strdup/strndup() 2022-10-06 17:18:40 -07:00
udev Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
.editorconfig Add an .editorconfig; document git whitespace settings 2020-01-27 13:32:52 -08:00
.gitignore autoconf: use include directives instead of recursing down cmd 2022-05-10 10:18:38 -07:00
.gitmodules .gitmodules: link to openzfs github repository 2021-04-12 09:37:23 -07:00
AUTHORS Introduce BLAKE3 checksums as an OpenZFS feature 2022-06-08 15:55:57 -07:00
CODE_OF_CONDUCT.md Replace ZFS on Linux references with OpenZFS 2020-10-08 20:10:13 -07:00
COPYRIGHT Fix typos 2020-06-09 21:24:09 -07:00
LICENSE Update build system and packaging 2018-05-29 16:00:33 -07:00
META Linux 5.19 compat: META 2022-08-02 10:04:38 -07:00
Makefile.am Replace EXTRA_DIST with dist_noinst_DATA 2022-05-26 09:24:50 -07:00
NEWS Fix NEWS file 2020-08-26 21:44:41 -07:00
NOTICE Update build system and packaging 2018-05-29 16:00:33 -07:00
README.md README: Update OpenZFS website url 2022-01-06 16:25:01 -08:00
RELEASES.md Add RELEASES.md file 2021-04-02 16:33:40 -07:00
TEST Remove CI builder customization from TEST 2020-03-16 10:46:03 -07:00
autogen.sh autogen.sh: paper over automake <1.14's lack of %reldir% support 2022-05-10 10:20:46 -07:00
configure.ac Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
copy-builtin copy-builtin: add hooks with sed/>> 2022-05-10 10:17:43 -07:00
zfs.release.in Move zfs.release generation to configure step 2012-07-12 12:22:51 -07:00

README.md

img

OpenZFS is an advanced file system and volume manager which was originally developed for Solaris and is now maintained by the OpenZFS community. This repository contains the code for running OpenZFS on Linux and FreeBSD.

codecov coverity

Official Resources

Installation

Full documentation for installing OpenZFS on your favorite operating system can be found at the Getting Started Page.

Contribute & Develop

We have a separate document with contribution guidelines.

We have a Code of Conduct.

Release

OpenZFS is released under a CDDL license. For more details see the NOTICE, LICENSE and COPYRIGHT files; UCRL-CODE-235197

Supported Kernels

  • The META file contains the officially recognized supported Linux kernel versions.
  • Supported FreeBSD versions are any supported branches and releases starting from 12.2-RELEASE.