RPI3 swap experiments ["was killed: out of swap space" with: "v_free_count: 5439, v_inactive_count: 1"]

Mark Millard marklmi at yahoo.com
Sun Aug 12 23:23:52 UTC 2018


On 2018-Aug-12, at 3:40 PM, bob prohaska <fbsd at www.zefox.net> wrote:

> On Sun, Aug 12, 2018 at 10:32:48AM -0700, John Kennedy wrote:
>> . . .
> Setting vm.pageout_oom_seq to 120 made a decisive improvement, almost allowing
> buildworld to finish. By the time I tried CAM_IOSCHED_DYNAMIC buildworld was
> getting only about half as far, so it seems the patches were harmful to a degree.
> Changes were applied in the order 

You could experiment with figures bigger than 120 for
vm.pageout_oom_seq .

I'll note that the creation of this mechanism seems
to be shown for -r290920 at:

https://lists.freebsd.org/pipermail/svn-src-head/2015-November/078968.html

In part is says:

  . . . 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.

The code shows:

int vmd_oom_seq

and it looks like fairly large values would be
tolerated. You may be able to scale beyond
the problem showing up in your context.

> pageout 
> batchqueue
> slow_swap
> iosched

For my new Pine64+ 2GB experiments I've only applied
the Mark J. reporting patches, not the #define one.
Nor have I involved CAM_IOSCHED_DYNAMIC.

But with 2 GiBytes of RAM and the default 12 for
vm.pageout_oom_seq I got:

v_free_count: 7773, v_inactive_count: 1
Aug 12 09:30:13 pine64 kernel: pid 80573 (c++), uid 0, was killed: out of swap space

with no other reports from Mark Johnston's reporting
patches.

It appears that long I/O latencies as seen by the
subsystem are not necessary to ending up with OOM
kills, even if they can contribute when they occur.

(7773 * 4 KiBytes = 31,838,298 Bytes, by the way.)

> My RPI3 is now updating to 337688 with no patches/config changes. I'll start the
> sequence over and would be grateful if anybody could suggest a better sequence.



Side note: more text from -r290920 :

  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.

I've no clue if this ever progressed after -r290920 .

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-arm mailing list