diff --git a/include/common/memory.h b/include/common/memory.h index 410c97ffc..2b7121b42 100644 --- a/include/common/memory.h +++ b/include/common/memory.h @@ -53,6 +53,7 @@ struct pool_head { unsigned int size; /* chunk size */ unsigned int flags; /* MEM_F_* */ unsigned int users; /* number of pools sharing this zone */ + unsigned int failed; /* failed allocations */ char name[12]; /* name of the pool */ }; @@ -94,6 +95,9 @@ struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags) */ void dump_pools_to_trash(); void dump_pools(void); +int pool_total_failures(); +unsigned long pool_total_allocated(); +unsigned long pool_total_used(); /* * This function frees whatever can be freed in pool . diff --git a/src/dumpstats.c b/src/dumpstats.c index b83dfb80b..67686d3d4 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -2672,6 +2672,9 @@ static int stats_dump_info_to_buffer(struct stream_interface *si) "Uptime: %dd %dh%02dm%02ds\n" "Uptime_sec: %d\n" "Memmax_MB: %d\n" + "PoolAlloc_MB: %d\n" + "PoolUsed_MB: %d\n" + "PoolFailed: %d\n" "Ulimit-n: %d\n" "Maxsock: %d\n" "Maxconn: %d\n" @@ -2724,6 +2727,9 @@ static int stats_dump_info_to_buffer(struct stream_interface *si) up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60), up, global.rlimit_memmax, + (int)(pool_total_allocated() / 1048576L), + (int)(pool_total_used() / 1048576L), + pool_total_failures(), global.rlimit_nofile, global.maxsock, global.maxconn, global.hardmaxconn, actconn, totalconn, global.req_count, diff --git a/src/memory.c b/src/memory.c index 691e1e34a..036f78607 100644 --- a/src/memory.c +++ b/src/memory.c @@ -103,6 +103,7 @@ void *pool_refill_alloc(struct pool_head *pool, unsigned int avail) ptr = MALLOC(pool->size + POOL_EXTRA); if (!ptr) { + pool->failed++; if (failed) return NULL; failed++; @@ -206,9 +207,9 @@ void dump_pools_to_trash() allocated = used = nbpools = 0; chunk_printf(&trash, "Dumping pools usage. Use SIGQUIT to flush them.\n"); list_for_each_entry(entry, &pools, list) { - chunk_appendf(&trash, " - Pool %s (%d bytes) : %d allocated (%u bytes), %d used, %d users%s\n", + chunk_appendf(&trash, " - Pool %s (%d bytes) : %d allocated (%u bytes), %d used, %d failures, %d users%s\n", entry->name, entry->size, entry->allocated, - entry->size * entry->allocated, entry->used, + entry->size * entry->allocated, entry->used, entry->failed, entry->users, (entry->flags & MEM_F_SHARED) ? " [SHARED]" : ""); allocated += entry->allocated * entry->size; @@ -226,6 +227,39 @@ void dump_pools(void) qfprintf(stderr, "%s", trash.str); } +/* This function returns the total number of failed pool allocations */ +int pool_total_failures() +{ + struct pool_head *entry; + int failed = 0; + + list_for_each_entry(entry, &pools, list) + failed += entry->failed; + return failed; +} + +/* This function returns the total amount of memory allocated in pools (in bytes) */ +unsigned long pool_total_allocated() +{ + struct pool_head *entry; + unsigned long allocated = 0; + + list_for_each_entry(entry, &pools, list) + allocated += entry->allocated * entry->size; + return allocated; +} + +/* This function returns the total amount of memory used in pools (in bytes) */ +unsigned long pool_total_used() +{ + struct pool_head *entry; + unsigned long used = 0; + + list_for_each_entry(entry, &pools, list) + used += entry->used * entry->size; + return used; +} + /* * Local variables: * c-indent-level: 8