Re: Creating a function for exposing memory usage of backend process - Mailing list pgsql-hackers

From Andres Freund
Subject Re: Creating a function for exposing memory usage of backend process
Date
Msg-id 20200708170348.rsqry4b4k5mrsu7y@alap3.anarazel.de
Whole thread Raw
In response to Re: Creating a function for exposing memory usage of backend process  (torikoshia <torikoshia@oss.nttdata.com>)
Responses Re: Creating a function for exposing memory usage of backend process  (torikoshia <torikoshia@oss.nttdata.com>)
List pgsql-hackers
Hi,

I think this is an incredibly useful feature.


On 2020-07-07 22:02:10 +0900, torikoshia wrote:
> > There can be multiple memory contexts with the same name. So I'm afraid
> > that it's difficult to identify the actual parent memory context from
> > this
> > "parent" column. This is ok when logging memory contexts by calling
> > MemoryContextStats() via gdb. Because child memory contexts are printed
> > just under their parent, with indents. But this doesn't work in the
> > view.
> > To identify the actual parent memory or calculate the memory contexts
> > tree
> > from the view, we might need to assign unique ID to each memory context
> > and display it. But IMO this is overkill. So I'm fine with current
> > "parent"
> > column. Thought? Do you have any better idea?
> 
> Indeed.
> I also feel it's not usual to assign a unique ID, which
> can vary every time the view displayed.

Hm. I wonder if we just could include the address of the context
itself. There might be reasons not to do so (e.g. security concerns
about leaked pointers making attacks easier), but I think it's worth
considering.


> We show each context using a recursive function and this is
> a kind of depth-first search. So, as far as I understand,
> we can identify its parent using both the "parent" column
> and the order of the rows.
> 
> Documenting these things may worth for who want to identify
> the relation between parents and children.
> 
> Of course, in the relational model, the order of relation
> does not have meaning so it's also unusual in this sense..

It makes it pretty hard to write summarizing queries, so I am not a huge
fan of just relying on the order.


> +/*
> + * PutMemoryContextsStatsTupleStore
> + *        One recursion level for pg_get_backend_memory_contexts.
> + */
> +static void
> +PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore,
> +                                TupleDesc tupdesc, MemoryContext context,
> +                                MemoryContext parent, int level)
> +{
> +#define PG_GET_BACKEND_MEMORY_CONTEXTS_COLS    9
> +    Datum        values[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS];
> +    bool        nulls[PG_GET_BACKEND_MEMORY_CONTEXTS_COLS];
> +    MemoryContextCounters stat;
> +    MemoryContext child;
> +    const char *name = context->name;
> +    const char *ident = context->ident;
> +
> +    if (context == NULL)
> +        return;
> +
> +    /*
> +     * To be consistent with logging output, we label dynahash contexts
> +     * with just the hash table name as with MemoryContextStatsPrint().
> +     */
> +    if (ident && strcmp(name, "dynahash") == 0)
> +    {
> +        name = ident;
> +        ident = NULL;
> +    }
> +
> +    /* Examine the context itself */
> +    memset(&stat, 0, sizeof(stat));
> +    (*context->methods->stats) (context, NULL, (void *) &level, &stat);
> +
> +    memset(values, 0, sizeof(values));
> +    memset(nulls, 0, sizeof(nulls));
> +
> +    values[0] = CStringGetTextDatum(name);
> +
> +    if (ident)
> +    {
> +        int        idlen = strlen(ident);
> +        char        clipped_ident[MEMORY_CONTEXT_IDENT_DISPLAY_SIZE];
> +
> +        /*
> +         * Some identifiers such as SQL query string can be very long,
> +         * truncate oversize identifiers.
> +         */
> +        if (idlen >= MEMORY_CONTEXT_IDENT_DISPLAY_SIZE)
> +            idlen = pg_mbcliplen(ident, idlen, MEMORY_CONTEXT_IDENT_DISPLAY_SIZE - 1);
> +

Why?

Greetings,

Andres Freund



pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: Hybrid Hash/Nested Loop joins and caching results from subplans
Next
From: Andrew Dunstan
Date:
Subject: Re: TAP tests and symlinks on Windows