Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Oct 2006 11:20:05 +0100 (BST)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Scott Long <scottl@samsco.org>
Cc:        FreeBSD Stable <freebsd-stable@freebsd.org>, Andreas Sons <sons@zs64.net>, Stefan Bethke <stb@lassitu.de>
Subject:   Re: panic: kmem_map too small
Message-ID:  <20061026111723.K33725@fledge.watson.org>
In-Reply-To: <20061026091253.J69980@fledge.watson.org>
References:  <CD619308-6B7B-4B68-B011-CE979D67E0C1@lassitu.de> <20061025183308.L33725@fledge.watson.org> <838FCA83-20F8-4A09-A025-E69956032F86@lassitu.de> <45400286.9020402@samsco.org> <20061026091253.J69980@fledge.watson.org>

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

On Thu, 26 Oct 2006, Robert Watson wrote:

> On Wed, 25 Oct 2006, Scott Long wrote:
>
>> There are no obvious culprits from what you posted.  The kernel was only 
>> trying to allocate 60 bytes, and the 64-byte bucket didn't look to be 
>> overly used.  None of the other zones look terribly over-used either. The 
>> 'show malloc' command doesn't really give enough stats to be terribly 
>> useful, IMHO.
>
> What would you add to the output to make it more useful?  The main 
> difference between "show malloc" and "vmstat -m", other than any "use over 
> time" associated with multiple runs of vmstat -m, is the malloc size 
> bitmask.  This is relatively easily added to kern_malloc.c.
>
>> And neither of the commands can effectively track things like contig memory 
>> allocator.  Can you try the following two commands:
>
> Want to add "show contigmalloc"?
>
> I've found it significantly easier to debug memory leaks since adding these 
> DDB commands, but they are easily enhanced to carry more information than 
> they do now.

After a bit of looking at the output, etc, I agree with your conclusion that 
what's there now is lacking.  The attached patch, committed to -CURRENT but 
not yet to -STABLE, makes the "show malloc" DDB output a bit more like the 
"vmstat -m" output, in that it summarizes the allocation counts and adds the 
memory use information.  Sample output:

db> show malloc
               Type        InUse        MemUse     Requests
               GEOM          111           14K          529
            fw_xfer            0            0K            0
               $PIR            0            0K            0
        pfs_vncache            0            0K            0
          pfs_nodes           20            3K           20
           nexusdev            2            1K            2

This is much more useful for malloc types that see variable size allocation, 
rather than fixed-size allocation, and aligns better with what is offered by 
user space vmstat -m.  I still don't implement interpretting the size mask, as 
occurs in user space.

Robert N M Watson
Computer Laboratory
University of Cambridge

Index: kern_malloc.c
===================================================================
RCS file: /zoo/cvsup/FreeBSD-CVS/src/sys/kern/kern_malloc.c,v
retrieving revision 1.155
diff -u -r1.155 kern_malloc.c
--- kern_malloc.c	23 Jul 2006 19:55:41 -0000	1.155
+++ kern_malloc.c	26 Oct 2006 10:13:42 -0000
@@ -802,20 +802,26 @@
  	struct malloc_type_internal *mtip;
  	struct malloc_type *mtp;
  	u_int64_t allocs, frees;
+	u_int64_t alloced, freed;
  	int i;

-	db_printf("%18s %12s %12s %12s\n", "Type", "Allocs", "Frees",
-	    "Used");
+	db_printf("%18s %12s  %12s %12s\n", "Type", "InUse", "MemUse",
+	    "Requests");
  	for (mtp = kmemstatistics; mtp != NULL; mtp = mtp->ks_next) {
  		mtip = (struct malloc_type_internal *)mtp->ks_handle;
  		allocs = 0;
  		frees = 0;
+		alloced = 0;
+		freed = 0;
  		for (i = 0; i < MAXCPU; i++) {
  			allocs += mtip->mti_stats[i].mts_numallocs;
  			frees += mtip->mti_stats[i].mts_numfrees;
+			alloced += mtip->mti_stats[i].mts_memalloced;
+			freed += mtip->mti_stats[i].mts_memfreed;
  		}
-		db_printf("%18s %12ju %12ju %12ju\n", mtp->ks_shortdesc,
-		    allocs, frees, allocs - frees);
+		db_printf("%18s %12ju %12juK %12ju\n",
+		    mtp->ks_shortdesc, allocs - frees,
+		    (alloced - freed + 1023) / 1024, allocs);
  	}
  }
  #endif



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