Make malloc_stats_print() a public symbol, and make it repeatedly callable.

Incrementally merge tcache stats, so that malloc_stats_print() always reports
at least most events that have occurred thus far.
This commit is contained in:
Jason Evans 2010-01-03 12:10:42 -08:00
parent 9ad48230ed
commit 03c2237af3
5 changed files with 479 additions and 386 deletions

View File

@ -261,6 +261,7 @@ if test "x$JEMALLOC_PREFIX" != "x" ; then
AC_DEFINE_UNQUOTED([free], [${JEMALLOC_PREFIX}free]) AC_DEFINE_UNQUOTED([free], [${JEMALLOC_PREFIX}free])
AC_DEFINE_UNQUOTED([malloc_usable_size], [${JEMALLOC_PREFIX}malloc_usable_size]) AC_DEFINE_UNQUOTED([malloc_usable_size], [${JEMALLOC_PREFIX}malloc_usable_size])
AC_DEFINE_UNQUOTED([malloc_tcache_flush], [${JEMALLOC_PREFIX}malloc_tcache_flush]) AC_DEFINE_UNQUOTED([malloc_tcache_flush], [${JEMALLOC_PREFIX}malloc_tcache_flush])
AC_DEFINE_UNQUOTED([malloc_stats_print], [${JEMALLOC_PREFIX}malloc_stats_print])
AC_DEFINE_UNQUOTED([malloc_options], [${JEMALLOC_PREFIX}malloc_options]) AC_DEFINE_UNQUOTED([malloc_options], [${JEMALLOC_PREFIX}malloc_options])
AC_DEFINE_UNQUOTED([malloc_message], [${JEMALLOC_PREFIX}malloc_message]) AC_DEFINE_UNQUOTED([malloc_message], [${JEMALLOC_PREFIX}malloc_message])
fi fi

View File

@ -42,7 +42,8 @@
.Dt JEMALLOC 3 .Dt JEMALLOC 3
.Os .Os
.Sh NAME .Sh NAME
.Nm malloc , calloc , posix_memalign , realloc , free , malloc_usable_size @roff_tcache@.Nm @jemalloc_prefix@malloc , @jemalloc_prefix@calloc , @jemalloc_prefix@posix_memalign , @jemalloc_prefix@realloc , @jemalloc_prefix@free , @jemalloc_prefix@malloc_usable_size , @jemalloc_prefix@malloc_tcache_flush , @jemalloc_prefix@malloc_stats_print
@roff_no_tcache@.Nm @jemalloc_prefix@malloc , @jemalloc_prefix@calloc , @jemalloc_prefix@posix_memalign , @jemalloc_prefix@realloc , @jemalloc_prefix@free , @jemalloc_prefix@malloc_usable_size , @jemalloc_prefix@malloc_stats_print
.Nd general purpose memory allocation functions .Nd general purpose memory allocation functions
.Sh LIBRARY .Sh LIBRARY
.Lb libjemalloc .Lb libjemalloc
@ -63,6 +64,8 @@
.Fn @jemalloc_prefix@malloc_usable_size "const void *ptr" .Fn @jemalloc_prefix@malloc_usable_size "const void *ptr"
@roff_tcache@.Ft void @roff_tcache@.Ft void
@roff_tcache@.Fn @jemalloc_prefix@malloc_tcache_flush "void" @roff_tcache@.Fn @jemalloc_prefix@malloc_tcache_flush "void"
.Ft void
.Fn @jemalloc_prefix@malloc_stats_print "const char *opts"
.Ft const char * .Ft const char *
.Va @jemalloc_prefix@malloc_options ; .Va @jemalloc_prefix@malloc_options ;
.Ft void .Ft void
@ -173,6 +176,27 @@ implementation-dependent.
@roff_tcache@so it is possible for a thread that stops allocating/deallocating @roff_tcache@so it is possible for a thread that stops allocating/deallocating
@roff_tcache@to retain its cache indefinitely, in which case the developer may @roff_tcache@to retain its cache indefinitely, in which case the developer may
@roff_tcache@find this function useful. @roff_tcache@find this function useful.
.Pp
The
.Fn @jemalloc_prefix@malloc_stats_print
function prints human-readable summary statistics.
This function can be called repeatedly.
General information that never changes
during execution can be omitted by specifying
.Dq g
as a character within the
.Fa opts
string.
@roff_stats@Similarly,
@roff_stats@.Dq b
@roff_stats@and
@roff_stats@.Dq l
@roff_stats@can be specified to omit per size class statistics for bins and
@roff_stats@large objects, respectively.
Unrecognized characters are silently ignored.
@roff_tcache@Note that thread caching may prevent some statistics from being
@roff_tcache@completely up to date, since extra locking would be required to
@roff_tcache@merge counters that track thread cache operations.
.Sh TUNING .Sh TUNING
Once, when the first call is made to one of these memory allocation Once, when the first call is made to one of these memory allocation
routines, various flags will be set or reset, which affects the routines, various flags will be set or reset, which affects the
@ -249,7 +273,7 @@ will disable dirty page purging.
@roff_fill@negatively. @roff_fill@negatively.
.It K .It K
Double/halve the virtual memory chunk size. Double/halve the virtual memory chunk size.
The default chunk size is 16 MiB. The default chunk size is 4 MiB.
.It M .It M
Double/halve the size of the maximum medium size class. Double/halve the size of the maximum medium size class.
The valid range is from one page to one half chunk. The valid range is from one page to one half chunk.
@ -261,13 +285,17 @@ The default number of arenas is
@roff_no_tcache@four @roff_no_tcache@four
times the number of CPUs, or one if there is a single CPU. times the number of CPUs, or one if there is a single CPU.
.It P .It P
Various statistics are printed at program exit via an The
.Fn malloc_stats_print
function is called at program exit via an
.Xr atexit 3 .Xr atexit 3
function. function.
This has the potential to cause deadlock for a multi-threaded process that exits @roff_stats@This has the potential to cause deadlock for a multi-threaded
while one or more threads are executing in the memory allocation functions. @roff_stats@process that exits while one or more threads are executing in the
Therefore, this option should only be used with care; it is primarily intended @roff_stats@memory allocation functions.
as a performance tuning aid during application development. @roff_stats@Therefore, this option should only be used with care; it is
@roff_stats@primarily intended as a performance tuning aid during application
@roff_stats@development.
.It Q .It Q
Double/halve the size of the maximum size class that is a multiple of the Double/halve the size of the maximum size class that is a multiple of the
quantum (8 or 16 bytes, depending on architecture). quantum (8 or 16 bytes, depending on architecture).
@ -450,11 +478,11 @@ options and symbols for debugger support.
@roff_fill@.Dq J @roff_fill@.Dq J
@roff_fill@option may help provoke the problem. @roff_fill@option may help provoke the problem.
@roff_fill@.Pp @roff_fill@.Pp
@roff_stats@In truly difficult cases, the @roff_trace@In truly difficult cases, the
@roff_stats@.Dq U @roff_trace@.Dq T
@roff_stats@option can provide a detailed trace of all calls made to these @roff_trace@option can provide a detailed trace of all calls made to these
@roff_stats@functions. @roff_trace@functions.
@roff_stats@.Pp @roff_trace@.Pp
Unfortunately this implementation does not provide much detail about Unfortunately this implementation does not provide much detail about
the problems it detects; the performance impact for storing such information the problems it detects; the performance impact for storing such information
would be prohibitive. would be prohibitive.

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,10 @@ extern "C" {
#include "jemalloc_defs.h" #include "jemalloc_defs.h"
extern const char *malloc_options;
extern void (*malloc_message)(const char *p1,
const char *p2, const char *p3, const char *p4);
void *malloc(size_t size) JEMALLOC_ATTR(malloc); void *malloc(size_t size) JEMALLOC_ATTR(malloc);
void *calloc(size_t num, size_t size) JEMALLOC_ATTR(malloc); void *calloc(size_t num, size_t size) JEMALLOC_ATTR(malloc);
int posix_memalign(void **memptr, size_t alignment, size_t size) int posix_memalign(void **memptr, size_t alignment, size_t size)
@ -17,10 +21,7 @@ size_t malloc_usable_size(const void *ptr);
#ifdef JEMALLOC_TCACHE #ifdef JEMALLOC_TCACHE
void malloc_tcache_flush(void); void malloc_tcache_flush(void);
#endif #endif
void malloc_stats_print(const char *opts);
extern const char *malloc_options;
extern void (*malloc_message)(const char *p1,
const char *p2, const char *p3, const char *p4);
#ifdef __cplusplus #ifdef __cplusplus
}; };

View File

@ -26,6 +26,7 @@
#undef free #undef free
#undef malloc_usable_size #undef malloc_usable_size
#undef malloc_tcache_flush #undef malloc_tcache_flush
#undef malloc_stats_print
#undef malloc_options #undef malloc_options
#undef malloc_message #undef malloc_message
#endif #endif