Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Aug 2006 08:23:14 GMT
From:      Chris Jones <cdjones@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 102900 for review
Message-ID:  <200608010823.k718NEZg047328@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608010823.k718NEZg047328>