Add some temporary code to record stack usage at server process exit.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Jul 2016 16:01:08 +0000 (12:01 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Jul 2016 16:01:08 +0000 (12:01 -0400)
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: <CAM-w4HMwwcwaVvYcAH0_FGtG5GeXdYVRfvG81pXnSJWHnCfosQ@mail.gmail.com>

src/backend/storage/ipc/ipc.c

index cc36b80699b4997cd46baaaef49aa23b5bca3d24..b71d10ea8f4b365fe857534b6f0123cb59a0b11c 100644 (file)
 #include <signal.h>
 #include <unistd.h>
 #include <sys/stat.h>
+#if defined(__hpux)
+#include <sys/param.h>
+#include <sys/pstat.h>
+#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
    {
        /*