svn commit: r242783 - in user/alfred/9-alfred/sys: i386/include kern

Alfred Perlstein alfred at FreeBSD.org
Thu Nov 8 20:15:13 UTC 2012


Author: alfred
Date: Thu Nov  8 20:15:12 2012
New Revision: 242783
URL: http://svnweb.freebsd.org/changeset/base/242783

Log:
  Divorce autotune nmbclusters from maxusers.
  Provide arch specific override maximum.
  
  Suggested by: peter

Modified:
  user/alfred/9-alfred/sys/i386/include/vmparam.h
  user/alfred/9-alfred/sys/kern/kern_mbuf.c

Modified: user/alfred/9-alfred/sys/i386/include/vmparam.h
==============================================================================
--- user/alfred/9-alfred/sys/i386/include/vmparam.h	Thu Nov  8 18:11:31 2012	(r242782)
+++ user/alfred/9-alfred/sys/i386/include/vmparam.h	Thu Nov  8 20:15:12 2012	(r242783)
@@ -202,4 +202,9 @@
 
 #define	ZERO_REGION_SIZE	(64 * 1024)	/* 64KB */
 
+#ifndef MAX_AUTOTUNE_NMBCLUSTERS
+/* old maxusers max value. */
+#define MAX_AUTOTUNE_NMBCLUSTERS (1024 + 384 * 64)
+#endif
+
 #endif /* _MACHINE_VMPARAM_H_ */

Modified: user/alfred/9-alfred/sys/kern/kern_mbuf.c
==============================================================================
--- user/alfred/9-alfred/sys/kern/kern_mbuf.c	Thu Nov  8 18:11:31 2012	(r242782)
+++ user/alfred/9-alfred/sys/kern/kern_mbuf.c	Thu Nov  8 20:15:12 2012	(r242783)
@@ -102,6 +102,30 @@ int nmbjumbo9;			/* limits number of 9k 
 int nmbjumbo16;			/* limits number of 16k jumbo clusters */
 struct mbstat mbstat;
 
+static int 
+nmbclusters_from_physpages(void)
+{
+	long factor;
+	long rv;
+    
+	factor = physmem / (2 * 1024 * 1024 / PAGE_SIZE);
+	if (factor < 32)
+		factor = 32;
+	/* after 384, switch scale to 1/4 */
+	if (factor > 384)
+		factor = 384 + (factor - 384) / 4;
+	rv = 1024 + factor * 64;
+	/*
+	 * allow a platform specific override to prevent exhausting
+	 * kernel memory on large memory + small address space machines.
+	 */
+#ifdef MAX_AUTOTUNE_NMBCLUSTERS
+	if (rv > MAX_AUTOTUNE_NMBCLUSTERS)
+		rv = MAX_AUTOTUNE_NMBCLUSTERS
+#endif
+	return (rv);
+}
+
 /*
  * tunable_mbinit() has to be run before init_maxsockets() thus
  * the SYSINIT order below is SI_ORDER_MIDDLE while init_maxsockets()
@@ -114,7 +138,7 @@ tunable_mbinit(void *dummy)
 	/* This has to be done before VM init. */
 	TUNABLE_INT_FETCH("kern.ipc.nmbclusters", &nmbclusters);
 	if (nmbclusters == 0)
-		nmbclusters = 1024 + maxusers * 64;
+		nmbclusters = nmbclusters_from_physpages();
 
 	TUNABLE_INT_FETCH("kern.ipc.nmbjumbop", &nmbjumbop);
 	if (nmbjumbop == 0)


More information about the svn-src-user mailing list