Date: Fri, 04 Jan 2002 20:14:47 +0300 From: "Vladimir B.Grebenschikov" <vova@sw.ru> To: FreeBSD-gnats-submit@freebsd.org Subject: kern/33542: a few of swapping completly freeze system with large number of processes Message-ID: <E16MXvb-0001s1-00@vbook.express.ru>
next in thread | raw e-mail | index | archive | help
>Number: 33542 >Category: kern >Synopsis: a few of swapping completly freeze system with large number of processes >Confidential: no >Severity: critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Jan 04 09:20:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Vladimir B. Grebenschikov >Release: FreeBSD 4.4-RELEASE i386 >Organization: SWsoft >Environment: System: FreeBSD vbook.express.ru 4.4-RELEASE FreeBSD >Description: vmdaemon process (function vm_daemon() in kernel) runs through list of processes and looks at all nested memory objects. Kernel spends too long time ( 20-30 secs per cycle on system with 1000-2000 processes ) running through processes list in vm_daemon() (pageouting processes) and system seems to be completly freezed (only network interrupts is servering) when vm_daemon does not asleep. >How-To-Repeat: run large number of processes and reach end of real memory (until swapping begins) >Fix: This patch is far of ideal. But system responds on commands and seems workable while pageout with it. There are two sysctl variables to control pageout cycle: vm.pageout_run_ticks - how long vmdaemon runs at once (in ticks) vm.pageout_skip_ticks - how long vmdaemon sleeps before continue run through processes list (in ticks) but vmdaemon will be awaken if new wakeup() called. patch related to RELENG_4 --- sys/vm/vm_pageout.c.orig Wed Dec 26 04:28:12 2001 +++ sys/vm/vm_pageout.c Fri Jan 4 19:49:04 2002 @@ -143,6 +143,9 @@ static int defer_swap_pageouts=0; static int disable_swap_pageouts=0; +static int pageout_run_ticks=50; +static int pageout_skip_ticks=50; + #if defined(NO_SWAPPING) static int vm_swap_enabled=0; static int vm_swap_idle_enabled=0; @@ -191,6 +194,12 @@ SYSCTL_INT(_vm, OID_AUTO, pageout_lock_miss, CTLFLAG_RD, &pageout_lock_miss, 0, "vget() lock misses during pageout"); +SYSCTL_INT(_vm, OID_AUTO, pageout_run_ticks, + CTLFLAG_RW, &pageout_run_ticks, 0, "Pageout maximail run on single awake in ticks"); + +SYSCTL_INT(_vm, OID_AUTO, pageout_skip_ticks, + CTLFLAG_RW, &pageout_skip_ticks, 0, "Pageout skip ticks after single run"); + #define VM_PAGEOUT_PAGE_COUNT 16 int vm_pageout_page_count = VM_PAGEOUT_PAGE_COUNT; @@ -1433,10 +1442,13 @@ static void vm_daemon() { + static int pid = 0; struct proc *p; + int timo = 0; + int cycleticks; while (TRUE) { - tsleep(&vm_daemon_needed, PPAUSE, "psleep", 0); + tsleep(&vm_daemon_needed, PPAUSE, "psleep", timo); if (vm_pageout_req_swapout) { swapout_procs(vm_pageout_req_swapout); vm_pageout_req_swapout = 0; @@ -1446,7 +1458,28 @@ * process is swapped out -- deactivate pages */ - for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) { + cycleticks = ticks; + + if (pid == 0) + p = allproc.lh_first; + else { + p = pfind(pid); + if (p) { + p = p->p_list.le_next; + if (!p) p = allproc.lh_first; + } + } + + if (!p) + for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) { + if (p->p_pid < pid) + break; + } + + if (!p) + p = allproc.lh_first; + + for (; p != 0; p = p->p_list.le_next) { vm_pindex_t limit, size; /* @@ -1479,11 +1512,26 @@ limit = 0; /* XXX */ size = vmspace_resident_count(p->p_vmspace); + + if (ticks - cycleticks > pageout_run_ticks) + break; + if (limit >= 0 && size >= limit) { vm_pageout_map_deactivate_pages( &p->p_vmspace->vm_map, limit); } } + + if (vm_page_count_target()) { + pid = (p) ? p->p_pid : 0; + /* sleep a bit - to give system possibility to do somet + timo = pageout_skip_ticks; + } else { + pid = 0; + /* sleep until awake */ + timo = 0; + } + } } #endif >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E16MXvb-0001s1-00>