Some VM subsystem important knobs
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 |
|
|