From owner-p4-projects@FreeBSD.ORG Tue Aug 1 08:23:16 2006 Return-Path: <owner-p4-projects@FreeBSD.ORG> X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D658216A4E0; Tue, 1 Aug 2006 08:23:15 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 80CF416A4DD for <perforce@FreeBSD.org>; Tue, 1 Aug 2006 08:23:15 +0000 (UTC) (envelope-from cdjones@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id DEAE943D5A for <perforce@FreeBSD.org>; Tue, 1 Aug 2006 08:23:14 +0000 (GMT) (envelope-from cdjones@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k718NEFd047331 for <perforce@FreeBSD.org>; Tue, 1 Aug 2006 08:23:14 GMT (envelope-from cdjones@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k718NEZg047328 for perforce@freebsd.org; Tue, 1 Aug 2006 08:23:14 GMT (envelope-from cdjones@FreeBSD.org) Date: Tue, 1 Aug 2006 08:23:14 GMT Message-Id: <200608010823.k718NEZg047328@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to cdjones@FreeBSD.org using -f From: Chris Jones <cdjones@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Cc: Subject: PERFORCE change 102900 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes <p4-projects.freebsd.org> List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>, <mailto:p4-projects-request@freebsd.org?subject=unsubscribe> List-Archive: <http://lists.freebsd.org/pipermail/p4-projects> List-Post: <mailto:p4-projects@freebsd.org> List-Help: <mailto:p4-projects-request@freebsd.org?subject=help> List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>, <mailto:p4-projects-request@freebsd.org?subject=subscribe> X-List-Received-Date: Tue, 01 Aug 2006 08:23:16 -0000 http://perforce.freebsd.org/chv.cgi?CH=102900 Change 102900 by cdjones@cdjones-impulse on 2006/08/01 08:22:36 Memory limitation now works. Implementation: a kernel thread (per jail) checks to see whether the jail's RSS exceeds the jail's memory limit. If so, the kernel thread tries to page out 5% of each jailed process until the RSS is no longer over the memory limit. This could probably use tuning / more intelligence. Patch to go on wiki & note to mailing list for beta testers coming later today. Next up, scheduling. Affected files ... .. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#18 edit Differences ... ==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#18 (text+ko) ==== @@ -128,13 +128,13 @@ struct proc *p; struct prison *pr; struct thread *td; - vm_pindex_t limit, size, usage; + long limit, cursize, newsize, usage; int breakout; pr = arg; printf("Starting jpager/%d with memory limit %ld bytes\n", - pr->pr_id, (long) prison_memory_limit(pr)); + pr->pr_id, (long) prison_memory_limit(pr)); for (;;) { if (pr->pr_pager_flags & J_PAGER_TD_DIE) @@ -144,8 +144,8 @@ * pushing back when we approach the limit, rather than * when we hit it. */ - limit = prison_memory_limit(pr); - usage = prison_memory(pr); + limit = (long) prison_memory_limit(pr); + usage = (long) prison_memory(pr); /* The logic from vm_daemon() really needs to go here. * Problem: we want to push things below their rlimits. @@ -153,13 +153,13 @@ * TODO: refactor vm_daemon to optionally act on specific jails? */ - printf("jthread/%d: memory %ld / %ld bytes\n", - pr->pr_id, (long) usage, (long) limit); + printf("jpager/%d: memory %ld / %ld bytes\n", + pr->pr_id, usage, limit); if ((usage - limit) > 0) { - printf("jthread/%d: overcommitted by %ld bytes (%d %%)\n", - pr->pr_id, (long) (usage - limit), - (int) (100 * (usage - limit) / limit)); + printf("jpager/%d: overcommitted by %ld bytes (%lf percent)\n", + pr->pr_id, usage - limit, + (double) 100 * ((double) (usage - limit) / (double) limit)); sx_slock(&allproc_lock); LIST_FOREACH(p, &allproc, p_list) { @@ -197,25 +197,28 @@ */ /* TODO: this arbitrarily reduces each process's space by - * one page (until it's completely swapped out) while + * 5% (until it's completely swapped out) while * we're under memory pressure. A better way would be * to either hit large processes first, or to hit the * least-active processes first, or go proportionally, - * .... + * or .... */ - size = vmspace_resident_count(p->p_vmspace) - 1; - if (size < 0) - size = 0; - printf("jpager_td: squeezing process %d to %ld\n", p->p_pid, (long) size); - vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map, (long) size); - - sx_sunlock(&allproc_lock); + newsize = cursize = (long) vmspace_resident_count(p->p_vmspace); + newsize -= newsize / 20; + if (cursize < 0) + newsize = 0; + PROC_UNLOCK(p); + printf("jpager/%d: squeezing process %d from %ld to %ld\n", + pr->pr_id, p->p_pid, cursize, newsize); + vm_pageout_map_deactivate_pages(&p->p_vmspace->vm_map, newsize); } /* end LIST_FOREACH procs */ + sx_sunlock(&allproc_lock); } /* TODO --- make interval into a sysctl. */ + /* 6 seconds because VM recomputes totals every 5. */ printf("jpager_td sleeping\n"); - tsleep(pr, 0, "-", 3 * hz); + tsleep(pr, 0, "-", 6 * hz); } printf("Exiting jpager_td\n");