From 88cf37d2a86d5b66380003d7c3384530e3f91e40 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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: <CAM-w4HMwwcwaVvYcAH0_FGtG5GeXdYVRfvG81pXnSJWHnCfosQ@mail.gmail.com>
---
 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 cc36b80699b..b71d10ea8f4 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
 	{
 		/*
-- 
GitLab