summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2010-08-02 21:33:36 +0000
committeralc <alc@FreeBSD.org>2010-08-02 21:33:36 +0000
commit329f9f043551c019dc1b38d678b2b49c227ebee8 (patch)
tree6cf70dd9425bf68667143bd1d7e014a18e1fe26c
parent936982be27175a0e0a9c3143403f58284dc59b88 (diff)
downloadFreeBSD-src-329f9f043551c019dc1b38d678b2b49c227ebee8.zip
FreeBSD-src-329f9f043551c019dc1b38d678b2b49c227ebee8.tar.gz
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
-rw-r--r--sys/kern/vfs_subr.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index f957525..d3123a9 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -282,23 +282,34 @@ SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhere, CTLFLAG_RW,
/*
* 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 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.
*/
- desiredvnodes = min(maxproc + cnt.v_page_count / 4, 2 * vm_kmem_size /
- (5 * (sizeof(struct vm_object) + sizeof(struct vnode))));
+ 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",
OpenPOWER on IntegriCloud