Ignore zfs_arc_shrinker_limit in direct reclaim mode
zfs_arc_shrinker_limit (default: 10000) avoids ARC collapse due to excessive memory reclaim. However, when the kernel is in direct reclaim mode (ie: low on memory), limiting ARC reclaim increases OOM risk. This is especially true on system without (or with inadequate) swap. This patch ignores zfs_arc_shrinker_limit when the kernel is in direct reclaim mode, avoiding most OOM. It also restores "echo 3 > /proc/sys/vm/drop_caches" ability to correctly drop (almost) all ARC. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Adam Moss <c@yotes.com> Signed-off-by: Gionatan Danti <g.danti@assyoma.it> Closes #16313
This commit is contained in:
parent
a2c4e95cfd
commit
bbe8512a93
|
@ -838,6 +838,7 @@ This is a limit on how many pages the ARC shrinker makes available for
|
|||
eviction in response to one page allocation attempt.
|
||||
Note that in practice, the kernel's shrinker can ask us to evict
|
||||
up to about four times this for one allocation attempt.
|
||||
To reduce OOM risk, this limit is applied for kswapd reclaims only.
|
||||
.Pp
|
||||
The default limit of
|
||||
.Sy 10000 Pq in practice, Em 160 MiB No per allocation attempt with 4 KiB pages
|
||||
|
|
|
@ -201,9 +201,9 @@ arc_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
|
|||
* See also the comment above zfs_arc_shrinker_limit.
|
||||
*/
|
||||
int64_t can_free = btop(arc_evictable_memory());
|
||||
int64_t limit = zfs_arc_shrinker_limit != 0 ?
|
||||
zfs_arc_shrinker_limit : INT64_MAX;
|
||||
return (MIN(can_free, limit));
|
||||
if (current_is_kswapd() && zfs_arc_shrinker_limit)
|
||||
can_free = MIN(can_free, zfs_arc_shrinker_limit);
|
||||
return (can_free);
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
|
|
Loading…
Reference in New Issue