• Fujii Masao's avatar
    Add function to log the memory contexts of specified backend process. · 43620e32
    Fujii Masao authored
    Commit 3e98c0ba added pg_backend_memory_contexts view to display
    the memory contexts of the backend process. However its target process
    is limited to the backend that is accessing to the view. So this is
    not so convenient when investigating the local memory bloat of other
    backend process. To improve this situation, this commit adds
    pg_log_backend_memory_contexts() function that requests to log
    the memory contexts of the specified backend process.
    
    This information can be also collected by calling
    MemoryContextStats(TopMemoryContext) via a debugger. But
    this technique cannot be used in some environments because no debugger
    is available there. So, pg_log_backend_memory_contexts() allows us to
    see the memory contexts of specified backend more easily.
    
    Only superusers are allowed to request to log the memory contexts
    because allowing any users to issue this request at an unbounded rate
    would cause lots of log messages and which can lead to denial of service.
    
    On receipt of the request, at the next CHECK_FOR_INTERRUPTS(),
    the target backend logs its memory contexts at LOG_SERVER_ONLY level,
    so that these memory contexts will appear in the server log but not
    be sent to the client. It logs one message per memory context.
    Because if it buffers all memory contexts into StringInfo to log them
    as one message, which may require the buffer to be enlarged very much
    and lead to OOM error since there can be a large number of memory
    contexts in a backend.
    
    When a backend process is consuming huge memory, logging all its
    memory contexts might overrun available disk space. To prevent this,
    now this patch limits the number of child contexts to log per parent
    to 100. As with MemoryContextStats(), it supposes that practical cases
    where the log 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.
    
    There was another proposed patch to add the function to return
    the memory contexts of specified backend as the result sets,
    instead of logging them, in the discussion. However that patch is
    not included in this commit because it had several issues to address.
    
    Thanks to Tatsuhito Kasahara, Andres Freund, Tom Lane, Tomas Vondra,
    Michael Paquier, Kyotaro Horiguchi and Zhihong Yu for the discussion.
    
    Bump catalog version.
    
    Author: Atsushi Torikoshi
    Reviewed-by: Kyotaro Horiguchi, Zhihong Yu, Fujii Masao
    Discussion: https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com
    43620e32
procsignal.c 20.8 KB