Date: Fri, 19 Feb 1999 09:20:27 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: Bruce Evans <bde@zeta.org.au> Cc: current@FreeBSD.ORG, semen@iclub.nsu.ru Subject: Re: swaper(?) bug (or feature) ? Message-ID: <199902191720.JAA38001@apollo.backplane.com> References: <199902191356.AAA31790@godzilla.zeta.org.au>
next in thread | previous in thread | raw e-mail | index | archive | help
Ach. I'll fix this up.
-Matt
:
:>running 4.0-current from late january i've got folloing:
:>top tells:
:>
:>...
:>Mem: 11M Active, 952K Inact, 5712K Wired, 640K Cache, 3348K Buf, 11M Free
:>Swap: 106M Total, 106M Used, 232K Free, 99% Inuse
:>...
:>
:>regardless 11M Free, almost all programs fail:
:>
:># cat
:>cat: Cannot allocate memory
:
:This bug is more obvious when there is no swap. I use the following
:quick fix for part of it:
:
:---
:diff -c2 vm_unix.c~ vm_unix.c
:*** vm_unix.c~ Fri Feb 12 19:56:24 1999
:--- vm_unix.c Fri Feb 12 19:56:27 1999
:***************
:*** 94,100 ****
: if (new > old) {
: vm_size_t diff;
:! if (swap_pager_full) {
:! return (ENOMEM);
:! }
: diff = new - old;
: rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE,
:--- 94,98 ----
: if (new > old) {
: vm_size_t diff;
:!
: diff = new - old;
: rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE,
:---
:
:The orginal of the above code (in obreak()) is rather silly. It gives up
:very easily, although the swapper may be in the process of freeing some
:memory and all (?) other parts of the system just wait for memory to
:become free.
:
:The behaviour is silliest when there is no swap. Then swap_pager_full
:is never cleared, because the high watermark for free swap is > 0 which
:can never be exceeded when there is no swap.
:
:Things apparently worked better in 3.0 because the code corresponding to
:the following in swap_pager.c didn't spew messages or set swap_pager_full,
:at least in the no-swap-at-all case:
:
:! if ((blk = blist_alloc(swapblist, npages)) == SWAPBLK_NONE) {
:! if (swap_pager_full != 2) {
:! printf("swap_pager_getswapspace: failed\n");
:! swap_pager_full = 2;
:! }
:! } else {
:! vm_swap_size -= npages;
:! swp_sizecheck();
:! }
:
:Normally, when there is no free swap, free memory is found somewhere
:else on return from the above code, and obreak() has no problems using
:that memory if it tries.
:
:>luck is that kill works :-) after i kill the process eating all swap
:>space all went OK.
:
:The swap watermarks are apparently breaking the automatic killing of
:the biggest process. They are supposed to be just to control the spew
:from the above printf, but since swap_pager_full is used in obreak()
:and for killing the biggest process, setting it to control the spew
:has bad side effects.
:
:Bruce
:
:
:To Unsubscribe: send mail to majordomo@FreeBSD.org
:with "unsubscribe freebsd-current" in the body of the message
:
Matthew Dillon
<dillon@backplane.com>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902191720.JAA38001>
