You were redirected here from mtund.

There are at least two hysteresis-like cycles in the VM code.

One regulates when the page daemon performs paging out.

The other regulates when page allocation succeeds.

Important levels of available pages (v_free_count + v_cache_count), from higher to lower.

Prior to http://svnweb.freebsd.org/changeset/base/254304:

Threshold Sample values from untuned amd64 system with 8GB RAM Description and useful information Page daemon active Normal requests are satisfied Normal waiters waken up
v_cache_min + v_free_target 104572 = 52286 + 52286 a level that a page scan pass tries to reach; at this level and above vm_paging_target() == 0, below it is 1. X X
v_cache_min + v_free_reserved 54904 = 52286 + 2618 a level below which vm_page_alloc() still succeeds for all request classes, but sets vm_pages_needed flag and triggers a page scan; vm_paging_needed() == 1 below this level. X X X
v_free_min 12417 at this level threads waiting for pages in VM_WAIT are waken up after page shortage (and vm_pages_needed flag is reset) in vm_page_free_wakeup(); vm_page_count_min() == 1 below this level. vm_page_free_wakeup() is called by vm_page_free_toq() and vm_page_cache(), that is, upon increasing available pages count. X X X
v_free_severe 7517 below this level some users of vm_page_alloc() decide to not call it and instead voluntary wait until more pages are available. Important cases of this check are: vm_fault() and vm_forkproc(). vm_page_count_severe() == 1 below this level. X X
v_free_reserved 2618 at this level vm_page_alloc() would return NULL for normal requests; threads needing (M_WAITOK) memory would call VM_WAIT before retrying. X
v_pageout_free_min 34 if the page daemon thread runs into a page shortage and ends up in VM_WAIT, then it would be waken up when this threshold is exceeded X
v_interrupt_free_min 2 at this level vm_page_alloc() would fail even for VM_ALLOC_SYSTEM requests, only VM_ALLOC_INTERRUPT requests can succeed X
zero 0 with zero available pages vm_page_alloc() would fail for all requests, all memory is exhausted X

After http://svnweb.freebsd.org/changeset/base/254304:

Threshold Sample values from untuned amd64 system with 8GB RAM Description and useful information Page daemon active Normal requests are satisfied Normal waiters waken up
v_free_target 40536 a level that a page scan pass tries to reach; at this level and above vm_paging_target() == 0, below it is 1. X X
vm_pageout_wakeup_thresh 13233 a level below which vm_page_alloc() still succeeds for all request classes, but sets vm_pages_needed flag and triggers a page scan; vm_paging_needed() == 1 below this level. X X X
v_free_min 12417 at this level threads waiting for pages in VM_WAIT are waken up after page shortage (and vm_pages_needed flag is reset) in vm_page_free_wakeup(); vm_page_count_min() == 1 below this level. vm_page_free_wakeup() is called by vm_page_free_toq() and vm_page_cache(), that is, upon increasing available pages count. X X X
v_free_severe 7517 below this level some users of vm_page_alloc() decide to not call it and instead voluntary wait until more pages are available. Important cases of this check are: vm_fault() and vm_forkproc(). vm_page_count_severe() == 1 below this level. X X
v_free_reserved 2618 at this level vm_page_alloc() would return NULL for normal requests; threads needing (M_WAITOK) memory would call VM_WAIT before retrying. X
v_pageout_free_min 34 if the page daemon thread runs into a page shortage and ends up in VM_WAIT, then it would be waken up when this threshold is exceeded X
v_interrupt_free_min 2 at this level vm_page_alloc() would fail even for VM_ALLOC_SYSTEM requests, only VM_ALLOC_INTERRUPT requests can succeed X
zero 0 with zero available pages vm_page_alloc() would fail for all requests, all memory is exhausted X
  • andriygapon/avgpageoutalgorithm.txt
  • Last modified: 2026/10/12 10:55
  • (external edit)