Date: Wed, 19 Mar 2003 15:36:19 +0100 From: Phil Regnauld <regnauld@catpipe.net> To: Wes Peters <wes@softweyr.com> Cc: Juli Mallett <jmallett@FreeBSD.org>, Eivind Eklund <eivind@FreeBSD.org>, Mike Silbersack <silby@silby.com>, David Schultz <das@FreeBSD.org>, src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/vm vm_map.c vm_map.h vm_pageout.c Message-ID: <20030319143619.GA47243@catpipe.net> In-Reply-To: <200303171156.40901.wes@softweyr.com> References: <200303122313.h2CNDHMU046431@repoman.freebsd.org> <20030314012954.A42430@FreeBSD.org> <20030314101857.A98861@FreeBSD.org> <200303171156.40901.wes@softweyr.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Wes Peters (wes) writes:
>
> o Add a flag in the proc struct signalling 'don't kill me'. This flag
> is not inheritable. (I recycled the now-deprecated P_NOSWAP flag for
> this).
>
> o Hack squid and a few other essential and potentially large programs
> (such as bind) to set this flag.
>
> This change effectively stopped our system from committing suicide,
> encouraging it to kill off worker-slave processes that can be restarted
> when load reduces instead of killing the heart of the box. I can work
> up a patch if someone would like to see this on a recent system.
Funny you mention this approach -- I came up with a similar idea
back in November. This is how I formulated it back then:
... Problem with overcommit if that if a process eats ram like a pig, or
leaks, or runs away, it will still be the last process after that (the one
that makes the overflow) to touch a page after the resource hog that buys it.
And there goes X11.
Idea: a "contract" mechanism by which a process registers to the kernel and
says "ok, during my life, I will never go over X MB RAM (effective, not
overcommit)". Warning: this is not a malloc, just a hint.
- if the process respects its contract, stays below X (good memory
policy, reuses its pools to the max, etc...), then when both
VM and physical mem are exhausted, this process will not be lined
up against the wall
- if a process does not respect its quota, it loses its privileges,
and when/if memory runs out, it gets a last cigarette like the others
- if a process comes after the others, and asks for a "garantee" X
which is superior to whatever is left, then the demand is refused.
it's left up to the process to decide what to do
- if all reg'ed processes on the system have resspected their contract,
but there's no more memory anyway, then we have to shoot one --
probably the most recent contractor, or the one eating the least/most
mem (arbitrarily ?)
Applications that would benefit greatly: any large monolithic semi-critical
subsystem (Oracle, X11, ...)
Applications not needing it: any pre-forked base app (Apache et al.)
Cases to manage:
1) P asks 50 MB
uses 40.
VM usage increases. Finally there is only 5 MB left.
P touches 6 MB of pages, i.e. 1 MB too much
=> ?
2) what about forks and exec ?
fork: parent/child relationship, global quota: the parent must
plan usage in VM of all its children (Apache, Postfix, ...)
... or by process ?
exec: new processes not protected by contract unless explicitly told
to be. Global quota inherited, but not duplicated (same area/qty, minus
pages not released by old process).
useful for binaries for which we don't have sources: write a wrapper
for the binary, or use a login.conf demon class, contract for the mem
you need, exec the binary
Questions: has it already been done ?
would it be useful ?
Cheers,
Phil
--
_ _ |_ | regnauld@catpipe.net catpipe Systems ApS |
(_(_||_ | *BSD solutions, consulting, development |
| Tlf.: +45 7021 0050 http://www.catpipe.net/ |
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030319143619.GA47243>
