Author: alc
Date: Mon Aug  2 21:33:36 2010
New Revision: 210782
URL: http://svn.freebsd.org/changeset/base/210782

Log:
  Update the "desiredvnodes" calculation.  In particular, make the part of
  the calculation that is based on the kernel's heap size more conservative.
  Hopefully, this will eliminate the need for MAXVNODES_MAX, but for the
  time being set MAXVNODES_MAX to a large value.
  
  Reviewed by:  jhb@
  MFC after:    6 weeks

Modified:
  head/sys/kern/vfs_subr.c

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c    Mon Aug  2 19:56:07 2010        (r210781)
+++ head/sys/kern/vfs_subr.c    Mon Aug  2 21:33:36 2010        (r210782)
@@ -282,23 +282,34 @@ SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhe
 
 /*
  * Initialize the vnode management data structures.
+ *
+ * Reevaluate the following cap on the number of vnodes after the physical
+ * memory size exceeds 512GB.  In the limit, as the physical memory size
+ * grows, the ratio of physical pages to vnodes approaches sixteen to one.
  */
 #ifndef        MAXVNODES_MAX
-#define        MAXVNODES_MAX   100000
+#define        MAXVNODES_MAX   (512 * (1024 * 1024 * 1024 / PAGE_SIZE / 16))
 #endif
 static void
 vntblinit(void *dummy __unused)
 {
+       int physvnodes, virtvnodes;
 
        /*
-        * Desiredvnodes is a function of the physical memory size and
-        * the kernel's heap size.  Specifically, desiredvnodes scales
-        * in proportion to the physical memory size until two fifths
-        * of the kernel's heap size is consumed by vnodes and vm
-        * objects.
-        */
-       desiredvnodes = min(maxproc + cnt.v_page_count / 4, 2 * vm_kmem_size /
-           (5 * (sizeof(struct vm_object) + sizeof(struct vnode))));
+        * Desiredvnodes is a function of the physical memory size and the
+        * kernel's heap size.  Generally speaking, it scales with the
+        * physical memory size.  The ratio of desiredvnodes to physical pages
+        * is one to four until desiredvnodes exceeds 98,304.  Thereafter, the
+        * marginal ratio of desiredvnodes to physical pages is one to
+        * sixteen.  However, desiredvnodes is limited by the kernel's heap
+        * size.  The memory required by desiredvnodes vnodes and vm objects
+        * may not exceed one seventh of the kernel's heap size.
+        */
+       physvnodes = maxproc + cnt.v_page_count / 16 + 3 * min(98304 * 4,
+           cnt.v_page_count) / 16;
+       virtvnodes = vm_kmem_size / (7 * (sizeof(struct vm_object) +
+           sizeof(struct vnode)));
+       desiredvnodes = min(physvnodes, virtvnodes);
        if (desiredvnodes > MAXVNODES_MAX) {
                if (bootverbose)
                        printf("Reducing kern.maxvnodes %d -> %d\n",
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to