Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Aug 1996 20:42:47 +0200
From:      Poul-Henning Kamp <phk@critter.tfs.com>
Cc:        Terry Lambert <terry@lambert.org>, stesin@gu.kiev.ua, angio@aros.net, squid-users@nlanr.net, current@FreeBSD.org
Subject:   Re: FreeBSD malloc.c, -lmalloc, and squid. 
Message-ID:  <6172.841171367@critter.tfs.com>
In-Reply-To: Your message of "Tue, 27 Aug 1996 20:02:57 %2B0200." <1056.841168977@critter.tfs.com> 

next in thread | previous in thread | raw e-mail | index | archive | help

Here, try these changes, and see if it makes a difference when
you set 'H' or one or more '<' or '>' in the options.

You can do it system wide:
	ln -s 'H<<' /etc/default/malloc
or per process:
	setenv MALLOC_OPTIONS 'H<<'

Feedback most welcome!

Poul-Henning

Index: malloc.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/stdlib/malloc.3,v
retrieving revision 1.5
diff -u -r1.5 malloc.3
--- malloc.3	1996/02/11 22:34:02	1.5
+++ malloc.3	1996/08/27 18:37:24
@@ -34,10 +34,11 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     @(#)malloc.3	8.1 (Berkeley) 6/4/93
+.\"     $Id$
 .\"
-.Dd June 4, 1993
+.Dd August 27, 1996
 .Dt MALLOC 3
-.Os BSD 4
+.Os FreeBSD 2
 .Sh NAME
 .Nm malloc ,
 .Nd general memory allocation function
@@ -112,9 +113,11 @@
 .Pp
 
 .Sh ENVIRONMENT
-This malloc will check the environment for a variable called
-.Em MALLOC_OPTIONS
-and scan it for flags.
+Malloc will first look for a symbolic link called
+.Pa /etc/default/malloc
+and next check the environment for a variable called
+.Ev MALLOC_OPTIONS
+and scan them for flags in that order.
 Flags are single letters, uppercase means on, lowercase means off.
 .Bl -tag -width indent
 .It A
@@ -130,6 +133,10 @@
 ``junk'' fill some junk into the area allocated.
 Currently junk is bytes of 0xd0, this is pronounced ``Duh'' :-)
 
+.It H
+``hint'' pass a hint to the kernel about pages we don't use.  If the
+machine is paging a lot this may help a bit.
+
 .It R
 ``realloc'' always reallocate when
 .Fn realloc
@@ -140,11 +147,22 @@
 ``zero'' fill some junk into the area allocated (see ``J''),
 except for the exact length the user asked for, which is zeroed.
 
+.It <
+``Half the cache size'' Reduce the size of the cache by a factor of two.
+
+.It >
+``Double the cache size'' Double the size of the cache by a factor of two.
 .El
 .Pp
+So to set a systemwide reduction of cache size and coredumps on problems
+one would:
+.Li ln -s 'A<' /etc/default/malloc
+.Pp
 The ``J'' and ``Z'' is mostly for testing and debugging,
 if a program changes behavior if either of these options are used,
 it is buggy.
+.Pp
+The default cache size is 32 pages.
 .Sh RETURN VALUES
 The
 .Fn malloc
@@ -166,6 +184,7 @@
 .Xr calloc 3 ,
 .Xr getpagesize 3 ,
 .Xr memory 3
+.Pa /usr/share/doc/papers/malloc.ascii.gz
 .Sh STANDARDS
 The
 .Fn malloc
Index: malloc.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/stdlib/malloc.c,v
retrieving revision 1.11
diff -u -r1.11 malloc.c
--- malloc.c	1996/07/03 05:03:07	1.11
+++ malloc.c	1996/08/27 18:25:10
@@ -188,9 +188,7 @@
 /*
  * The minimum size (in bytes) of the free page cache.
  */
-#ifndef malloc_cache
-static	unsigned  malloc_cache;
-#endif /* malloc_cache */
+static	unsigned  malloc_cache = 32 << malloc_pageshift;
 
 /*
  * The offset from pagenumber to index into the page directory
@@ -241,6 +239,11 @@
 static int malloc_realloc;
 
 /*
+ * pass the kernel a hint on free pages ?
+ */
+static int malloc_hint;
+
+/*
  * zero fill ?
  */
 static int malloc_zero;
@@ -496,30 +499,46 @@
 static void
 malloc_init ()
 {
-    char *p;
+    char *p, b[64];
+    int i,j;
 
 #ifdef EXTRA_SANITY
     malloc_junk = 1;
 #endif /* EXTRA_SANITY */
 
-    for (p=getenv("MALLOC_OPTIONS"); p && *p; p++) {
-	switch (*p) {
-	    case 'a': malloc_abort   = 0; break;
-	    case 'A': malloc_abort   = 1; break;
+    for (i = 0; i < 2; i++) {
+	if (i == 0) {
+	    j = readlink("/etc/default/malloc", b, sizeof b - 1);
+	    if (j <= 0)
+		continue;
+	    b[j] = '\0';
+	    p = b;
+	} else if (i == 1) {
+	    p = getenv("MALLOC_OPTIONS");
+	}
+	for (; p && *p; p++) {
+	    switch (*p) {
+		case '>': malloc_cache   <<= 1; break;
+		case '<': malloc_cache   >>= 1; break;
+		case 'a': malloc_abort   = 0; break;
+		case 'A': malloc_abort   = 1; break;
 #ifdef MALLOC_STATS
-	    case 'd': malloc_stats   = 0; break;
-	    case 'D': malloc_stats   = 1; break;
+		case 'd': malloc_stats   = 0; break;
+		case 'D': malloc_stats   = 1; break;
 #endif /* MALLOC_STATS */
-	    case 'r': malloc_realloc = 0; break;
-	    case 'R': malloc_realloc = 1; break;
-	    case 'j': malloc_junk    = 0; break;
-	    case 'J': malloc_junk    = 1; break;
-	    case 'z': malloc_zero    = 0; break;
-	    case 'Z': malloc_zero    = 1; break;
-	    default:
-		wrtwarning("(Init): Unknown char in MALLOC_OPTIONS\n");
-		p = 0;
-		break;
+		case 'h': malloc_hint    = 0; break;
+		case 'H': malloc_hint    = 1; break;
+		case 'r': malloc_realloc = 0; break;
+		case 'R': malloc_realloc = 1; break;
+		case 'j': malloc_junk    = 0; break;
+		case 'J': malloc_junk    = 1; break;
+		case 'z': malloc_zero    = 0; break;
+		case 'Z': malloc_zero    = 1; break;
+		default:
+		    wrtwarning("(Init): Unknown char in MALLOC_OPTIONS\n");
+		    p = 0;
+		    break;
+	    }
 	}
     }
 
@@ -553,10 +572,6 @@
     }
 #endif /* malloc_pageshift */
 
-#ifndef malloc_cache
-    malloc_cache = 100 << malloc_pageshift;
-#endif /* malloc_cache */
-
 #ifndef malloc_minsize
     {
     int i;
@@ -967,6 +982,9 @@
 	page_dir[index + i] = MALLOC_FREE;
 
     l = i << malloc_pageshift;
+
+    if (malloc_hint)
+	madvise(ptr, l, MADV_FREE);
 
     tail = ptr+l;
 
--
Poul-Henning Kamp           | phk@FreeBSD.ORG       FreeBSD Core-team.
http://www.freebsd.org/~phk | phk@login.dknet.dk    Private mailbox.
whois: [PHK]                | phk@ref.tfs.com       TRW Financial Systems, Inc.
Future will arrive by its own means, progress not so.



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