mirror of
https://github.com/postgres/postgres.git
synced 2025-11-28 11:44:57 +03:00
Limit the verbosity of memory context statistics dumps.
We had a report from Stefan Kaltenbrunner of a case in which postmaster log files overran available disk space because multiple backends spewed enormous context stats dumps upon hitting an out-of-memory condition. Given the lack of similar reports, this isn't a common problem, but it still seems worth doing something about. However, we don't want to just blindly truncate the output, because that might prevent diagnosis of OOM problems. What seems like a workable compromise is to limit the dump to 100 child contexts per parent, and summarize the space used within any additional child contexts. That should help because practical cases where the dump gets long will typically be huge numbers of siblings under the same parent context; while the additional debugging value from seeing details about individual siblings beyond 100 will not be large, we hope. Anyway it doesn't take much code or memory space to do this, so let's try it like this and see how things go. Since the summarization mechanism requires passing totals back up anyway, I took the opportunity to add a "grand total" line to the end of the printout.
This commit is contained in:
@@ -16,6 +16,24 @@
|
||||
|
||||
#include "nodes/nodes.h"
|
||||
|
||||
/*
|
||||
* MemoryContextCounters
|
||||
* Summarization state for MemoryContextStats collection.
|
||||
*
|
||||
* The set of counters in this struct is biased towards AllocSet; if we ever
|
||||
* add any context types that are based on fundamentally different approaches,
|
||||
* we might need more or different counters here. A possible API spec then
|
||||
* would be to print only nonzero counters, but for now we just summarize in
|
||||
* the format historically used by AllocSet.
|
||||
*/
|
||||
typedef struct MemoryContextCounters
|
||||
{
|
||||
Size nblocks; /* Total number of malloc blocks */
|
||||
Size freechunks; /* Total number of free chunks */
|
||||
Size totalspace; /* Total bytes requested from malloc */
|
||||
Size freespace; /* The unused portion of totalspace */
|
||||
} MemoryContextCounters;
|
||||
|
||||
/*
|
||||
* MemoryContext
|
||||
* A logical context in which memory allocations occur.
|
||||
@@ -44,7 +62,8 @@ typedef struct MemoryContextMethods
|
||||
void (*delete_context) (MemoryContext context);
|
||||
Size (*get_chunk_space) (MemoryContext context, void *pointer);
|
||||
bool (*is_empty) (MemoryContext context);
|
||||
void (*stats) (MemoryContext context, int level);
|
||||
void (*stats) (MemoryContext context, int level, bool print,
|
||||
MemoryContextCounters *totals);
|
||||
#ifdef MEMORY_CONTEXT_CHECKING
|
||||
void (*check) (MemoryContext context);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user