summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2016-07-08 16:01:08 +0000
committerTom Lane2016-07-08 16:01:08 +0000
commit88cf37d2a86d5b66380003d7c3384530e3f91e40 (patch)
treeb9fe08c9dafee7259a62fdb505dd6841c9d09f64
parente8bde9e2538a25b4a5deea569c4c48244c1a7e40 (diff)
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: <CAM-w4HMwwcwaVvYcAH0_FGtG5GeXdYVRfvG81pXnSJWHnCfosQ@mail.gmail.com>
-rw-r--r--src/backend/storage/ipc/ipc.c47
1 files changed, 47 insertions, 0 deletions
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 <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
{
/*