freebsd-nq/sys/vm
Konstantin Belousov 76386c7ecd Rework the test which raises OOM condition. Right now, the code
checks for the swap space consumption plus checks that the amount of
the free pages exceeds some limit, in case pagedeamon did not coped
with the page shortage in one of the late passes.  This is wrong
because it does not account for the presence of the reclamaible pages
in the queues which are not selectable for reclaim immediately.  E.g.,
on the swap-less systems, large active queue easily triggered OOM.

Instead, only raise OOM when pagedaemon is unable to produce a free
page in several back-to-back passes.  Track the failed passes per
pagedaemon thread.

The number of passes to trigger OOM was selected empirically and
tested both on small (32M-64M i386 VM) and large (32G amd64)
configurations.  If the specifics of the load require tuning, sysctl
vm.pageout_oom_seq sets the number of back-to-back passes which must
fail before OOM is raised.  Each pass takes 1/2 of seconds.  Less the
value, more sensible the pagedaemon is to the page shortage.

In future, some heuristic to calculate the value of the tunable might
be designed based on the system configuration and load.  But before it
can be done, the i/o system must be fixed to reliably time-out
pagedaemon writes, even if waiting for the memory to proceed.  Then,
code can account for the in-flight page-outs and postpone OOM until
all of them finished, which should reduce the need in tuning.  Right
now, ignoring the in-flight writes and the counter allows to break
deadlocks due to write path doing sleepable memory allocations.

Reported by:	Dmitry Sivachenko, bde, many others
Tested by:	pho, bde, tuexen (arm)
Reviewed by:	alc
Discussed with:	bde, imp
Sponsored by:	The FreeBSD Foundation
MFC after:	3 weeks
2015-11-16 06:26:26 +00:00
..
_vm_radix.h
default_pager.c Place VM objects on the object list when created and never remove them. 2015-05-08 19:43:37 +00:00
device_pager.c Place VM objects on the object list when created and never remove them. 2015-05-08 19:43:37 +00:00
memguard.c Add comments about CTLFLAG_RDTUN vs. TUNABLE_INT_FETCH. 2015-03-26 05:20:18 +00:00
memguard.h
phys_pager.c Place VM objects on the object list when created and never remove them. 2015-05-08 19:43:37 +00:00
pmap.h Properly sort the function declarations added in r286296 2015-08-05 10:48:32 +00:00
redzone.c Pull in r267961 and r267973 again. Fix for issues reported will follow. 2014-06-28 03:56:17 +00:00
redzone.h
sg_pager.c Place VM objects on the object list when created and never remove them. 2015-05-08 19:43:37 +00:00
swap_pager.c Mark swap_pager_putpages static at its definition. It was already 2015-10-05 21:29:17 +00:00
swap_pager.h
uma_core.c Exploit r288122 to address a cosmetic issue. Since the pages allocated 2015-09-26 17:45:10 +00:00
uma_dbg.c If INVARIANTS is specified, add ctor/dtor to junk memory if they are 2015-06-25 20:44:46 +00:00
uma_dbg.h
uma_int.h Revert r281451. It causes a panic/hang early in boot for a number of 2015-04-24 17:03:53 +00:00
uma.h The vmem callback to reclaim kmem arena address space on low or 2015-05-09 20:08:36 +00:00
vm_domain.c Add an initial NUMA affinity/policy configuration for threads and processes. 2015-07-11 15:21:37 +00:00
vm_domain.h Add an initial NUMA affinity/policy configuration for threads and processes. 2015-07-11 15:21:37 +00:00
vm_extern.h Add a new file operations hook for mmap operations. File type-specific 2015-06-04 19:41:15 +00:00
vm_fault.c Refinements to r281079's sequential access optimization: Prefetched pages, 2015-08-03 20:30:27 +00:00
vm_glue.c Exploit r288122 to avoid pointlessly enqueueing a page that is about to be 2015-10-09 03:38:58 +00:00
vm_init.c Parallelize the buffer cache and rewrite getnewbuf(). This results in a 2015-10-14 02:10:07 +00:00
vm_kern.c Export various helper variables describing the layout and size of 2015-11-12 22:00:59 +00:00
vm_kern.h
vm_map.c Remove a check which caused spurious SIGSEGV on usermode access to the 2015-09-09 06:19:33 +00:00
vm_map.h Do not pretend that vm_fault(9) supports unwiring the address. Rename 2015-07-30 18:28:34 +00:00
vm_meter.c Remove the v_cache_min and v_cache_max sysctls. They are unused and have 2015-09-11 03:00:20 +00:00
vm_mmap.c Add a local variable initialization needed in the OBJT_DEFAULT case. 2015-07-05 22:26:19 +00:00
vm_object.c As a step towards the elimination of PG_CACHED pages, rework the handling 2015-09-30 23:06:29 +00:00
vm_object.h As a step towards the elimination of PG_CACHED pages, rework the handling 2015-09-30 23:06:29 +00:00
vm_page.c Ensure that deactivated pages that are not expected to be reused are 2015-11-08 01:36:18 +00:00
vm_page.h Rework the test which raises OOM condition. Right now, the code 2015-11-16 06:26:26 +00:00
vm_pageout.c Rework the test which raises OOM condition. Right now, the code 2015-11-16 06:26:26 +00:00
vm_pageout.h Reduce the scope of a variable to the only file where it is used. 2015-10-03 19:27:52 +00:00
vm_pager.c - Make 'struct buf *buf' private to vfs_bio.c. Having a global variable 2015-07-29 02:26:57 +00:00
vm_pager.h o Un-inline vm_pager_get_pages(), vm_pager_get_pages_async(). 2015-06-17 22:44:27 +00:00
vm_param.h Remove the v_cache_min and v_cache_max sysctls. They are unused and have 2015-09-11 03:00:20 +00:00
vm_phys.c Add an initial NUMA affinity/policy configuration for threads and processes. 2015-07-11 15:21:37 +00:00
vm_phys.h Add an initial NUMA affinity/policy configuration for threads and processes. 2015-07-11 15:21:37 +00:00
vm_radix.c Pull in r267961 and r267973 again. Fix for issues reported will follow. 2014-06-28 03:56:17 +00:00
vm_radix.h Eliminate a redundant parameter to vm_radix_replace(). 2013-12-08 20:07:02 +00:00
vm_reserv.c Introduce a sysctl for reporting the number of fully populated reservations. 2015-08-06 21:27:50 +00:00
vm_reserv.h
vm_unix.c Implement lockless resource limits. 2015-06-10 10:48:12 +00:00
vm_zeroidle.c Pull in r267961 and r267973 again. Fix for issues reported will follow. 2014-06-28 03:56:17 +00:00
vm.h
vnode_pager.c Reduce the amount of calls to VOP_BMAP() made from the local vnode 2015-10-24 21:59:22 +00:00
vnode_pager.h Merge from projects/sendfile: 2014-11-23 12:01:52 +00:00