mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Non-l2arc pool reads shouldn't be l2arc misses
The current l2_misses accounting behavior treats all reads to pools without a configured l2arc as an l2arc miss, IFF there is at least one other pool on the system which does have an l2arc configured. This makes it extremely hard to tune for an improved l2arc hit/miss ratio because this ratio will be modulated by reads from pools which do not (and should not) have l2arc devices; its upper limit will depend on the ratio of reads from l2arc'd pools and non-l2arc'd pools. This PR prevents ARC reads affecting l2arc stats (n.b. l2_misses is the only relevant one) where the target spa doesn't have an l2arc. Includes new test - l2arc_l2miss_pos.ksh Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Amanakis <gamanakis@gmail.com> Signed-off-by: Adam Moss <c@yotes.com> Closes #10921
This commit is contained in:
+21
-8
@@ -6305,7 +6305,11 @@ top:
|
||||
metadata, misses);
|
||||
}
|
||||
|
||||
if (vd != NULL && l2arc_ndev != 0 && !(l2arc_norw && devw)) {
|
||||
/* Check if the spa even has l2 configured */
|
||||
const boolean_t spa_has_l2 = l2arc_ndev != 0 &&
|
||||
spa->spa_l2cache.sav_count > 0;
|
||||
|
||||
if (vd != NULL && spa_has_l2 && !(l2arc_norw && devw)) {
|
||||
/*
|
||||
* Read from the L2ARC if the following are true:
|
||||
* 1. The L2ARC vdev was previously cached.
|
||||
@@ -6406,15 +6410,24 @@ top:
|
||||
} else {
|
||||
if (vd != NULL)
|
||||
spa_config_exit(spa, SCL_L2ARC, vd);
|
||||
|
||||
/*
|
||||
* Skip ARC stat bump for block pointers with
|
||||
* embedded data. The data are read from the blkptr
|
||||
* itself via decode_embedded_bp_compressed().
|
||||
* Only a spa with l2 should contribute to l2
|
||||
* miss stats. (Including the case of having a
|
||||
* faulted cache device - that's also a miss.)
|
||||
*/
|
||||
if (l2arc_ndev != 0 && !embedded_bp) {
|
||||
DTRACE_PROBE1(l2arc__miss,
|
||||
arc_buf_hdr_t *, hdr);
|
||||
ARCSTAT_BUMP(arcstat_l2_misses);
|
||||
if (spa_has_l2) {
|
||||
/*
|
||||
* Skip ARC stat bump for block pointers with
|
||||
* embedded data. The data are read from the
|
||||
* blkptr itself via
|
||||
* decode_embedded_bp_compressed().
|
||||
*/
|
||||
if (!embedded_bp) {
|
||||
DTRACE_PROBE1(l2arc__miss,
|
||||
arc_buf_hdr_t *, hdr);
|
||||
ARCSTAT_BUMP(arcstat_l2_misses);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user