aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man/man4/zfs.414
-rw-r--r--module/zfs/arc.c11
2 files changed, 18 insertions, 7 deletions
diff --git a/man/man4/zfs.4 b/man/man4/zfs.4
index 717cf8e6e..c17bfb80b 100644
--- a/man/man4/zfs.4
+++ b/man/man4/zfs.4
@@ -121,20 +121,26 @@ Controls whether buffers present on special vdevs are eligible for caching
into L2ARC.
If set to 1, exclude dbufs on special vdevs from being cached to L2ARC.
.
-.It Sy l2arc_mfuonly Ns = Ns Sy 0 Ns | Ns 1 Pq int
+.It Sy l2arc_mfuonly Ns = Ns Sy 0 Ns | Ns 1 Ns | Ns 2 Pq int
Controls whether only MFU metadata and data are cached from ARC into L2ARC.
This may be desired to avoid wasting space on L2ARC when reading/writing large
amounts of data that are not expected to be accessed more than once.
.Pp
-The default is off,
+The default is 0,
meaning both MRU and MFU data and metadata are cached.
-When turning off this feature, some MRU buffers will still be present
-in ARC and eventually cached on L2ARC.
+When turning off this feature (setting it to 0), some MRU buffers will
+still be present in ARC and eventually cached on L2ARC.
.No If Sy l2arc_noprefetch Ns = Ns Sy 0 ,
some prefetched buffers will be cached to L2ARC, and those might later
transition to MRU, in which case the
.Sy l2arc_mru_asize No arcstat will not be Sy 0 .
.Pp
+Setting it to 1 means to L2 cache only MFU data and metadata.
+.Pp
+Setting it to 2 means to L2 cache all metadata (MRU+MFU) but
+only MFU data (ie: MRU data are not cached). This can be the right setting
+to cache as much metadata as possible even when having high data turnover.
+.Pp
Regardless of
.Sy l2arc_noprefetch ,
some MFU buffers might be evicted from ARC,
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
index f25afa312..d7ee9d32a 100644
--- a/module/zfs/arc.c
+++ b/module/zfs/arc.c
@@ -9055,12 +9055,17 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz)
*/
for (int pass = 0; pass < L2ARC_FEED_TYPES; pass++) {
/*
- * If pass == 1 or 3, we cache MRU metadata and data
- * respectively.
+ * pass == 0: MFU meta
+ * pass == 1: MRU meta
+ * pass == 2: MFU data
+ * pass == 3: MRU data
*/
- if (l2arc_mfuonly) {
+ if (l2arc_mfuonly == 1) {
if (pass == 1 || pass == 3)
continue;
+ } else if (l2arc_mfuonly > 1) {
+ if (pass == 3)
+ continue;
}
uint64_t passed_sz = 0;