From 338664df3f3bc1f21029a55383e932d9e58190ef Mon Sep 17 00:00:00 2001 From: Andy Fiddaman Date: Tue, 9 Jan 2024 14:49:18 +0000 Subject: [PATCH] 16164 Consistently wake all pageout daemon threads 16165 Want kstats for low memory page scans and page creation throttles Reviewed by: Dan Cross Reviewed by: Dan McDonald Approved by: Gordon Ross --- usr/src/uts/common/os/kstat_fr.c | 32 +++++++++++++++++++------------- usr/src/uts/common/os/mem_config.c | 3 ++- usr/src/uts/common/os/vm_pageout.c | 10 ++++------ usr/src/uts/common/sys/vm.h | 6 ++++++ usr/src/uts/common/sys/vmsystm.h | 2 ++ usr/src/uts/common/vm/vm_page.c | 11 +++++++---- usr/src/uts/i86pc/vm/vm_machdep.c | 2 +- 7 files changed, 41 insertions(+), 25 deletions(-) diff --git a/usr/src/uts/common/os/kstat_fr.c b/usr/src/uts/common/os/kstat_fr.c index 93c04cff8d..7a58a7420e 100644 --- a/usr/src/uts/common/os/kstat_fr.c +++ b/usr/src/uts/common/os/kstat_fr.c @@ -198,6 +198,8 @@ struct { kstat_named_t pagesfree; kstat_named_t pageslocked; kstat_named_t pagestotal; + kstat_named_t lowmemscan; + kstat_named_t nthrottle; } system_pages_kstat = { { "physmem", KSTAT_DATA_ULONG }, { "nalloc", KSTAT_DATA_ULONG }, @@ -205,20 +207,22 @@ struct { { "nalloc_calls", KSTAT_DATA_ULONG }, { "nfree_calls", KSTAT_DATA_ULONG }, { "kernelbase", KSTAT_DATA_ULONG }, - { "econtig", KSTAT_DATA_ULONG }, - { "freemem", KSTAT_DATA_ULONG }, - { "availrmem", KSTAT_DATA_ULONG }, - { "lotsfree", KSTAT_DATA_ULONG }, - { "desfree", KSTAT_DATA_ULONG }, - { "minfree", KSTAT_DATA_ULONG }, - { "fastscan", KSTAT_DATA_ULONG }, - { "slowscan", KSTAT_DATA_ULONG }, - { "nscan", KSTAT_DATA_ULONG }, - { "desscan", KSTAT_DATA_ULONG }, - { "pp_kernel", KSTAT_DATA_ULONG }, - { "pagesfree", KSTAT_DATA_ULONG }, - { "pageslocked", KSTAT_DATA_ULONG }, + { "econtig", KSTAT_DATA_ULONG }, + { "freemem", KSTAT_DATA_ULONG }, + { "availrmem", KSTAT_DATA_ULONG }, + { "lotsfree", KSTAT_DATA_ULONG }, + { "desfree", KSTAT_DATA_ULONG }, + { "minfree", KSTAT_DATA_ULONG }, + { "fastscan", KSTAT_DATA_ULONG }, + { "slowscan", KSTAT_DATA_ULONG }, + { "nscan", KSTAT_DATA_ULONG }, + { "desscan", KSTAT_DATA_ULONG }, + { "pp_kernel", KSTAT_DATA_ULONG }, + { "pagesfree", KSTAT_DATA_ULONG }, + { "pageslocked", KSTAT_DATA_ULONG }, { "pagestotal", KSTAT_DATA_ULONG }, + { "low_mem_scan", KSTAT_DATA_ULONG }, + { "n_throttle", KSTAT_DATA_ULONG }, }; static int header_kstat_update(kstat_t *, int); @@ -912,6 +916,8 @@ system_pages_kstat_update(kstat_t *ksp, int rw) system_pages_kstat.pageslocked.value.ul = (ulong_t)(availrmem_initial - availrmem); system_pages_kstat.pagestotal.value.ul = (ulong_t)total_pages; + system_pages_kstat.lowmemscan.value.ul = (ulong_t)low_mem_scan; + system_pages_kstat.nthrottle.value.ul = (ulong_t)n_throttle; /* * pp_kernel represents total pages used by the kernel since the * startup. This formula takes into account the boottime kernel diff --git a/usr/src/uts/common/os/mem_config.c b/usr/src/uts/common/os/mem_config.c index 4c4e78578b..9687f743a0 100644 --- a/usr/src/uts/common/os/mem_config.c +++ b/usr/src/uts/common/os/mem_config.c @@ -21,6 +21,7 @@ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2017 Joyent, Inc. */ #include @@ -1638,7 +1639,7 @@ delthr_get_freemem(struct mem_handle *mhp) * Put pressure on pageout. */ page_needfree(free_get); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(delthr); mutex_enter(&mhp->mh_mutex); (void) cv_reltimedwait(&mhp->mh_cv, &mhp->mh_mutex, diff --git a/usr/src/uts/common/os/vm_pageout.c b/usr/src/uts/common/os/vm_pageout.c index 7e71616217..9a3342181e 100644 --- a/usr/src/uts/common/os/vm_pageout.c +++ b/usr/src/uts/common/os/vm_pageout.c @@ -245,6 +245,9 @@ pgcnt_t deficit; pgcnt_t nscan; pgcnt_t desscan; +/* kstats */ +uint64_t low_mem_scan; + /* The maximum supported number of page_scanner() threads */ #define MAX_PSCAN_THREADS 16 @@ -286,12 +289,6 @@ static bool reset_hands[MAX_PSCAN_THREADS]; */ #define SCHEDPAGING_HZ 4 -#define WAKE_PAGEOUT_SCANNER(tag) \ - do { \ - DTRACE_PROBE(schedpage__wake__ ## tag); \ - cv_broadcast(&proc_pageout->p_cv); \ - } while (0) - /* * despagescanners: * The desired number of page scanner threads. For testing purposes, this @@ -915,6 +912,7 @@ schedpaging(void *arg) /* * We need more memory. */ + low_mem_scan++; WAKE_PAGEOUT_SCANNER(lowmem); } else { /* diff --git a/usr/src/uts/common/sys/vm.h b/usr/src/uts/common/sys/vm.h index 14b5754b28..2aadfcb14a 100644 --- a/usr/src/uts/common/sys/vm.h +++ b/usr/src/uts/common/sys/vm.h @@ -57,6 +57,12 @@ int queue_io_request(struct vnode *, u_offset_t); extern kmutex_t memavail_lock; extern kcondvar_t memavail_cv; +#define WAKE_PAGEOUT_SCANNER(tag) \ + do { \ + DTRACE_PROBE(schedpage__wake__ ## tag); \ + cv_broadcast(&proc_pageout->p_cv); \ + } while (0) + #endif /* defined(_KERNEL) */ #ifdef __cplusplus diff --git a/usr/src/uts/common/sys/vmsystm.h b/usr/src/uts/common/sys/vmsystm.h index e8e30b7608..bc7c289d07 100644 --- a/usr/src/uts/common/sys/vmsystm.h +++ b/usr/src/uts/common/sys/vmsystm.h @@ -58,6 +58,8 @@ extern pgcnt_t desscan; /* desired pages scanned per second */ extern pgcnt_t slowscan; extern pgcnt_t fastscan; extern pgcnt_t pushes; /* number of pages pushed to swap device */ +extern uint64_t low_mem_scan; /* num times page scan due to low memory */ +extern volatile uint64_t n_throttle; /* num times page create throttled */ /* writable copies of tunables */ extern pgcnt_t maxpgio; /* max paging i/o per sec before start swaps */ diff --git a/usr/src/uts/common/vm/vm_page.c b/usr/src/uts/common/vm/vm_page.c index 134b3bcb33..4e52919a7c 100644 --- a/usr/src/uts/common/vm/vm_page.c +++ b/usr/src/uts/common/vm/vm_page.c @@ -84,6 +84,7 @@ static pgcnt_t max_page_get; /* max page_get request size in pages */ pgcnt_t total_pages = 0; /* total number of pages (used by /proc) */ +volatile uint64_t n_throttle = 0; /* * freemem_lock protects all freemem variables: @@ -1477,6 +1478,8 @@ page_create_throttle(pgcnt_t npages, int flags) uint_t i; pgcnt_t tf; /* effective value of throttlefree */ + atomic_inc_64(&n_throttle); + /* * Normal priority allocations. */ @@ -1509,7 +1512,7 @@ page_create_throttle(pgcnt_t npages, int flags) tf = throttlefree - ((flags & PG_PUSHPAGE) ? pageout_reserve : 0); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(page__create__throttle); for (;;) { fm = 0; @@ -1596,7 +1599,7 @@ checkagain: } ASSERT(proc_pageout != NULL); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(page__create__wait); TRACE_2(TR_FAC_VM, TR_PAGE_CREATE_SLEEP_START, "page_create_sleep_start: freemem %ld needfree %ld", @@ -2243,7 +2246,7 @@ page_create_va_large(vnode_t *vp, u_offset_t off, size_t bytes, uint_t flags, if (nscan < desscan && freemem < minfree) { TRACE_1(TR_FAC_VM, TR_PAGEOUT_CV_SIGNAL, "pageout_cv_signal:freemem %ld", freemem); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(va__large); } pp = rootpp; @@ -2372,7 +2375,7 @@ page_create_va(vnode_t *vp, u_offset_t off, size_t bytes, uint_t flags, if (nscan < desscan && freemem < minfree) { TRACE_1(TR_FAC_VM, TR_PAGEOUT_CV_SIGNAL, "pageout_cv_signal:freemem %ld", freemem); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(va); } /* diff --git a/usr/src/uts/i86pc/vm/vm_machdep.c b/usr/src/uts/i86pc/vm/vm_machdep.c index 225628b1c8..5d8f86ffb5 100644 --- a/usr/src/uts/i86pc/vm/vm_machdep.c +++ b/usr/src/uts/i86pc/vm/vm_machdep.c @@ -3546,7 +3546,7 @@ page_create_io( if (nscan < desscan && freemem < minfree) { TRACE_1(TR_FAC_VM, TR_PAGEOUT_CV_SIGNAL, "pageout_cv_signal:freemem %ld", freemem); - cv_signal(&proc_pageout->p_cv); + WAKE_PAGEOUT_SCANNER(page__create__io); } if (flags & PG_PHYSCONTIG) { -- 2.11.4.GIT