Mercurial > illumos > illumos-gate
changeset 12636:13b5d698941e
6950219 large ghost eviction causes high write latency
6953403 arc_adjust might adjust MRU unnecessarily
6951024 arc_adapt can lead to wild arc_p adjustment
author | Tom Erickson <Tom.Erickson@Sun.COM> |
---|---|
date | Wed, 16 Jun 2010 16:57:34 -0700 |
parents | c51051e2d948 |
children | ea0ebc6fc051 |
files | usr/src/uts/common/fs/zfs/arc.c |
diffstat | 1 files changed, 6 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/arc.c Wed Jun 16 16:53:13 2010 -0700 +++ b/usr/src/uts/common/fs/zfs/arc.c Wed Jun 16 16:57:34 2010 -0700 @@ -1819,8 +1819,9 @@ * Adjust MRU size */ - adjustment = MIN(arc_size - arc_c, - arc_anon->arcs_size + arc_mru->arcs_size + arc_meta_used - arc_p); + adjustment = MIN((int64_t)(arc_size - arc_c), + (int64_t)(arc_anon->arcs_size + arc_mru->arcs_size + arc_meta_used - + arc_p)); if (adjustment > 0 && arc_mru->arcs_lsize[ARC_BUFC_DATA] > 0) { delta = MIN(arc_mru->arcs_lsize[ARC_BUFC_DATA], adjustment); @@ -2107,9 +2108,7 @@ arc_no_grow = FALSE; } - if (2 * arc_c < arc_size + - arc_mru_ghost->arcs_size + arc_mfu_ghost->arcs_size) - arc_adjust(); + arc_adjust(); if (arc_eviction_list != NULL) arc_do_user_evicts(); @@ -2153,6 +2152,7 @@ if (state == arc_mru_ghost) { mult = ((arc_mru_ghost->arcs_size >= arc_mfu_ghost->arcs_size) ? 1 : (arc_mfu_ghost->arcs_size/arc_mru_ghost->arcs_size)); + mult = MIN(mult, 10); /* avoid wild arc_p adjustment */ arc_p = MIN(arc_c - arc_p_min, arc_p + bytes * mult); } else if (state == arc_mfu_ghost) { @@ -2160,6 +2160,7 @@ mult = ((arc_mfu_ghost->arcs_size >= arc_mru_ghost->arcs_size) ? 1 : (arc_mru_ghost->arcs_size/arc_mfu_ghost->arcs_size)); + mult = MIN(mult, 10); delta = MIN(bytes * mult, arc_p); arc_p = MAX(arc_p_min, arc_p - delta);