]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit - contrib/llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h
MFV r336930: 9284 arc_reclaim_thread has 2 jobs
authorAlexander Motin <mav@FreeBSD.org>
Fri, 15 Mar 2019 18:59:04 +0000 (18:59 +0000)
committerAlexander Motin <mav@FreeBSD.org>
Fri, 15 Mar 2019 18:59:04 +0000 (18:59 +0000)
commit6bb46107d82dc5a12af0a20464216bfd8e2b48ea
tree9a35ee33afdcd68cc3953d6b239376b0d31edc78
parentb6f8cfb93a521e8235160580ebcd3999f1fe9a15
parentec66f8a6e32dbd4d693c47cc9625de866bc1307c
MFV r336930: 9284 arc_reclaim_thread has 2 jobs

`arc_reclaim_thread()` calls `arc_adjust()` after calling
`arc_kmem_reap_now()`; `arc_adjust()` signals `arc_get_data_buf()` to
indicate that we may no longer be `arc_is_overflowing()`.

The problem is, `arc_kmem_reap_now()` can take several seconds to
complete, has no impact on `arc_is_overflowing()`, but due to how the
code is structured, can impact how long the ARC will remain in the
`arc_is_overflowing()` state.

The fix is to use seperate threads to:

1. keep `arc_size` under `arc_c`, by calling `arc_adjust()`, which
    improves `arc_is_overflowing()`

2. keep enough free memory in the system, by calling
 `arc_kmem_reap_now()` plus `arc_shrink()`, which improves
 `arc_available_memory()`.

illumos/illumos-gate@de753e34f9c399037936e8bc547d823bba9d4b0d

Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Serapheim Dimitropoulos <serapheim@delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Tim Kordas <tim.kordas@joyent.com>
Approved by: Garrett D'Amore <garrett@damore.org>
Author: Brad Lewis <brad.lewis@delphix.com>
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zthr.h
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zthr.c