From ea9c4a16d5ad88a1d28d43ef458e3209b53eb106 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Fri, 8 Jul 2016 16:38:22 -0400 Subject: [PATCH] Add more temporary code to record stack usage at server process exit. After a look at preliminary results from commit 88cf37d2a86d5b66, I realized it'd be a good idea to spew out the maximum depth measurement seen by check_stack_depth. So add some quick-n-dirty code to do that. Like the previous commit, this will be reverted once we've gathered a set of buildfarm runs with it. --- src/backend/storage/ipc/ipc.c | 12 ++++++++++++ src/backend/tcop/postgres.c | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index b71d10ea8f4..1b349e12db0 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -35,6 +35,9 @@ #include "storage/ipc.h" #include "tcop/tcopprot.h" +extern long max_measured_stack_depth; +extern long max_measured_register_stack_depth; + /* * This flag is set during proc_exit() to change ereport()'s behavior, @@ -121,6 +124,15 @@ report_stack_size(void) (int) getpid()); (void) system(sysbuf); #endif + +#if defined(__ia64__) || defined(__ia64) + fprintf(stderr, "max measured stack depths %ldkB, %ldkB\n", + (max_measured_stack_depth + 1023) / 1024, + (max_measured_register_stack_depth + 1023) / 1024); +#else + fprintf(stderr, "max measured stack depth %ldkB\n", + (max_measured_stack_depth + 1023) / 1024); +#endif } diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index b185c1b5eb6..38cabf650a1 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -96,6 +96,9 @@ int max_stack_depth = 100; /* wait N seconds to allow attach from a debugger */ int PostAuthDelay = 0; +/* Exported for use by proc_exit */ +long max_measured_stack_depth = 0; +long max_measured_register_stack_depth = 0; /* ---------------- @@ -3137,6 +3140,11 @@ stack_is_too_deep(void) if (stack_depth < 0) stack_depth = -stack_depth; + /* Track max measured depth for reporting by proc_exit */ + if (stack_depth > max_measured_stack_depth && + stack_base_ptr != NULL) + max_measured_stack_depth = stack_depth; + /* * Trouble? * @@ -3160,6 +3168,10 @@ stack_is_too_deep(void) #if defined(__ia64__) || defined(__ia64) stack_depth = (long) (ia64_get_bsp() - register_stack_base_ptr); + if (stack_depth > max_measured_register_stack_depth && + register_stack_base_ptr != NULL) + max_measured_register_stack_depth = stack_depth; + if (stack_depth > max_stack_depth_bytes && register_stack_base_ptr != NULL) return true; -- GitLab