BUG/MINOR: activity: fix Delta_calls and Delta_bytes count
Thanks to the commit5714aff4a6
"DEBUG: pool: store the memprof bin on alloc() and update it on free()", the amount of memory allocations and memory "frees" is shown now on the same line, corresponded to the caller name. This is very convenient to debug memory leaks (haproxy should run with -dMcaller option). The implicit drawback of this solution is that we count twice same free_calls and same free_tot (bytes) values in cli_io_handler_show_profiling(), when we've calculed tot_free_calls and tot_free_bytes, by adding them to the these totalizators for p_alloc, malloc and calloc allocator types. See the details about why this happens in a such way in __pool_free() implementation and also in the commit message for5714aff4a6
. This double addition of free counters falses 'Delta_calls' and 'Delta_bytes', sometimes we even noticed that they show negative values. Same problem was with the calculation of average allocated buffer size for lines, where we show simultaneously the number of allocated and freed bytes.
This commit is contained in:
parent
decb7c90df
commit
d5e43caaf5
|
@ -803,8 +803,14 @@ static int cli_io_handler_show_profiling(struct appctx *appctx)
|
|||
else
|
||||
chunk_appendf(&trash, "[other]");
|
||||
|
||||
chunk_appendf(&trash," %s(%lld)", memprof_methods[entry->method],
|
||||
(long long)(entry->alloc_tot - entry->free_tot) / (long long)(entry->alloc_calls + entry->free_calls));
|
||||
if ((tmp_memstats[i].method != MEMPROF_METH_P_ALLOC) &&
|
||||
(tmp_memstats[i].method != MEMPROF_METH_MALLOC) &&
|
||||
(tmp_memstats[i].method != MEMPROF_METH_CALLOC)) {
|
||||
chunk_appendf(&trash," %s(%lld)", memprof_methods[entry->method],
|
||||
(long long)(entry->alloc_tot - entry->free_tot) / (long long)(entry->alloc_calls + entry->free_calls));
|
||||
} else
|
||||
chunk_appendf(&trash," %s(%lld)", memprof_methods[entry->method],
|
||||
(long long)(entry->alloc_tot) / (long long)(entry->alloc_calls));
|
||||
|
||||
if (entry->alloc_tot && entry->free_tot) {
|
||||
/* that's a realloc, show the total diff to help spot leaks */
|
||||
|
@ -829,9 +835,13 @@ static int cli_io_handler_show_profiling(struct appctx *appctx)
|
|||
tot_alloc_calls = tot_free_calls = tot_alloc_bytes = tot_free_bytes = 0;
|
||||
for (i = 0; i < max_lines; i++) {
|
||||
tot_alloc_calls += tmp_memstats[i].alloc_calls;
|
||||
tot_free_calls += tmp_memstats[i].free_calls;
|
||||
tot_alloc_bytes += tmp_memstats[i].alloc_tot;
|
||||
tot_free_bytes += tmp_memstats[i].free_tot;
|
||||
if ((tmp_memstats[i].method != MEMPROF_METH_P_ALLOC) &&
|
||||
(tmp_memstats[i].method != MEMPROF_METH_MALLOC) &&
|
||||
(tmp_memstats[i].method != MEMPROF_METH_CALLOC)) {
|
||||
tot_free_calls += tmp_memstats[i].free_calls;
|
||||
tot_free_bytes += tmp_memstats[i].free_tot;
|
||||
}
|
||||
}
|
||||
|
||||
chunk_appendf(&trash,
|
||||
|
|
Loading…
Reference in New Issue