From 88cf37d2a86d5b66380003d7c3384530e3f91e40 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Jul 2016 12:01:08 -0400 Subject: [PATCH] Add some temporary code to record stack usage at server process exit. This patch is meant to gather information from the buildfarm members, and will be reverted in a day or so. The idea is to try to find out the high-water stack consumption while running the regression tests, particularly on IA64 which is suspected to use much more stack than other architectures. On machines with pmap, we can use that; but the IA64 farm members are running HPUX, so also include some bespoke code for HPUX. (I've tested the latter on HPUX 10/HPPA; not entirely sure it will work on HPUX 11/IA64, but we'll soon find out.) Discussion: --- src/backend/storage/ipc/ipc.c | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index cc36b80699..b71d10ea8f 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -22,6 +22,10 @@ #include #include #include +#if defined(__hpux) +#include +#include +#endif #include "miscadmin.h" #ifdef PROFILE_PID_DIR @@ -80,6 +84,46 @@ static int on_proc_exit_index, before_shmem_exit_index; +/* Report process's stack consumption to stderr */ +static void +report_stack_size(void) +{ +#if defined(__hpux) + /* HPUX: examine process's memory map with pstat_getprocvm() */ + int targetpid = getpid(); + struct pst_vm_status buf; + int res; + int ndx; + + for (ndx = 0;; ndx++) + { + res = pstat_getprocvm(&buf, sizeof(buf), targetpid, ndx); + if (res < 0) + { + perror("getprocvm"); + break; + } + if (res != 1) + break; + if (buf.pst_type != PS_STACK) + continue; + fprintf(stderr, "%d: stack addr 0x%lx, length %ld, physical pages %ld\n", + targetpid, + buf.pst_vaddr, + buf.pst_length, + buf.pst_phys_pages); + } +#else /* non HPUX */ + /* Otherwise: try to use pmap. No error if that doesn't work. */ + char sysbuf[128]; + + snprintf(sysbuf, sizeof(sysbuf), "pmap -x %d | grep -i stack 1>&2", + (int) getpid()); + (void) system(sysbuf); +#endif +} + + /* ---------------------------------------------------------------- * proc_exit * @@ -101,6 +145,9 @@ proc_exit(int code) /* Clean up everything that must be cleaned up */ proc_exit_prepare(code); + /* report stack size to stderr */ + report_stack_size(); + #ifdef PROFILE_PID_DIR { /* -- 2.40.0